Frappe MCP Server
by muthanii
README.md
# Frappe MCP Server
[](https://pypi.org/project/frappe-mcp-server/)
[](https://pypi.org/project/frappe-mcp-server/)
[](https://hub.docker.com/r/muthanii/frappe-mcp)
[](https://hub.docker.com/r/muthanii/frappe-mcp)
[](https://github.com/muthanii/frappe_mcp/pkgs/container/frappe-mcp)
[](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.muthanii/frappe_mcp)
[](LICENSE)
[](https://glama.ai/mcp/servers/muthanii/frappe_mcp)
```
mcp-name: io.github.muthanii/frappe_mcp
```
A **Model Context Protocol (MCP) server** for [Frappe Framework](https://frappeframework.com).
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](https://pypi.org/project/frappe-mcp-server/) |
| **Docker Hub** | `muthanii/frappe-mcp` | [hub.docker.com/r/muthanii/frappe-mcp](https://hub.docker.com/r/muthanii/frappe-mcp) |
| **GitHub Container Registry** | `ghcr.io/muthanii/frappe-mcp` | [ghcr package](https://github.com/muthanii/frappe_mcp/pkgs/container/frappe-mcp) |
| **MCP Registry** | `io.github.muthanii/frappe_mcp` | [registry API](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.muthanii/frappe_mcp) |
| **Glama** | — | [glama.ai/mcp/servers/muthanii/frappe_mcp](https://glama.ai/mcp/servers/muthanii/frappe_mcp) |
| **Source** | — | [github.com/muthanii/frappe_mcp](https://github.com/muthanii/frappe_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):**
```bash
FRAPPE_URL=https://your-site.com \
FRAPPE_API_KEY=your-api-key \
FRAPPE_API_SECRET=your-api-secret \
uvx frappe-mcp-server
```
**With `pip`:**
```bash
pip install frappe-mcp-server
frappe-mcp-server
```
**With Docker (Docker Hub):**
```bash
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):**
```bash
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](https://modelcontextprotocol.io/specification/server/tools) 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`:**
```json
{
"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:**
```json
{
"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
```bash
pip install -e .
frappe-mcp
```
## License
MIT — see [LICENSE](LICENSE).
---
[](https://glama.ai/mcp/servers/muthanii/frappe_mcp)
TDQS
A4.3/5.0
Scored across 7 tools
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
ResponsivenessNo issues