前言

时代变化得很快。我的草稿箱里还躺着一篇 8 个月前准备发布的“用 Python 自动化测试 SAP”文章,没想到现在,AI 已经可以通过 MCP 直接调用本地工具,与 SAP 系统进行受控交互。

这段时间,我已经尝试让 Codex 在测试系统中批量创建订单:

也用它辅助排查生产问题:

以及制作一些贴合日常工作的效率工具:

下面我们进入正题,来给大家分享如何实现AI接入SAP

一、AI接入SAP的工作原理

  • AI 客户端:理解你的自然语言需求,例如“读取程序 ZDEMO 并解释主要逻辑”。
  • MCP:规定 AI 如何调用本地工具。本文使用本地 stdio 模式,AI 客户端启动 Python 子进程,通过标准输入输出交换结构化消息。(不得不说Anthropic还是牛逼的)
  • Python MCP 服务:校验参数、读取本机配置,并向 SAP 发起请求。
  • SAP ADT:这是一套SAP官方提供的开发工具接口,本来是给Eclipse开发用的,没想到现在却成为了AI能实现操作SAP的工具
AI 客户端
   │
   │ MCP stdio
   ▼
本地 Python MCP 服务
   │
   │ HTTP(S) + SAP 身份认证
   ▼
SAP ADT

二、这个方案能做什么

根据模型能力、MCP 工具实现方式和 SAP 账号权限,它可以覆盖很多工作场景:

  • 读取并解释 Program、Include、Class 等 ABAP 对象;
  • 梳理调用链、数据流和业务流程;
  • 辅助编写 FS、测试脚本和测试数据;
  • 根据源码排查逻辑问题,生成代码审查清单;
  • 在测试环境中执行经授权的创建、修改或传输操作。

三、开始前需要准备什么

  • Python 3.10 或更高版本;
  • 支持本地 MCP的AI 客户端;
  • SAP ADT 的完整主机地址和端口;
  • 本地的SAP Client、账号和密码;
  • 系统已启用 ADT 服务,账号具有目标对象的读取权限;
  • 一个真实存在、并且允许交给当前 AI 客户端处理的 Program、Include 或 Class 对象名。

我虽然玩了这么久,还是不敢接入生产机,哈哈哈哈

四、配置文件说明

连接信息保存在解压目录下的 .sap_env.local 文件中。先将模板 .sap_env.local.example 复制一份并改名为 .sap_env.local,已有文件不要覆盖。

SAP_ADT_BASE_URL=https://sap-test.example.invalid:44300
SAP_CLIENT=100
SAP_USER=YOUR_USER
SAP_PASSWORD=YOUR_PASSWORD

四个字段的含义如下:

  • SAP_ADT_BASE_URL:ADT 服务的基础地址,必须包含 http:// 或 https://,以及实际端口;不要填写带登录路径、查询参数或账号的网页地址。
  • SAP_CLIENT:三位数字的 SAP Client,例如 100。
  • SAP_USER:SAP 登录账号。
  • SAP_PASSWORD:SAP 登录密码。

五、如何获取 SAP_ADT_BASE_URL

如果管理员已经提供完整地址,优先使用管理员提供的值;不要靠猜测拼接生产系统地址。如果需要自己确认,可以在 SAP GUI 中进入 SMICM:

  1. 输入事务码 SMICM;
  2. 打开顶部菜单“转到(Goto)→ 服务(Services)”;
  3. 找到处于激活状态的 HTTP 或 HTTPS 行;
  4. 使用 Host 和 Port 拼出基础地址。
示例:
Host = sap-test.example.invalid
Port = 8000

最终配置:
SAP_ADT_BASE_URL=http://sap-test.example.invalid:8000

以上域名和端口只是格式示例,不能连接任何真实系统。优先使用 HTTPS,因为它能通过 TLS 保护传输内容;如果系统只提供 HTTP,只应在管理员确认的可信内网或 VPN 环境中使用。

六、在 SICF 中确认 ADT 服务

地址正确还不够,还要确认系统端的 ADT 服务已启用。在 SAP GUI 中进入 SICF,查找 ADT 相关节点:

  • 右键节点后,如果菜单显示“停用服务 / Deactivate Service”,说明当前已激活;
  • 如果显示“激活服务 / Activate Service”,说明尚未激活;
  • 部分 SAP GUI 版本中,已激活节点为黑色,未激活节点为灰色。

如果你没有激活服务的权限,请联系 Basis 或系统管理员处理,不要尝试绕过 SAP 权限控制。

七、安装依赖并检查本地配置

Windows 用户在解压目录运行:

install_windows.cmd
run_sap_mcp_readonly.cmd --check-config

由于我没接触过macOS 或 Linux,这两边的用户可以问下AI应该怎么弄😂

configuration_ready=true 只代表配置格式已经就绪,不代表 SAP 连接成功。只有真实读取指定对象并收到源码后,才能验证本次连接、身份认证和该对象的读取权限。

八、把 MCP 服务接入 AI 客户端

附件中提供了 mcp_config.example.json。以 Windows 为例:

{
  "mcpServers": {
    "sap-adt-readonly": {
      "command": "C:\tools\SAP_ADT_MCP_Guided_Setup\.venv\Scripts\python.exe",
      "args": [
        "C:\tools\SAP_ADT_MCP_Guided_Setup\sap_mcp_server.py"
      ]
    }
  }
}

需要把两处路径改为自己的实际解压位置。不同客户端的配置入口可能不同,但核心只有两项:用哪个 Python 启动,以及启动哪个 MCP 服务脚本。

配置完成并重新连接后,AI 应该能看到两个工具:

  • get_setup_status:检查本地配置状态,不访问 SAP,也不返回配置值;
  • read_abap_source:读取用户明确指定的 Program、Include 或 Class 源码。

这步搞不懂的话,可以问问你自己的AI。

一般来说,AI自己应该会给你弄好的

九、第一次真实读取与验证

接入后,可以向 AI 发送下面这段话:

我已完成本机配置。请先调用 get_setup_status;配置就绪后,询问我要读取的对象类型和对象名,再调用 read_abap_source 读取并解释。不要读取或展示我的凭据文件。

随后提供真实存在、且允许当前 AI 客户端处理的对象。调用格式类似:

{
  "object_type": "program",
  "object_name": "ZEXAMPLE"
}

只有工具成功返回真实源码和 connection_verified=true,才能说明“本次连接以及该对象的读取已验证”。这不代表程序已经执行、编译或激活,也不代表账号有权访问所有对象。

十、安全边界:密码到底有没有交给 AI

正常流程中没有。密码由本机 Python 进程从 .sap_env.local 读取,用于建立 SAP 请求;MCP 工具不会把密码作为调用参数,也不会在结果中返回密码。

但也要注意:如果 AI 客户端本身拥有整个目录的文件读取权限,那么它在技术上仍可能访问这个文件。因此,除了提示 AI 不要读取,还应该做好真正的权限控制:

  • 不要把 .sap_env.local 粘贴到聊天窗口或上传到网络;
  • 不要把真实配置提交到 Git,或重新打包进公开 ZIP;
  • 只给 AI 客户端完成任务所需的最小目录权限;
  • 优先使用测试系统和专用只读账号;
  • 对敏感对象设置允许列表,并保留工具调用确认;
  • 更高安全要求下,可改用 Windows Credential Manager、DPAPI 等凭据存储方案。

十一、常见问题排查

401 Unauthorized

通常与账号、密码或 Client 不正确有关。请在本机核对,不要把密码发给 AI,也不要连续大量重试。

403 Forbidden

说明身份认证可能已通过,但账号没有目标 ADT 服务或对象的读取权限,需要管理员检查授权。

404 Not Found

检查对象名称、对象类型、ADT 路径、SICF 服务状态以及当前 SAP 版本的接口支持情况。

网络或 TLS 错误

检查 VPN、网络、主机端口和受信任证书。使用 HTTPS 时,不要为了省事关闭证书校验。

修改配置后没有生效

检查 environment_override_fields。同名系统环境变量会覆盖本地文件;修改客户端环境变量后,还需要重启 MCP 服务。

MCP 服务启动后没有普通输出

这是正常现象。stdio 服务会等待 AI 客户端发送 MCP 消息,并不是普通的交互式命令行程序。

十二、附件下载

附件包含 Python MCP 服务、配置模板、Windows 安装与启动脚本、新手操作指南和示例 MCP 配置:

【免费】基于 MCP 把 AI 接入 SAP 实现方案资源—CSDN 下载 https://download.csdn.net/download/atluan/93477136?spm=1001.2014.3001.5503

结语

时代从不为谁驻足,也从不因谁停摆。与其惊慌失措,不如坦然入局 —— 奔涌向前时,也别忘了看看两岸的风景。

 

更多推荐