Frappe MCP Server
This MCP server enables seamless interaction with any Frappe/ERPNext site via its REST API, allowing you to manage documents and invoke server-side methods from MCP-compatible clients. It uses API key/secret for secure token-based authentication.
Check Connectivity (
frappe_ping): Verify the connection to the configured Frappe/ERPNext site.Retrieve Documents (
frappe_get_doc): Fetch a single document by specifying its DocType (e.g.,Sales Invoice,Customer) and name/ID.Search & List Documents (
frappe_search_docs): Search or list documents of any DocType with support for filters, field selection, pagination, and custom ordering.Create Documents (
frappe_create_doc): Create a new document of any DocType by providing the required field values.Update Documents (
frappe_update_doc): Modify an existing document by specifying its DocType, name/ID, and the fields to update.Delete Documents (
frappe_delete_doc): Permanently delete a document by its DocType and name/ID.Run Server-Side Methods (
frappe_run_method): Invoke any whitelisted Python method on the Frappe server using its dotted path (e.g.,frappe.auth.get_logged_user), with optional keyword arguments.
Enables management of ERPNext site data through the Frappe REST API, including document creation, retrieval, update, deletion, and remote method calls.
Allows interaction with a Frappe Framework site via REST API, providing CRUD operations on documents, full-text search, filtered document search, and invocation of server-side methods.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Frappe MCP ServerShow me the latest 10 sales orders"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Frappe MCP Server
mcp-name: io.github.muthanii/frappe_mcpA Model Context Protocol (MCP) server for Frappe Framework. Connect Claude Desktop, VS Code Copilot, and other MCP clients to any Frappe/ERPNext site via its REST API.
Where to get it
Distribution | Reference | Page |
PyPI |
| |
Docker Hub |
| |
GitHub Container Registry |
| |
MCP Registry |
| |
Glama | — | |
Source | — |
Related MCP server: frappe-api-mcp
Features
Document CRUD — get, create, update, delete Frappe doctypes
Search — full-text and filtered document search
Remote method calls — invoke any server-side Python method
Authentication — API key + secret (token-based auth)
Docker-first — single
docker runcommand, no Python install needed
Quick start
With uvx (no install):
FRAPPE_URL=https://your-site.com \
FRAPPE_API_KEY=your-api-key \
FRAPPE_API_SECRET=your-api-secret \
uvx frappe-mcp-serverWith pip:
pip install frappe-mcp-server
frappe-mcp-serverWith Docker (Docker Hub):
docker run -i --rm \
-e FRAPPE_URL=https://your-site.com \
-e FRAPPE_API_KEY=your-api-key \
-e FRAPPE_API_SECRET=your-api-secret \
muthanii/frappe-mcpWith Docker (GHCR):
docker run -i --rm \
-e FRAPPE_URL=https://your-site.com \
-e FRAPPE_API_KEY=your-api-key \
-e FRAPPE_API_SECRET=your-api-secret \
ghcr.io/muthanii/frappe-mcpAvailable tools
Every tool ships MCP tool annotations and a declared outputSchema, so a client can tell read tools from destructive ones before calling them.
Tool | Description | Access | Destructive | Idempotent |
| Check connectivity and credentials | read-only | no | yes |
| Retrieve a single document by doctype + name | read-only | no | yes |
| Search/list documents with filters | read-only | no | yes |
| Create a new document | write | no | no |
| Update an existing document | write | yes | yes |
| Delete a document — irreversible | write | yes | no |
| Call a whitelisted server-side method | write | yes | no |
frappe_run_method is marked destructive because its effect is determined entirely by the method you name.
Configuration
Environment variable | Required | Description |
| Yes | Base URL of your Frappe site (e.g. |
| Yes | Frappe API key |
| Yes | Frappe API secret |
| No | Set to |
| No | Request timeout in seconds (default: |
MCP client config
Add this to your claude_desktop_config.json or Copilot config.
Via uvx:
{
"mcpServers": {
"frappe": {
"command": "uvx",
"args": ["frappe-mcp-server"],
"env": {
"FRAPPE_URL": "https://your-site.com",
"FRAPPE_API_KEY": "your-api-key",
"FRAPPE_API_SECRET": "your-api-secret"
}
}
}
}Via Docker:
{
"mcpServers": {
"frappe": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "FRAPPE_URL",
"-e", "FRAPPE_API_KEY",
"-e", "FRAPPE_API_SECRET",
"muthanii/frappe-mcp"
],
"env": {
"FRAPPE_URL": "https://your-site.com",
"FRAPPE_API_KEY": "your-api-key",
"FRAPPE_API_SECRET": "your-api-secret"
}
}
}
}Local development
pip install -e .
frappe-mcpLicense
MIT — see LICENSE.
Available Tools
7 toolsfrappe_create_docA
Create a new document of the specified DocType with the provided field values. The data object should contain field names as keys and their respective values. Frappe auto-generates document names (via naming series) for new records. Returns the created document including its system-assigned name and all field values.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Key-value pairs of document field values to set. Keys are field names (e.g. 'customer_name', 'email_id', 'status', 'items'), values are the field values. For child table fields, provide a list of dicts. Must include at least all mandatory fields required by the target DocType. | |
| doctype | Yes | The target DocType name for the new document (e.g. 'Customer', 'Sales Invoice', 'Item', 'ToDo', 'Contact', 'Address'). Must be a valid DocType that exists on the target Frappe site. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that Frappe auto-generates document names and that the created document is returned with its name and field values. This goes beyond just the schema by explaining system behavior, though it omits potential error conditions or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, front-loading the core purpose and then providing key details. It is efficient and free of extraneous information, though a slightly more structured breakdown could further aid readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 parameters, no output schema), the description covers essential aspects: purpose, parameter usage (data object), auto-naming, and return value. It is sufficient for an agent to understand and invoke the tool, though it could benefit from clarifying error scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds minimal new meaning beyond the schema (e.g., reiterating that data should contain field names and values, and that mandatory fields are required). It does not significantly enhance the schema's existing parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Create a new document of the specified DocType with the provided field values.' It uses a specific verb ('create') and identifies the resource ('document'), and the context of sibling tools (frappe_delete_doc, frappe_get_doc, etc.) reinforces the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly indicates when to use the tool (when a new document needs to be created), but it does not explicitly provide alternatives or conditions when not to use it. However, the sibling tools offer clear alternatives for other operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
frappe_delete_docA
Permanently delete a document by its doctype and name. This action is irreversible — the document and all its associated data are removed from the system. Use with caution. For audit purposes, consider updating the document status to 'Cancelled' instead where applicable (e.g., for Sales Invoices, Sales Orders).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The unique document name or ID to permanently remove from the system (e.g. 'TODO-00001', 'NOTE-00001'). This operation cannot be undone. | |
| doctype | Yes | The DocType of the document to delete (e.g. 'ToDo', 'Note', 'Contact', 'Address'). WARNING: Deleting transactional or parent documents may affect or orphan linked child records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; the description fully discloses behavioral traits: irreversible deletion, removal of associated data, and potential orphaning of child records. This meets the full burden of transparency for a deletion tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states the action, second adds caution and alternative. Every sentence adds value, no fluff. Front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, no output schema), the description covers all essential aspects: purpose, irreversibility, side effects, caution, and alternative. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with detailed descriptions, examples, and warnings. The tool description repeats the irreversible nature but does not add new parameter-specific meaning beyond the schema, justifying a baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Permanently delete a document' with the specific criteria (doctype and name). It clearly differentiates from sibling tools like create, update, search, etc., which serve distinct purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use with caution' and suggests an alternative ('consider updating the document status to Cancelled instead') for cases where audit is needed, with specific examples (Sales Invoices, Sales Orders).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
frappe_get_docA
Retrieve a single document (doctype record) by its doctype and document name. Returns all fields and values of the document. Common use cases: fetch a Sales Invoice by its number, get Customer details, load an Item record, or retrieve any saved document by its unique name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The unique document name or ID to retrieve (e.g. 'SINV-00001', 'CUST-00001', 'ITEM-00001', 'Administrator'). This is typically the `name` field shown in the Frappe list view or document form. | |
| doctype | Yes | The target DocType name (e.g. 'Sales Invoice', 'Customer', 'Item', 'Sales Order', 'Purchase Order', 'User'). Case-sensitive and must match the DocType exactly as defined in Frappe. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description implies a safe read operation by stating 'retrieve' and 'returns all fields and values', but it does not explicitly declare it as non-destructive or mention any behavioral traits like permissions or limitations. With no annotations provided, additional transparency about idempotency or data safety would improve score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: purpose, return value, and common use cases. No redundant or unnecessary information. Front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the basic functionality and return value. However, it does not address whether it retrieves draft or submitted documents, or any access restrictions. For a straightforward read tool, this is mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3. The tool description reiterates the parameters (doctype and name) but does not add substantial new semantic information beyond what the schema already provides via descriptions and examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly uses the verb 'retrieve' and specifies the resource as 'a single document (doctype record)' by its doctype and name. It provides common use cases like fetching a Sales Invoice, Customer, Item, etc., which clearly differentiates it from sibling tools like frappe_delete_doc or frappe_search_docs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lists common use cases (fetch specific document) but does not explicitly contrast with siblings like frappe_search_docs for bulk retrieval or frappe_create_doc for creation. It implies usage for single document retrieval but lacks guidance on when to avoid this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
frappe_pingA
Check connectivity to the configured Frappe/ERPNext site. Returns a pong response confirming the server is reachable, authenticated, and responsive. Use this as a health-check before making other calls to verify the connection is working.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it checks reachability, authentication, and responsiveness. Without annotations, the description carries the burden and adequately describes the tool's behavior. However, it does not detail the pong response format or potential error conditions, which would enhance transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loading the main action. Every sentence adds value: purpose, detail, and usage guidance. No wasted words, appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and no output schema, the description covers essential aspects: purpose, outcome, and usage advice. Lacks potential failure case details (e.g., network errors) but is sufficient for a simple health-check tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so the description does not need to add param semantics. The schema is fully covered with no properties. The baseline for 0 parameters is 4, and the description adds no unnecessary info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks connectivity to a Frappe/ERPNext site and returns a pong response. It distinguishes itself from sibling CRUD and method execution tools by being a dedicated health-check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using this as a health-check before making other calls, providing clear when-to-use guidance. The recommendation to verify connection before other operations is direct and helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
frappe_run_methodA
Call a whitelisted server-side Python method on the Frappe site remotely. Use this for operations not covered by the standard CRUD tools — such as getting the logged user, computing stock balances, running reports, triggering workflows, or invoking custom API methods. The target method must be decorated with @frappe.whitelist() on the server.
| Name | Required | Description | Default |
|---|---|---|---|
| kwargs | No | Optional dictionary of keyword arguments to pass to the remote method. The keys and expected values depend entirely on the specific method being called. Example for stock balance: {'item_code': 'ITEM-001', 'warehouse': 'Stores - W'}. Defaults to an empty dict when omitted. | |
| method | Yes | Dotted Python path to the whitelisted method to call. Examples: 'frappe.auth.get_logged_user', 'frappe.utils.get_stock_balance', 'erpnext.stock.utils.get_stock_balance', or any custom whitelisted method from your Frappe app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the requirement that the method must be @frappe.whitelist() and mentions triggering workflows. However, it does not explicitly warn about potential destructive actions or side effects beyond workflow triggers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured, and front-loaded: it starts with the core action, then gives usage context, and ends with parameter details. Every sentence serves a purpose with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers purpose, usage, parameters, and a key requirement. It lacks information on return value format (though it varies by method) and error behavior, but is still fairly complete for a generic method caller.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds significant value: it provides multiple method examples, explains the kwargs parameter with examples, and clarifies default behavior. This goes well beyond the schema's field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool's purpose: 'Call a whitelisted server-side Python method on the Frappe site remotely.' It lists specific operations like getting the logged user, computing stock balances, etc., which clearly distinguishes it from sibling CRUD tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description instructs to use this tool for operations not covered by standard CRUD tools, provides concrete examples, and implicitly advises against using it for basic CRUD (handled by siblings like frappe_create_doc). This is explicit and helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
frappe_search_docsA
Search or list documents of a given DocType with optional filters, field selection, pagination (default 20, max 200), and ordering. Returns a paginated list of matching documents. Use filters to narrow results by status, date range, amount, or any document field.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default: 20, maximum: 200). Use for pagination. Frappe caps results at 200 per request. | |
| fields | No | Optional list of field names to return. Limits the response to only the specified fields for efficiency. Example: ['name', 'status', 'grand_total', 'posting_date']. When omitted, all fields are returned. | |
| doctype | Yes | The DocType to search within (e.g. 'Sales Invoice', 'Customer', 'Item', 'ToDo', 'Contact'). This parameter is required. | |
| filters | No | Optional list of filter conditions. Each filter is a triple [field, operator, value]. Supported operators: =, !=, >, <, >=, <=, like, not like, in, not in, between. Example: [['status','=','Open'], ['grand_total','>','1000']]. | |
| order_by | No | Field to sort by with direction. Format: 'fieldname direction'. Examples: 'creation desc' (newest first), 'modified asc' (oldest updated first), 'name asc' (alphabetical). Default ordering is by creation date descending. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full burden. It discloses pagination (default 20, max 200), ordering, and filter capabilities. It implies the tool is read-only (returns documents) but does not explicitly state non-destructiveness. However, the context of sibling tools makes this clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each carrying essential information: purpose with features, return type, and usage hint. No redundant phrases; all content is valuable and efficiently communicated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains it returns a paginated list of matching documents, which is sufficient for basic usage. It could mention response structure (e.g., fields returned by default), but overall adequate for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so a baseline of 3 is appropriate. The description adds marginal value by mentioning 'status, date range, amount' as filter examples, but these are already covered by schema examples. No additional semantic details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches or lists documents of a given DocType with optional filters, field selection, pagination, and ordering. It explicitly distinguishes the tool from sibling tools like get_doc (single document retrieval) and create/update/delete operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives such as get_doc, run_method, or when not to use it. It implies usage for listing/searching but lacks explicit guidance on exclusion criteria or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
frappe_update_docA
Update specific fields of an existing document identified by its doctype and name. Only the fields provided in the data object are modified; all other fields remain unchanged. Returns the updated document with all current values. Use for changing status, updating contact information, modifying amounts, or adjusting any document field.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Dictionary of field names and their new values. Only the fields included here are modified; other fields retain their current values. Example: {'status': 'Cancelled', 'remarks': 'Cancelled per customer request'}. | |
| name | Yes | The unique document name or ID of the existing document to modify (e.g. 'SINV-00001', 'CUST-00001', 'ITEM-00001'). | |
| doctype | Yes | The DocType of the document to update (e.g. 'Sales Invoice', 'Customer', 'Item', 'Sales Order'). Must match the doctype of the existing document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description clearly discloses that only provided fields are modified and returns the full updated document. It does not mention authentication, idempotency, or potential side effects, but the partial update behavior is well explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: first defines purpose, second explains partial update, third lists use cases. No wasted words, front-loaded, and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explicitly states the return value (updated document with all current values). Parameter documentation is thorough, and the tool's behavior is fully explained for its use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions and examples. The description reinforces that only provided fields are modified, adding behavioral context beyond the schema. This adds meaningful guidance for agents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates specific fields of an existing document, distinguishing it from sibling tools like create and delete. The verb 'update' and resource 'document' are explicit, and the partial-update behavior is highlighted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lists explicit use cases ('changing status, updating contact information, modifying amounts') and implies it's for updates, not creation or deletion. It does not explicitly state when not to use, but the context from siblings is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
6 tool updates
v1.1.0- Changed
frappe_create_doc4 fields changed- changed
Input schema / properties / data / descriptionPrevious value: -"Key-value pairs of fields and their values."New value: +"Key-value pairs of document field values to set. Keys are field names (e.g. 'customer_name', 'email_id', 'status', 'items'), values are the field values. For child table fields, provide a list of dicts. Must include at least all mandatory fields required by the target DocType." - added
Input schema / properties / data / examplesAdded value: +[ + { + "customer_name": "Acme Corp", + "customer_type": "Company", + "email_id": "billing@acme.com" + }, + { + "priority": "Medium", + "status": "Open", + "subject": "Review contract" + } +] - changed
Input schema / properties / doctype / descriptionPrevious value: -"The DocType to create."New value: +"The target DocType name for the new document (e.g. 'Customer', 'Sales Invoice', 'Item', 'ToDo', 'Contact', 'Address'). Must be a valid DocType that exists on the target Frappe site." - added
Input schema / properties / doctype / examplesAdded value: +[ + "Customer", + "Sales Invoice", + "ToDo", + "Contact" +]
- Changed
frappe_delete_doc4 fields changed- changed
Input schema / properties / doctype / descriptionPrevious value: -"The DocType of the document to delete."New value: +"The DocType of the document to delete (e.g. 'ToDo', 'Note', 'Contact', 'Address'). WARNING: Deleting transactional or parent documents may affect or orphan linked child records." - added
Input schema / properties / doctype / examplesAdded value: +[ + "ToDo", + "Note", + "Contact" +] - changed
Input schema / properties / name / descriptionPrevious value: -"The document name/ID to delete."New value: +"The unique document name or ID to permanently remove from the system (e.g. 'TODO-00001', 'NOTE-00001'). This operation cannot be undone." - added
Input schema / properties / name / examplesAdded value: +[ + "TODO-00001", + "NOTE-00001" +]
- Changed
frappe_get_doc4 fields changed- changed
Input schema / properties / doctype / descriptionPrevious value: -"The DocType (e.g. 'Sales Invoice', 'Customer', 'Item')."New value: +"The target DocType name (e.g. 'Sales Invoice', 'Customer', 'Item', 'Sales Order', 'Purchase Order', 'User'). Case-sensitive and must match the DocType exactly as defined in Frappe." - added
Input schema / properties / doctype / examplesAdded value: +[ + "Sales Invoice", + "Customer", + "Item", + "User" +] - changed
Input schema / properties / name / descriptionPrevious value: -"The document name/ID (e.g. 'SINV-00001', 'CUST-001')."New value: +"The unique document name or ID to retrieve (e.g. 'SINV-00001', 'CUST-00001', 'ITEM-00001', 'Administrator'). This is typically the `name` field shown in the Frappe list view or document form." - added
Input schema / properties / name / examplesAdded value: +[ + "SINV-00001", + "CUST-00001", + "Administrator" +]
- Changed
frappe_run_method4 fields changed- changed
Input schema / properties / kwargs / descriptionPrevious value: -"Keyword arguments to pass to the method."New value: +"Optional dictionary of keyword arguments to pass to the remote method. The keys and expected values depend entirely on the specific method being called. Example for stock balance: {'item_code': 'ITEM-001', 'warehouse': 'Stores - W'}. Defaults to an empty dict when omitted." - added
Input schema / properties / kwargs / examplesAdded value: +[ + { + "item_code": "ITEM-001", + "warehouse": "Stores - W" + }, + { + "from_date": "2025-01-01", + "to_date": "2025-12-31" + } +] - changed
Input schema / properties / method / descriptionPrevious value: -"Dotted path to the method (e.g. 'frappe.auth.get_logged_user' or 'erpnext.stock.utils.get_stock_balance')."New value: +"Dotted Python path to the whitelisted method to call. Examples: 'frappe.auth.get_logged_user', 'frappe.utils.get_stock_balance', 'erpnext.stock.utils.get_stock_balance', or any custom whitelisted method from your Frappe app." - added
Input schema / properties / method / examplesAdded value: +[ + "frappe.auth.get_logged_user", + "frappe.utils.get_stock_balance", + "erpnext.stock.utils.get_stock_balance" +]
- Changed
frappe_search_docs13 fields changed- changed
Input schema / properties / doctype / descriptionPrevious value: -"The DocType to search."New value: +"The DocType to search within (e.g. 'Sales Invoice', 'Customer', 'Item', 'ToDo', 'Contact'). This parameter is required." - added
Input schema / properties / doctype / examplesAdded value: +[ + "Sales Invoice", + "Customer", + "Item" +] - changed
Input schema / properties / fields / descriptionPrevious value: -"Optional list of field names to return (e.g. ['name', 'status', 'grand_total'])."New value: +"Optional list of field names to return. Limits the response to only the specified fields for efficiency. Example: ['name', 'status', 'grand_total', 'posting_date']. When omitted, all fields are returned." - added
Input schema / properties / fields / examplesAdded value: +[ + [ + "name", + "status", + "grand_total" + ] +] - changed
Input schema / properties / filters / descriptionPrevious value: -"Optional list of filters, each as [field, operator, value], e.g. [['status','=','Open']]."New value: +"Optional list of filter conditions. Each filter is a triple [field, operator, value]. Supported operators: =, !=, >, <, >=, <=, like, not like, in, not in, between. Example: [['status','=','Open'], ['grand_total','>','1000']]." - added
Input schema / properties / filters / examplesAdded value: +[ + [ + [ + "status", + "=", + "Open" + ] + ], + [ + [ + "grand_total", + ">", + "1000" + ], + [ + "status", + "!=", + "Cancelled" + ] + ] +] - added
Input schema / properties / filters / itemsAdded value: +{ + "prefixItems": [ + { + "description": "Field name to filter on", + "type": "string" + }, + { + "description": "Operator: =, !=, >, <, >=, <=, like, not like, in, not in, between", + "type": "string" + }, + { + "description": "Value to compare against", + "type": "string" + } + ], + "type": "array" +} - added
Input schema / properties / limit / defaultAdded value: +20 - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results (default 20)."New value: +"Maximum number of results to return (default: 20, maximum: 200). Use for pagination. Frappe caps results at 200 per request." - added
Input schema / properties / limit / maximumAdded value: +200 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / order_by / descriptionPrevious value: -"Field to sort by (e.g. 'creation desc')."New value: +"Field to sort by with direction. Format: 'fieldname direction'. Examples: 'creation desc' (newest first), 'modified asc' (oldest updated first), 'name asc' (alphabetical). Default ordering is by creation date descending." - added
Input schema / properties / order_by / examplesAdded value: +[ + "creation desc", + "modified asc", + "name asc" +]
- Changed
frappe_update_doc6 fields changed- changed
Input schema / properties / data / descriptionPrevious value: -"Key-value pairs of fields to update."New value: +"Dictionary of field names and their new values. Only the fields included here are modified; other fields retain their current values. Example: {'status': 'Cancelled', 'remarks': 'Cancelled per customer request'}." - added
Input schema / properties / data / examplesAdded value: +[ + { + "remarks": "Cancelled per customer request", + "status": "Cancelled" + }, + { + "email_id": "newemail@example.com", + "mobile_no": "+1234567890" + } +] - changed
Input schema / properties / doctype / descriptionPrevious value: -"The DocType of the document."New value: +"The DocType of the document to update (e.g. 'Sales Invoice', 'Customer', 'Item', 'Sales Order'). Must match the doctype of the existing document." - added
Input schema / properties / doctype / examplesAdded value: +[ + "Sales Invoice", + "Customer", + "Item" +] - changed
Input schema / properties / name / descriptionPrevious value: -"The document name/ID."New value: +"The unique document name or ID of the existing document to modify (e.g. 'SINV-00001', 'CUST-00001', 'ITEM-00001')." - added
Input schema / properties / name / examplesAdded value: +[ + "SINV-00001", + "CUST-00001" +]
7 tool updates
v1.0.0- First observed
frappe_create_doc - First observed
frappe_delete_doc - First observed
frappe_get_doc - First observed
frappe_ping - First observed
frappe_run_method - First observed
frappe_search_docs - First observed
frappe_update_doc
TDQS
Each tool has a clearly distinct purpose: ping for health-check, CRUD tools for document lifecycle, and a custom method runner. There is no ambiguity between them.
All tool names follow a consistent frappe_verb_noun pattern (e.g., frappe_get_doc, frappe_create_doc) with lowercase and underscores, making it predictable for an LLM.
With 7 tools, the set is well-scoped for interacting with a Frappe/ERPNext system. It covers essential operations without being overwhelming or too sparse.
The set provides full CRUD, health-check, and a generic method runner for custom operations. Minor gaps like listing doctypes or bulk operations can be handled via the method runner, but dedicated tools would be slightly more convenient.
Maintenance
Related MCP Connectors
Search, document and execute authenticated API calls across 700+ apps via one MCP server
Connect MCP clients to 2,000+ AI models without managing provider API keys.
API-first CRM for LLMs - contacts, companies, deals and activities over a native MCP server.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables interaction with Frappe Framework sites through comprehensive document operations, schema introspection, report generation, and method execution. Provides secure API-based access to create, read, update, and delete Frappe documents while supporting financial reporting and DocType management.2415ISC
- FlicenseBqualityDmaintenanceEnables interaction with Frappe and ERPNext sites through their REST API endpoints. It supports standard HTTP methods for performing CRUD operations and managing site data using natural language.12-

Frappe MCPofficial
AlicenseNot gradedqualityDmaintenanceAllows Frappe Framework apps to function as MCP servers, exposing Python-defined tools for LLM interaction.158MIT- AlicenseNot gradedqualityAmaintenanceMCP server that enables LLMs to interact with ERPNext/Frappe sites for document CRUD, search, reports, workflows, and analytics, respecting user permissions and logging all actions.295AGPL 3.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/muthanii/frappe_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server