Skip to main content
Glama
muthanii

Frappe MCP Server

Frappe MCP Server

PyPI Python Docker Hub Docker pulls GHCR MCP Registry License

frappe_mcp MCP server

mcp-name: io.github.muthanii/frappe_mcp

A 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

frappe-mcp-server

pypi.org/project/frappe-mcp-server

Docker Hub

muthanii/frappe-mcp

hub.docker.com/r/muthanii/frappe-mcp

GitHub Container Registry

ghcr.io/muthanii/frappe-mcp

ghcr package

MCP Registry

io.github.muthanii/frappe_mcp

registry API

Glama

glama.ai/mcp/servers/muthanii/frappe_mcp

Source

github.com/muthanii/frappe_mcp

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 run command, 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-server

With pip:

pip install frappe-mcp-server
frappe-mcp-server

With 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-mcp

With 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-mcp

Available 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

frappe_ping

Check connectivity and credentials

read-only

no

yes

frappe_get_doc

Retrieve a single document by doctype + name

read-only

no

yes

frappe_search_docs

Search/list documents with filters

read-only

no

yes

frappe_create_doc

Create a new document

write

no

no

frappe_update_doc

Update an existing document

write

yes

yes

frappe_delete_doc

Delete a document — irreversible

write

yes

no

frappe_run_method

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

FRAPPE_URL

Yes

Base URL of your Frappe site (e.g. https://erp.example.com)

FRAPPE_API_KEY

Yes

Frappe API key

FRAPPE_API_SECRET

Yes

Frappe API secret

FRAPPE_VERIFY_SSL

No

Set to false to skip TLS verification (default: true)

FRAPPE_TIMEOUT

No

Request timeout in seconds (default: 30)

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-mcp

License

MIT — see LICENSE.


frappe_mcp MCP server

Available Tools

7 tools
frappe_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesKey-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.
doctypeYesThe 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

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe unique document name or ID to permanently remove from the system (e.g. 'TODO-00001', 'NOTE-00001'). This operation cannot be undone.
doctypeYesThe 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

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe 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.
doctypeYesThe 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

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kwargsNoOptional 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.
methodYesDotted 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

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default: 20, maximum: 200). Use for pagination. Frappe caps results at 200 per request.
fieldsNoOptional 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.
doctypeYesThe DocType to search within (e.g. 'Sales Invoice', 'Customer', 'Item', 'ToDo', 'Contact'). This parameter is required.
filtersNoOptional 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_byNoField 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

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesDictionary 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'}.
nameYesThe unique document name or ID of the existing document to modify (e.g. 'SINV-00001', 'CUST-00001', 'ITEM-00001').
doctypeYesThe DocType of the document to update (e.g. 'Sales Invoice', 'Customer', 'Item', 'Sales Order'). Must match the doctype of the existing document.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv1.1.0
    • Changedfrappe_create_doc4 fields changed
      • changedInput schema / properties / data / description
        Previous 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."
      • addedInput schema / properties / data / examples
        Added value: +[
        +  {
        +    "customer_name": "Acme Corp",
        +    "customer_type": "Company",
        +    "email_id": "billing@acme.com"
        +  },
        +  {
        +    "priority": "Medium",
        +    "status": "Open",
        +    "subject": "Review contract"
        +  }
        +]
      • changedInput schema / properties / doctype / description
        Previous 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."
      • addedInput schema / properties / doctype / examples
        Added value: +[
        +  "Customer",
        +  "Sales Invoice",
        +  "ToDo",
        +  "Contact"
        +]
    • Changedfrappe_delete_doc4 fields changed
      • changedInput schema / properties / doctype / description
        Previous 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."
      • addedInput schema / properties / doctype / examples
        Added value: +[
        +  "ToDo",
        +  "Note",
        +  "Contact"
        +]
      • changedInput schema / properties / name / description
        Previous 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."
      • addedInput schema / properties / name / examples
        Added value: +[
        +  "TODO-00001",
        +  "NOTE-00001"
        +]
    • Changedfrappe_get_doc4 fields changed
      • changedInput schema / properties / doctype / description
        Previous 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."
      • addedInput schema / properties / doctype / examples
        Added value: +[
        +  "Sales Invoice",
        +  "Customer",
        +  "Item",
        +  "User"
        +]
      • changedInput schema / properties / name / description
        Previous 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."
      • addedInput schema / properties / name / examples
        Added value: +[
        +  "SINV-00001",
        +  "CUST-00001",
        +  "Administrator"
        +]
    • Changedfrappe_run_method4 fields changed
      • changedInput schema / properties / kwargs / description
        Previous 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."
      • addedInput schema / properties / kwargs / examples
        Added value: +[
        +  {
        +    "item_code": "ITEM-001",
        +    "warehouse": "Stores - W"
        +  },
        +  {
        +    "from_date": "2025-01-01",
        +    "to_date": "2025-12-31"
        +  }
        +]
      • changedInput schema / properties / method / description
        Previous 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."
      • addedInput schema / properties / method / examples
        Added value: +[
        +  "frappe.auth.get_logged_user",
        +  "frappe.utils.get_stock_balance",
        +  "erpnext.stock.utils.get_stock_balance"
        +]
    • Changedfrappe_search_docs13 fields changed
      • changedInput schema / properties / doctype / description
        Previous value: -"The DocType to search."New value: +"The DocType to search within (e.g. 'Sales Invoice', 'Customer', 'Item', 'ToDo', 'Contact'). This parameter is required."
      • addedInput schema / properties / doctype / examples
        Added value: +[
        +  "Sales Invoice",
        +  "Customer",
        +  "Item"
        +]
      • changedInput schema / properties / fields / description
        Previous 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."
      • addedInput schema / properties / fields / examples
        Added value: +[
        +  [
        +    "name",
        +    "status",
        +    "grand_total"
        +  ]
        +]
      • changedInput schema / properties / filters / description
        Previous 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']]."
      • addedInput schema / properties / filters / examples
        Added value: +[
        +  [
        +    [
        +      "status",
        +      "=",
        +      "Open"
        +    ]
        +  ],
        +  [
        +    [
        +      "grand_total",
        +      ">",
        +      "1000"
        +    ],
        +    [
        +      "status",
        +      "!=",
        +      "Cancelled"
        +    ]
        +  ]
        +]
      • addedInput schema / properties / filters / items
        Added 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"
        +}
      • addedInput schema / properties / limit / default
        Added value: +20
      • changedInput schema / properties / limit / description
        Previous 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."
      • addedInput schema / properties / limit / maximum
        Added value: +200
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / order_by / description
        Previous 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."
      • addedInput schema / properties / order_by / examples
        Added value: +[
        +  "creation desc",
        +  "modified asc",
        +  "name asc"
        +]
    • Changedfrappe_update_doc6 fields changed
      • changedInput schema / properties / data / description
        Previous 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'}."
      • addedInput schema / properties / data / examples
        Added value: +[
        +  {
        +    "remarks": "Cancelled per customer request",
        +    "status": "Cancelled"
        +  },
        +  {
        +    "email_id": "newemail@example.com",
        +    "mobile_no": "+1234567890"
        +  }
        +]
      • changedInput schema / properties / doctype / description
        Previous 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."
      • addedInput schema / properties / doctype / examples
        Added value: +[
        +  "Sales Invoice",
        +  "Customer",
        +  "Item"
        +]
      • changedInput schema / properties / name / description
        Previous 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')."
      • addedInput schema / properties / name / examples
        Added value: +[
        +  "SINV-00001",
        +  "CUST-00001"
        +]
  2. 7 tool updatesv1.0.0
    • First observedfrappe_create_doc
    • First observedfrappe_delete_doc
    • First observedfrappe_get_doc
    • First observedfrappe_ping
    • First observedfrappe_run_method
    • First observedfrappe_search_docs
    • First observedfrappe_update_doc

TDQS

A4.3/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivitySlowing
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    24
    15
    ISC
  • F
    license
    B
    quality
    D
    maintenance
    Enables 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.
    1
    2
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP 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.
    295
    AGPL 3.0

Latest Blog Posts

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