Skip to main content
Glama
yazelin

ERPNext MCP Server

by yazelin
README.md
# ERPNext MCP Server

MCP (Model Context Protocol) server for ERPNext REST API, built with [FastMCP](https://github.com/jlowin/fastmcp) and Python.

## Features

- **CRUD** — List, get, create, update, delete documents
- **Workflow** — Submit and cancel submittable documents
- **Reports** — Run ERPNext query reports
- **Schema** — Inspect DocType field definitions, list all DocTypes
- **Inventory** — Stock balance, stock ledger, item prices
- **Trading** — Document conversion (e.g. Quotation → Sales Order), party balance
- **Supplier/Customer** — Get complete details with address, phone, contacts; supports alias search
- **Files** — Upload, list, download files
- **Helpers** — Link search (autocomplete), document count, generic method calls

## Requirements

- Python >= 3.11
- [uv](https://docs.astral.sh/uv/) (recommended) or pip
- ERPNext instance with API key/secret

## Setup

```bash
# Clone the repo
git clone <repo-url> && cd erpnext-mcp

# Create .env file
cat > .env << 'EOF'
ERPNEXT_URL=https://your-erpnext-instance.com
ERPNEXT_API_KEY=your_api_key
ERPNEXT_API_SECRET=your_api_secret
EOF

# Install dependencies
uv sync
```

## Run

```bash
set -a && source .env && set +a && uv run erpnext-mcp
```

## Available Tools

| Tool | Description |
|---|---|
| `list_documents` | List documents with filters, sorting, pagination |
| `get_document` | Get a single document by name |
| `create_document` | Create a new document |
| `update_document` | Update an existing document |
| `delete_document` | Delete a document |
| `submit_document` | Submit a submittable document |
| `cancel_document` | Cancel a submitted document |
| `run_report` | Execute an ERPNext report |
| `get_count` | Get document count with optional filters |
| `get_list_with_summary` | List documents with total count |
| `run_method` | Call any whitelisted server-side method |
| `search_link` | Link field autocomplete search |
| `list_doctypes` | List all available DocType names |
| `get_doctype_meta` | Get field definitions for a DocType |
| `get_stock_balance` | Real-time stock balance from Bin (exact item_code) |
| `get_stock_ledger` | Stock ledger entries (exact item_code) |
| `get_item_price` | Item prices from price lists (exact item_code) |
| `find_items` | Fuzzy-search Item across name / item_name / item_code |
| `get_item_details` | Item master + stock + price in one call (supports keyword) |
| `make_mapped_doc` | Document conversion (e.g. SO → DN) |
| `get_party_balance` | Outstanding balance for Customer/Supplier |
| `get_supplier_details` | Get supplier with address, phone, contacts (supports alias search) |
| `get_customer_details` | Get customer with address, phone, contacts (supports alias search) |
| `upload_file` | Upload a local file to ERPNext (by file path) |
| `upload_file_from_url` | Upload a file from URL |
| `list_files` | List files attached to a document |
| `download_file` | Download a file by URL |
| `get_file_url` | Get download URL for a file |

## MCP Client Configuration

Add to your MCP client config (e.g. Claude Desktop `claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "erpnext": {
      "command": "uv",
      "args": ["--directory", "/path/to/erpnext-mcp", "run", "erpnext-mcp"],
      "env": {
        "ERPNEXT_URL": "https://your-erpnext-instance.com",
        "ERPNEXT_API_KEY": "your_api_key",
        "ERPNEXT_API_SECRET": "your_api_secret"
      }
    }
  }
}
```

## Project Structure

```
src/erpnext_mcp/
├── server.py   # MCP tool definitions (FastMCP)
├── client.py   # ERPNext REST API client (httpx async)
└── types.py    # Pydantic models
```

## License

MIT

TDQS

B3.2/5.0

Scored across 28 tools

Disambiguation3/5

Most tools are nominal but there are several overlapping fetch utilities: list_documents, get_list_with_summary, and get_count all surface document lists/counts, and get_item_details overlaps with get_stock_balance, get_item_price, and find_items. The descriptions add helpful disambiguation notes, but an agent could still misselect when a single response includes both full-item details and stock-specific lookups.

Naming Consistency5/5

Tool names follow a consistent snake_case verb_noun pattern throughout: list_documents, get_document, create_document, update_document, delete_document, submit_document, cancel_document, upload_file, download_file. Even composite names like get_list_with_summary and make_mapped_doc stay within the same pattern, so the naming is predictable.

Tool Count2/5

At 28 tools, this server exceeds the 25+ threshold where tool count becomes a heavy burden. The count also inflates the surface area because several tools are near-duplicates of generic document access: get_count, get_list_with_summary, get_document, and list_documents could likely be consolidated.

Completeness5/5

The tool set gives strong lifecycle coverage for the ERPNext domain: generic DocType CRUD, submit/cancel, report execution, run_method, mapped document conversion, stock/item lookups, party balance and details, plus upload/download file support. There are no major dead ends and the generic document tools plus whitelisted run_method fill most edge cases.

Maintenance

ActivityInactive
ResponsivenessNo issues