1. SAP 侧 AI 助手接入的真实卡点
SAP 生态里做 AI 助手,难点从来不是模型本身,而是 ABAP 系统与外部工具之间的通道怎么打通。ABAP 开发者想让 AI 帮忙读源码、查表、跑单测,Basis 运维想让 AI 辅助看 Dump、做权限审计,但两边用的协议不一样:OData 管登录,ADT 管开发对象,RFC 管函数调用。三条通道各自为政,AI 客户端根本不知道该怎么接。
MCP(Model Context Protocol)就是来解决这个问题的。它把 AI 客户端和 SAP 之间的通信抽象成一套标准协议,AI 侧只需要一个 settings.json 就能声明「我要连哪个 MCP 服务端」,SAP 侧则通过 MCP 服务端把 OData、ADT、RFC 三条通道统一封装。你不需要在 ABAP 里写任何 HTTP 客户端代码,也不需要让 Basis 单独开一堆端口。
这篇面向两类人:一是 ABAP 开发者,想用 AI 助手做代码副驾;二是 Basis 运维,负责审批通道和 Key 的落地。核心交付三样东西:可复制的 settings.json 骨架、MCP 服务端参数清单、三步连通性验证动作。实测下来,只要 Key 校验、通道握手、ABAP 调用回显这三步走通,后面接什么 AI 客户端都是改配置的事。
2. TaoToken 在 MCP 通道里的位置
TaoToken 在这里扮演的是统一 Key/API 通道的角色。MCP 服务端本身负责协议转换,但它调用模型能力时需要一组稳定的 API 凭据。如果每个 AI 客户端各自配一套 Key,Basis 侧审计会疯掉。TaoToken 的做法是把 Key 收敛到一处,MCP 服务端通过统一的 API 入口拿模型能力,ABAP 侧只认 MCP 通道,不直接碰模型 Key。
具体来说,MCP 服务端的 settings.json 里会有一个 provider 段,指向 TaoToken 的 API 地址。模型对话、Coding Plan、API Keys 管理都在同一个控制台里完成。对 ABAP 开发者来说,你只需要知道 MCP 服务端启动时会去校验这个 Key;对 Basis 来说,Key 的轮换和权限收敛在 TaoToken 控制台做,不用动 SAP 系统配置。
这里有个容易踩的坑:MCP 服务端的 Key 校验是启动时做的,如果 Key 失效,服务端进程会直接退出,AI 客户端侧看到的是「MCP server disconnected」,而不是「401」。所以排障时先看 MCP 服务端日志,别一上来就查 ABAP。
3. settings.json 骨架与 MCP 服务端参数清单
先给可复制的 settings.json 骨架。这个文件放在 AI 客户端的 MCP 配置目录下,不同客户端路径不同,但结构一致。
{ "mcpServers": { "sap-abap-mcp": { "command": "node", "args": [ "PATH_TO/mcp-sap-multiprotocol/dist/index.js" ], "env": { "TAOTOKEN_API_BASE": "https://taotoken.net/api", "TAOTOKEN_API_KEY": "sk-你的Key", "SAP_MCP_MODE": "stdio", "SAP_MCP_LOG_LEVEL": "info", "SAP_MCP_TIMEOUT_MS": "30000" } } } }参数清单逐项说明。command 和 args 指向 MCP 服务端入口,Windows 下路径用正斜杠或双反斜杠都行。env 段是重点:
| 参数 | 作用 | 建议值 |
|---|---|---|
| TAOTOKEN_API_BASE | 统一 API 入口 | https://taotoken.net/api |
| TAOTOKEN_API_KEY | 模型调用凭据 | 控制台生成,勿硬编码到仓库 |
| SAP_MCP_MODE | 通信模式 | stdio,本地进程通信用这个 |
| SAP_MCP_LOG_LEVEL | 日志级别 | 排障时用 debug,日常 info |
| SAP_MCP_TIMEOUT_MS | 单次调用超时 | 30000,大文件下载可调到 60000 |
注意 Key 不要写进版本控制。生产环境建议用环境变量注入,settings.json 里只留占位符。Basis 侧如果要审计,让开发者把 Key 的生成记录留在 TaoToken 控制台的 API Keys 页面,别用共享 Key。
MCP 服务端启动后会在本地起一个 stdio 通道,AI 客户端通过标准输入输出和它通信。SAP 侧的 OData 登录信息由 MCP 服务端自己管理,加密存在本地凭证库,不经过 settings.json。这一点很关键:settings.json 只管 AI 客户端到 MCP 服务端的连接,不管 SAP 登录。
4. 三步连通性验证
配置写完别急着开 AI 客户端,先做三步验证。这三步分别对应 Key 校验、通道握手、ABAP 调用回显,任何一步失败都能定位到具体环节。
4.1 Key 校验
直接跑 MCP 服务端进程,看它能不能拿到模型能力。命令行执行:
TAOTOKEN_API_KEY=sk-你的Key node PATH_TO/mcp-sap-multiprotocol/dist/index.js --healthcheck预期输出里会有provider: ok和model: available。如果报provider: unauthorized,说明 Key 无效或过期,去 TaoToken 控制台的 API Keys 页面重新生成。如果报provider: timeout,检查网络到 https://taotoken.net/api 的连通性,别用任何非官方网络工具。
这一步过了,说明 MCP 服务端到模型通道是通的。
4.2 通道握手
Key 校验通过后,验证 MCP 服务端到 SAP 三条通道的握手。MCP 服务端启动时会依次尝试 OData 登录、ADT 连接、RFC 连接。日志里会看到:
[odata] connect ok, session established [adt] channel ready [rfc] channel ready如果卡在[odata] connect,检查 SAP 登录信息是否配在 MCP 服务端的本地凭证库里,而不是 settings.json。如果[adt]或[rfc]失败,通常是 SAP 侧的服务没激活,让 Basis 确认 ADT REST API 和 RFC 网关是开启状态。
4.3 ABAP 调用回显
前两步都过了,做一次真实的 ABAP 调用回显。在 AI 客户端里发一条最简单的指令,比如「列出当前系统里所有 Z 开头的表」。MCP 服务端会走 ADT 通道查 DDIC,返回结果里应该能看到具体的表名。
如果返回空列表,先确认 SAP 系统里确实有 Z 表;如果报sanitizeObjectName failed,说明对象名过滤规则拦了,检查是不是带了非法字符。这一步走通,整条链路就活了。
5. 本篇常见错排查
排障时按链路顺序查,别跳步。下面几个是实测中高频出现的。
MCP server disconnected:AI 客户端侧看到这个,九成是 MCP 服务端进程挂了。先看服务端日志,最常见的是 Key 失效导致启动退出。其次是 node 版本不匹配,MCP 服务端要求 node 18 以上。
odata_connect timeout:SAP 侧 OData 服务没响应。让 Basis 检查 SAP 网关的 OData 服务是否激活,以及 MCP 服务端所在机器到 SAP 的网络是否放行。注意这里说的是企业内网连通性,不是任何外部网络工具。
ADT channel ready 但查不到源码:ADT 通道通了,但权限不够。MCP 服务端的角色配置里,技术角色才能读源码,业务角色只有只读清单。检查本地凭证库里的角色设置。
RFC 调用返回 function not found:函数名拼写或大小写问题。RFC 函数名在 SAP 里通常是大写,MCP 服务端会做一次规范化,但如果函数本身没激活,也会报这个。让 ABAP 侧确认函数是 remote-enabled 状态。
Key 校验通过但模型调用 401:这种情况少见,通常是 Key 的权限范围不对。TaoToken 控制台里每个 Key 可以限定可用模型,检查这个 Key 是否绑定了你要用的模型。
6. 接入与排障的下一步
三步验证走通后,日常使用就是改 settings.json 里的事。如果你主要做模型对话验证,去模型对话页面直接试;如果是长期编码和 Agent 场景,Coding Plan 更适合,Key 和额度管理都在里面;Basis 侧要审计 Key 的生成和轮换,在 API Keys 页面操作。接入文档里有完整的参数说明和排障清单,遇到MCP server disconnected这类报错先翻文档再查日志。
实测下来,最容易忽略的是 MCP 服务端的日志级别。日常跑用 info 就行,排障时改成 debug,能看到每条通道的握手细节。另外 Key 别用共享的,每个开发者一个 Key,出问题能定位到人。SAP 侧的登录凭证由 MCP 服务端本地加密管理,settings.json 里不要出现 SAP 密码,这是红线。