使用说明
ERPNext MCP服务器
框架级MCP服务器 对于Frappe/ERPNext,它的工作方式类似于Doppio CLI,而不是特定于站点。
由AWS Solution有限公司建造|联系方式:moocoding@gmail.com
概述
与每个站点安装的典型Frappe应用程序不同,此MCP服务器在 工作台框架水平:
- 一个服务器实例为工作台上的所有站点提供服务
- 通过工具调用动态切换站点上下文
- 无需在每个站点进行安装
┌─────────────────────────────────────────────────────┐
│ MCP Client (Claude, Hermes, etc.) │
│ (running on another machine) │
└────────────────────┬────────────────────────────────┘
│ stdio
┌────────────────────▼────────────────────────────────┐
│ ERPNext MCP Server │
│ (this bench) │
│ │
│ • list_sites → all bench sites │
│ • switch_site → change context │
│ • get_document → query current site │
│ • execute_sql → safe SELECT queries │
│ • bench_command → read-only bench operations │
│ • ... + 15 more tools │
└─────────────────────────────────────────────────────┘
先决条件
- Frappe/ERPNext v15+安装在工作台上
- Python 3.10+(使用bench的虚拟环境)
- MCP客户(克劳德代码、爱马仕代理等)
快速开始
1.验证Python环境
cd ~/frappe-bench
./env/bin/python --version # Should be Python 3.10+
2.本地测试
# Set your default site
export FRAPPE_SITE=your-site.domain.com
export BENCH_PATH=/path/to/your/frappe-bench
# Run the server
./env/bin/python -m erpnext_mcp_server.mcp.server
3.配置MCP客户端
给Claude代码
增添 .mcp.json 在您的项目中:
{
"mcpServers": {
"erpnext": {
"command": "python",
"args": ["-m", "erpnext_mcp_server.mcp.server"],
"env": {
"FRAPPE_SITE": "your-site.domain.com",
"BENCH_PATH": "/home/youruser/frappe-bench"
}
}
}
}
爱马仕代理商
在Hermes配置中:
mcp_servers:
erpnext:
command: ssh
args:
- user@your-server
- 'cd /path/to/bench && FRAPPE_SITE=your-site.com ./env/bin/python -m erpnext_mcp_server.mcp.server'
对于其他MCP客户端
服务器使用 STDIO传输 (标准输入/标准输出)。任何支持stdio的MCP客户端都可以工作:
{
"mcpServers": {
"erpnext": {
"command": "/path/to/frappe-bench/env/bin/python",
"args": ["-m", "erpnext_mcp_server.mcp.server"],
"env": {
"FRAPPE_SITE": "your-site.domain.com",
"BENCH_PATH": "/path/to/frappe-bench"
}
}
}
}
可用工具
站点管理
| 工具 | 参数 | 描述 |
|---|---|---|
list_sites |
-- | 列出此工作台上的所有站点 |
switch_site |
site |
切换到其他站点 |
current_site |
-- | 获取当前站点名称 |
文档CRUD
| 工具 | 参数 | 描述 |
|---|---|---|
get_document |
doctype, name |
按ID获取文档 |
list_documents |
doctype, filters?, limit? |
列出带有过滤器的文档 |
create_document |
doctype, data |
创建新文档 |
update_document |
doctype, name, data |
更新现有文档 |
delete_document |
doctype, name |
删除/取消文档 |
count_documents |
doctype, filters? |
统计匹配的文档 |
元数据
| 工具 | 参数 | 描述 |
|---|---|---|
list_doctypes |
module? |
列出所有文档类型 |
get_doctype_meta |
doctype |
获取字段定义 |
数据库
| 工具 | 参数 | 描述 |
|---|---|---|
execute_sql |
query, limit? |
执行SELECT查询(安全) |
get_table_info |
table |
获取表结构 |
系统信息
| 工具 | 参数 | 描述 |
|---|---|---|
get_system_info |
-- | 系统和数据库信息 |
get_versions |
-- | 已安装的应用程序版本 |
bench_command |
command |
运行只读工作台命令 |
工作流
| 工具 | 参数 | 描述 |
|---|---|---|
submit_document |
doctype, name |
提交(文档状态0→1) |
cancel_document |
doctype, name |
取消已提交的文档 |
搜索
| 工具 | 参数 | 描述 |
|---|---|---|
search |
query, doctype?, limit? |
跨文档类型搜索 |
文件
| 工具 | 参数 | 描述 |
|---|---|---|
read_file |
path, lines? |
读取文件(仅限安全路径) |
list_files |
path, recursive? |
列表目录 |
使用示例
Python客户端测试
import subprocess
import json
proc = subprocess.Popen(
["./env/bin/python", "-m", "erpnext_mcp_server.mcp.server"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
cwd="/path/to/frappe-bench",
env={"FRAPPE_SITE": "your-site.domain.com"}
)
# Initialize
init_msg = {
"jsonrpc": "2.0", "id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {"name": "test", "version": "1.0"}
}
}
proc.stdin.write((json.dumps(init_msg) + "\n").encode())
proc.stdin.flush()
# List sites
list_msg = {
"jsonrpc": "2.0", "id": 2,
"method": "tools/call",
"params": {"name": "list_sites", "arguments": {}}
}
proc.stdin.write((json.dumps(list_msg) + "\n").encode())
proc.stdin.flush()
proc.stdin.close()
print(proc.stdout.read().decode())
Claude代码使用
配置完成后,只需询问Claude:
> List all customers in ERPNext
> Create a new Sales Order for customer ABC
> What is the total outstanding for Invoice INV-001?
Claude将使用MCP工具直接查询ERPNext。
建筑学
erpnext_mcp_server/
├── __init__.py
├── hooks.py
├── mcp/
│ ├── __init__.py
│ ├── __main__.py # Entry point
│ ├── server.py # Main MCP server
│ └── config.py # Configuration
└── doctype/ # Settings DocTypes (optional)
设计原则
- 框架级别 --在工作台水平运行,而不是在每个站点运行
- 延迟加载 --Frappe仅在需要时进口
- 网站背景 --根据工具调用动态切换上下文
- 安全第一 --SQL仅限于SELECT,文件仅限于安全路径
安全
| 限制 | 详细信息 |
|---|---|
| SQL | 只允许SELECT查询 |
| 文件 | 仅限 sites/, apps/, logs/, config/ 路径 |
| 工作台命令 | 只读操作 |
| 网站访问 | 通过Frappe权限强制执行 |
环境变量
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
FRAPPE_SITE |
是 | -- | 默认站点名称 |
BENCH_PATH |
没有 | /home/frappe/frappe-bench |
Bench目录 |
FRAPPE_STREAM_LOGGING |
没有 | 1 |
禁用文件日志记录 |
故障排除
“站点不存在”错误
# Verify site exists
ls ~/frappe-bench/sites/ | grep your-site
# Check site config
cat ~/frappe-bench/sites/your-site.domain.com/site_config.json
连接被拒绝
服务器使用 stdio传输不是HTTP。确保您的MCP客户端通过stdin/stdout管道连接。
权限不足
确保运行服务器的用户具有:
- 读取工作台目录的访问权限
- 网站的数据库访问
- 执行工作台命令的权限
许可证
专有-AWS解决方案有限公司。
支持
- 电子邮件:moocoding@gmail.com
- 问题:在存储库中打开问题
采用Frappe框架构建 | MCP协议 | STDIO传输
