Frappe MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FRAPPE_URL | Yes | Base URL of your Frappe site (e.g. https://erp.example.com) | |
| FRAPPE_API_KEY | Yes | Frappe API key | |
| FRAPPE_TIMEOUT | No | Request timeout in seconds (default: 30) | 30 |
| FRAPPE_API_SECRET | Yes | Frappe API secret | |
| FRAPPE_VERIFY_SSL | No | Set to false to skip TLS verification (default: true) | true |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| frappe_pingA | Check connectivity and credentials against the configured Frappe/ERPNext site. Use first when another tool fails, to tell a network or credential problem apart from a bad doctype or document name. This is a diagnostic, not a data tool — it never reads or writes documents. Behavior: read-only and idempotent, with no side effects. A pong proves the site is reachable and that FRAPPE_API_KEY/FRAPPE_API_SECRET authenticate; it does not prove the API user has permission for any particular DocType. Failure surfaces as a connection error (site unreachable, wrong URL, TLS problem) or an auth error (bad key or secret). Parameters: none by design — the target site and credentials come from the server's own environment, never from the caller, so this tool cannot be aimed at a different host. Returns: {"message": "pong"}. |
| frappe_get_docA | Retrieve one complete document (a single DocType record) by its exact doctype and document name.
Use when the document's name is already known, such as 'SINV-00001'. Use frappe_search_docs instead to find documents by field value, to fetch many records, or to return only a few fields; use frappe_run_method for values that are computed rather than stored on the document.
Behavior: read-only and idempotent, with no side effects. Returns the document in whatever state it is stored — draft, submitted or cancelled — without filtering. Results respect the API user's role permissions: a document that exists but is not permitted raises a permission error, while an unknown doctype or name raises a not-found error.
Parameters: doctype and name are both case-sensitive and must match Frappe exactly. |
| frappe_search_docsA | Search or list documents of one DocType, with optional filters, field selection, ordering and pagination.
Use to find documents by field value or to browse a DocType. Use frappe_get_doc instead when the exact document name is known and every field is wanted; use frappe_run_method for aggregates, totals or report output, which this tool cannot compute.
Behavior: read-only and idempotent, with no side effects. Only documents the API user's role permissions allow are returned, so a short result may mean restricted access rather than no matches. An unknown doctype raises a not-found error, and an unknown fieldname in |
| frappe_create_docA | Create a new document of the given DocType from the supplied field values.
Use to insert a record that does not yet exist. Use frappe_update_doc instead to change a record that already exists — this tool never updates in place, so re-running it creates a second, separately named document.
Behavior: writes to the site and is NOT idempotent. The document is inserted as a draft (docstatus 0) and is not submitted, so submittable DocTypes such as Sales Invoice still need a submit step via frappe_run_method. Frappe assigns the name from the DocType's naming series, so the name is unknown until this call returns. Server-side validation, mandatory-field checks and DocType hooks all run on insert; a missing mandatory field or an invalid Link value raises a Frappe error and nothing is created. Requires create permission on the DocType.
Parameters: |
| frappe_update_docA | Update selected fields of an existing document, identified by its doctype and name.
Use for partial edits: only the keys present in |
| frappe_delete_docA | Permanently delete a document by its doctype and name.
Use only for genuinely disposable records such as ToDo or Note, or for a test document created moments earlier — the deletion is irreversible, with no undo and no recycle bin. Prefer frappe_update_doc to set a status such as 'Cancelled' whenever an audit trail matters, which covers most transactional records (Sales Invoice, Sales Order, Payment Entry, Journal Entry).
Behavior: writes to the site. Not idempotent from the caller's point of view — a second call for the same name raises a not-found error. Frappe refuses the delete while other documents link to this one, so a link-exists error means the dependants must be handled first. Deleting a parent removes its child-table rows with it. Submitted documents must be cancelled before they can be deleted. Requires delete permission on the DocType.
Parameters: |
| frappe_run_methodA | Call a whitelisted server-side Python method on the Frappe site.
Use as the escape hatch for anything the CRUD tools cannot express — submitting or cancelling documents, running reports, computing stock balances, or invoking a custom app's API. Use frappe_get_doc, frappe_search_docs, frappe_create_doc or frappe_update_doc for ordinary record work: they validate their arguments and describe their effects, whereas this tool cannot.
Behavior: the effect is determined entirely by the method named and may read, write, delete or enqueue background jobs, so treat every call as potentially destructive and non-idempotent unless the method is known to be safe. The target must be decorated with @frappe.whitelist(); anything else raises a permission error, as does a method whose own permission checks reject the API user. Calls run synchronously and are subject to the server's request timeout (FRAPPE_TIMEOUT, 30s by default).
Parameters: |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 7 tools
Each tool targets a clearly distinct action: ping, get, search, create, update, delete, and an explicit escape-hatch method call. The descriptions actively disambiguate overlapping cases, such as get vs search, create vs update, and delete vs update-to-cancelled. No two tools appear interchangeable.
All tools use the same frappe_ prefix followed by a snake_case verb or verb_noun pattern: frappe_get_doc, frappe_search_docs, frappe_create_doc, etc. The convention is predictable throughout, including the diagnostic frappe_ping and escape hatch frappe_run_method.
Seven tools is well-scoped for a Frappe/ERPNext CRUD surface: five document lifecycle operations, one connectivity diagnostic, and one server-method escape hatch. Each tool earns its place without obvious redundancy.
Core CRUD coverage is complete: create, get, search, update, and delete, plus ping and run_method for submit/cancel/report operations. Minor gaps exist around explicit metadata/schema discovery and bulk operations, but the escape hatch lets agents work around them.