SAP ECC RFC MCP服务器

一个Python MCP服务器,将SAP ECC BAPIs作为AI代理的工具,支持读取主数据、创建销售/采购订单及查询任意SAP表。

  • by domatwonderful
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 domatwonderful/sap-ecc-rfc-prototype

使用说明

SAP ECC RFC MCP服务器

蟒蛇 主控程序 该服务器将SAP ECC BAPI作为AI代理的工具公开。内置于 FastMCP v2 和 PyRFC,它允许Claude(或任何MCP客户端)读取主数据、创建销售/采购订单和查询任意SAP表——所有这些都是通过自然语言完成的。

包括完整 模拟模式 用于在没有实时SAP系统的情况下进行开发和测试。

工具(17)

主数据(只读)

工具 BAPI 说明
get_material BAPI_MATERIAL_GET_DETAIL 按编号阅读材料
search_materials BAPI_MATERIAL_GETLIST 按描述/类型搜索
get_customer BAPI_CUSTOMER_GETDETAIL2 按编号读取客户
search_customers BAPI_CUSTOMER_GETLIST 按姓名/城市搜索
get_vendor BAPI_VENDOR_GETDETAIL 按编号读取供应商
search_vendors BAPI_VENDOR_GETLIST 按名称搜索

销售

工具 BAPI 说明
get_sales_order BAPI_SALESORDER_GETDETAIL 读取SO标题+项目
search_sales_orders BAPI_SALESORDER_GETLIST 按客户/日期搜索
create_sales_order BAPI_SALESORDER_CREATEFROMDAT2 使用COMMIT创建SO
change_sales_order BAPI_SALESORDER_CHANGE 使用COMMIT更新SO

采购

工具 BAPI 说明
get_purchase_order BAPI_PO_GETDETAIL1 读取采购订单标题+项目
search_purchase_orders BAPI_PO_GETITEMS 按供应商/日期搜索
create_purchase_order BAPI_PO_CREATE1 使用COMMIT创建PO

发票

工具 BAPI 说明
get_invoices BAPI_INCOMINGINVOICE_GETLIST 搜索发票

通用RFC

工具 RFC 描述
describe_rfc get_function_description 获取FM参数签名
call_rfc (任何) 动态调用任何启用RFC的FM
read_table RFC_READ_TABLE 使用筛选器读取任何SAP表

快速开始

先决条件

安装并运行(模拟模式)

git clone <repo-url> && cd sap-ecc-rfc-prototype
uv sync --extra dev
SAP_MOCK_MODE=true uv run sap-mcp

运行测试

uv run pytest -v

Claude桌面集成

添加 ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "sap-ecc": {
      "command": "uv",
      "args": ["--directory", "/path/to/sap-ecc-rfc-prototype", "run", "sap-mcp"],
      "env": {
        "SAP_MOCK_MODE": "true"
      }
    }
  }
}

重新启动Claude Desktop,将显示17个工具。

配置

所有设置都使用 SAP_ env前缀,可以通过以下方式设置 .env 文件或环境变量:

变量 默认值 描述
SAP_ASHOST localhost SAP应用服务器主机
SAP_SYSNR 00 系统编号
SAP_CLIENT 100 SAP客户端
SAP_USER RFC_USER RFC用户
SAP_PASSWD (空) RFC密码
SAP_LANG EN 登录语言
SAP_MOCK_MODE true 使用模拟连接(不需要SAP)
SAP_CONNECTION_POOL_SIZE 5 最大并发RFC连接数

连接到真实的SAP系统

1.安装SAP NWRFC SDK

从以下网址下载SAP NW RFC SDK 7.50 SAP支持门户 适用于您的平台(例如,适用于Apple Silicon的ARM64)。

# macOS example
sudo mkdir -p /usr/local/sap/nwrfcsdk
sudo tar xzf nwrfc750-macos-arm64.tar.gz -C /usr/local/sap/nwrfcsdk

export SAPNWRFC_HOME=/usr/local/sap/nwrfcsdk
export DYLD_LIBRARY_PATH=/usr/local/sap/nwrfcsdk/lib

2.安装PyRFC

PyRFC未在中列出 pyproject.toml 依赖关系(包在PyPI上被拖拽)。在NWRFC SDK就绪后单独安装:

pip install pyrfc

验证:

python -c "from pyrfc import Connection; print('PyRFC OK')"

3.使用真实凭证运行

SAP_MOCK_MODE=false \
SAP_ASHOST=sap-server.company.com \
SAP_SYSNR=00 \
SAP_CLIENT=100 \
SAP_USER=RFC_USER \
SAP_PASSWD=secret \
uv run sap-mcp

建筑

src/sap_mcp/
├── server.py              # FastMCP entry point, registers tool modules
├── config.py              # Pydantic Settings (SAP_ env prefix)
├── connection/
│   ├── manager.py         # Thread-safe connection pool (acquire/release)
│   └── mock.py            # Mock connection with realistic SAP responses
├── bapi/
│   ├── return_handler.py  # BAPI RETURN parsing (E/A → error, W/S/I)
│   └── transaction.py     # COMMIT/ROLLBACK on same connection
└── tools/
    ├── generic_rfc.py     # describe_rfc, call_rfc, read_table
    ├── master_data.py     # Materials, customers, vendors
    ├── sales.py           # Sales orders (read + create + change)
    ├── purchasing.py      # Purchase orders (read + create)
    └── invoices.py        # Invoice queries

关键设计决策

  • 刀具注册模式:每个工具模块导出 register(mcp) 避免循环进口。工具使用 @mcp.tool() 里面 register().
  • 线程安全连接池:FastMCP在线程池中运行同步工具-- ConnectionManager 用途 threading.Lock + deque 以安全地共享连接。 acquire() 是一个上下文管理器,成功时返回到池的连接,出错时丢弃该连接。
  • 在同一连接上进行COMMIT/ROLLBACK:写入操作使用 execute_bapi_with_commit() 它调用BAPI,解析RETURN,并提交或回滚同一连接——这是SAP事务模型所要求的。
  • 数字填充:SAP要求零填充数字(材料:18个字符,客户/供应商:10个字符)。所有工具垫自动。

示例用例:库存检查和自动重新订购

AI代理可以组合工具来实现业务逻辑。例如,检查库存水平并在库存低时创建采购订单:

  1. read_table("MARD") --从存储位置表读取库存
  2. 代理逻辑 --无限制库存<阈值的过滤材料
  3. get_material() --查找每个低库存商品的详细信息
  4. search_vendors() --寻找合适的供应商
  5. create_purchase_order() --为再订购创建并提交采购订单

该流量在 tests/test_stock_reorder_flow.py.

许可证

麻省理工学院