ERPNext多客户端协议服务器

为Frappe/ERPNext设计的框架级多客户端协议服务器,支持动态站点切换和跨站点操作。

  • by ManotLuijiu
  • TypeScript
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 ManotLuijiu/erpnext_mcp_server

使用说明

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)

设计原则

  1. 框架级别 --在工作台水平运行,而不是在每个站点运行
  2. 延迟加载 --Frappe仅在需要时进口
  3. 网站背景 --根据工具调用动态切换上下文
  4. 安全第一 --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传输