Introducing "frappectl"

I’ve been working on and off on frappe-cli. This is a CLI tool to access any frappe site and do anything on the user’s behalf. The idea is simple: LLM models are capable enough and don’t nearly need as much instruction to automate things. Just let them discover schema and endpoints.

The CLI follows basic principles:

  • gh like <noun> <verb> pattern.
  • Self-discovery for agents using --help, guide and schema exploration using doctype list/ doctype <show>.
  • No explicit instructions for anything else. No tool definitions, nothing. Frappe framework is already in training data of LLMs :person_shrugging:
  • Specify a local skill file for anything complex like end-to-end ticket handling workflow.

The interface is very basic and wraps REST API v2.

Command What it does
frappe-cli doc list <DocType> List documents. -f filters, --fields, --limit, --all.
frappe-cli doc get <DocType> <name> Fetch one document.
frappe-cli doc create <DocType> Create from --set scalars and/or piped/--input JSON.
frappe-cli doc update <DocType> <name> Update; optimistic by default, --force to override.
frappe-cli doc delete <DocType> <name> Delete (confirms / --yes).
frappe-cli doc submit|cancel|amend Document lifecycle.
frappe-cli doctype list / frappe-cli doctype show <name> Introspection / meta.
frappe-cli report run <name> Run a report with the same filter UX as list.
frappe-cli file upload|download Files, with --doctype/--name attach and --private.
frappe-cli api <path> Raw v2 access: frappe-cli api method/<path> -F key=value.
frappe-cli guide Print a short, self-contained usage primer (no site/auth needed).

This mostly works… to prove it, here is the most generic workflow automation that you see in “AI integration” demos → Submitting expense claims:

❯  Use `frappe-cli` to access frappe.io and create expense claim for me for     
  openai subscription. Invoice is present in this folder.                       

● I'll start by exploring the folder for the invoice and checking out the
  frappe-cli tool.

  Ran 1 shell command (ctrl+o to expand)

● I found the invoice (openapi-july-26.pdf). Let me read it and check the CLI's
  guide and auth status.

  Read 1 file, ran 1 shell command (ctrl+o to expand)

● Invoice details captured:
  - Invoice: Z3U*****-*****, dated July 5, 2026
  - Description: ChatGPT Pro Subscription (per seat), Jul 5–Aug 5, 2026
  - Total: ₹10,699.00 (₹9,066.95 + ₹1,632.05 IGST 18%)

  Let me confirm auth and inspect the Expense Claim DocType.

  Ran 2 shell commands (ctrl+o to expand)

● Authenticated on frappe.io. Let me find my Employee record and inspect the
  child table + remaining required fields.

  Ran 3 shell commands (ctrl+o to expand)

● Employee: EMP/00***, Frappe Technologies Private Limited. Now let me find the
  appropriate Expense Claim Type and the taxes child table structure.

  Ran 2 shell commands (ctrl+o to expand)

● There's an "LLM Subscription" expense type — a perfect match. Let me check how
  previous LLM Subscription / similar claims were filed to mirror the
  established pattern (especially the GST tax handling).

  Ran 1 shell command (ctrl+o to expand)

● The user's own pattern is consistent: no separate tax line — full amount
  claimed as a single expense line. Let me examine the most recent claim in
  detail to mirror its structure exactly.

  Ran 1 shell command (ctrl+o to expand)

● I have the full pattern. Let me check the "LLM Subscription" expense type's
  default account for this company.

  Ran 1 shell command (ctrl+o to expand)

● I have everything needed. I'll create the Expense Claim as a draft (mirroring
  the user's established pattern: full amount ₹10,699 as a single line, no
  separate tax breakout), then attach the invoice PDF. Leaving it as draft so
  you can review before submitting.

● Write(/tmp/claude-1000/-home-ankush-scratchpad/e5b900df-61f1-40f1-bde0-11f45cb
       65ec0/scratchpad/expense_claim.json)
  ⎿  Wrote 23 lines (ctrl+o to expand)

  Ran 1 shell command (ctrl+o to expand)

● Draft EXP0**** created (₹10,699.00). Now let me attach the invoice PDF.

  Ran 1 shell command (ctrl+o to expand)

● Done. Created the expense claim on frappe.io and attached the invoice.

What else you can do:

  • Reproduce bug described in this ticket #xyz.
  • I was away for a week; summarize last week’s gameplan post.

Roadmap:

Try it out using:

uv tool install git+https://github.com/frappe/frappe-cli # recommended
# or: pip install git+https://github.com/frappe/frappe-cli
13 Likes

Frappe assistant as a 50-line bash wrapper around pi and frappe-cli dotfiles/bin/barista at master · ankush/dotfiles · GitHub

This project is now renamed to frappectl (Akin to systemctl)

You can directly install from pypi using uv now.

uv tool install frappectl. (uninstall older version uv tool uninstall frappe-cli)

New features since announcement:

  • Read-only site profiles.
  • Specifying description for sites so agents can pick up site without specifying. e.g. update XYZ on ERP
  • frappectl assistant wrapper for using frappectl with coding agents.
  • API endpoint discovery for both RPC and controller methods (only works on develop branch for now)
  • OAuth login (works on develop branch for now)
  • Automatic update checks and passive notifications.
3 Likes