1. SAP 顾问的日常:为什么需要一个 MCP 协议的 AI 助手
在 SAP S/4HANA 项目里待久了,你会发现一个规律:业务顾问和开发顾问的时间,有很大一部分不是花在设计方案上,而是花在「找东西」上。新人问「特殊采购类型在哪配」,你得翻 IMG 翻到眼花;业务用户要一张供应商未清发票清单,你得开 FBL1N 填选择屏幕再导 Excel;开发想知道某个字段落在哪张表,SE16N 试一晚上是常事。
这些问题的本质是:SAP 的知识分散在 IMG 路径、数据字典、业务表和事务码之间,而人脑不擅长做这种跨维度的即时检索。AI 助手能补上这一环,但真要把 AI 接进 SAP 场景,马上会遇到两个硬骨头。
第一个是模型通道问题。SAP 侧要调 AI,可能同时用到 Claude 做代码理解、GPT 做业务问答、国产模型做本地化报表解读,每个模型一套 Key、一套计费、一套限流,散落在各个配置文件里,换一个模型就要改一次代码。第二个是协议问题。SAP 的 ABAP 侧、外部的 Python 脚本、本地的开发工具,各自调用 AI 的方式不一样,没有统一入口,维护成本极高。
MCP(Model Context Protocol)协议正好解决第二个问题——它把「工具调用」标准化了,AI 助手可以通过统一的协议去访问外部数据源和工具。而 TaoToken 解决第一个问题——它提供一个统一的 API 通道和 Key,把多模型的调用收敛到一个入口。两者结合,就能搭出一套 SAP AI 助手的最小可用链路:ABAP 或外部脚本通过 MCP 协议发起工具调用,TaoToken 统一转发到目标模型,返回结果再回写到 SAP 侧。
这篇文章面向的是已经在做 SAP S/4HANA 集成、或者准备把 AI 能力接进 ABAP 环境的开发者。我会给出完整的config.toml配置骨架、CC Switch 切换示例,以及一次真实的 MCP 工具调用验证过程。你照着配完,能跑通「SAP 侧发起请求 → TaoToken 转发 → 模型返回 → 结果落回」这条最小链路。
2. TaoToken 前置准备:统一 Key 与 API 通道
在写配置之前,先把 TaoToken 侧的准备工作做完。这一步不复杂,但顺序不能乱,否则后面config.toml里的字段会填错。
TaoToken 的定位是一个统一的模型 API 网关。你不需要为每个模型单独申请 Key,而是在它的控制台里创建一个 API Key,这个 Key 可以访问它支持的多个模型。对 SAP 场景来说,这意味着你的 ABAP 程序或外部脚本只需要维护一个 Key,换模型时改的是配置里的模型名,而不是去改代码里的鉴权逻辑。
具体操作路径是这样的:先访问官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 了解整体能力,然后进入控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,在 API Keys 页面生成一个新的 Key,复制保存好。API 的基础地址是 https://taotoken.net/api ,这个地址后面会写进config.toml的base_url字段。
这里有个容易踩的坑:很多人会把官网地址和 API 地址搞混。官网是带 UTM 参数的推广链接,用于了解产品;API 地址是纯接口地址,不带任何参数,用于程序调用。配置里必须用https://taotoken.net/api,不要带后面的查询字符串,否则请求会 404。
创建完 Key 之后,建议先在模型对话页面做一次快速验证,确认 Key 可用、模型能正常返回。模型对话入口是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite ,在这里选一个模型发一条测试消息,能看到回复就说明 Key 和通道都没问题。这一步花两分钟,能省掉后面排查配置时的一半时间。
如果你后续要做长期的编码类任务,比如让 AI 持续理解 ABAP 代码库、做代码审查,可以关注 Coding Plan 页面 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它针对长时间、高频次的编码场景做了优化。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,配置字段的详细说明以文档为准。
3. config.toml 配置骨架:MCP 服务与模型通道
现在进入核心部分。MCP 协议的 AI 助手通常需要一个配置文件来声明「用哪个模型通道」和「暴露哪些工具」。下面这份config.toml骨架是我在 SAP 场景下实际用过的结构,你可以直接复制后改字段值。
# SAP AI 助手 MCP 配置骨架 # 模型通道统一走 TaoToken [server] name = "sap-ai-assistant" version = "0.1.0" # MCP 服务监听地址,本地开发用 127.0.0.1 host = "127.0.0.1" port = 8765 [provider] # TaoToken 统一 API 通道 base_url = "https://taotoken.net/api" api_key = "sk-你的TaoTokenKey" # 默认模型,可按场景切换 default_model = "claude-3-5-sonnet" # 请求超时,SAP 侧查询可能较慢,给足时间 timeout_seconds = 120 max_retries = 2 [provider.models] # 声明可用模型,切换时改 default_model 即可 claude = "claude-3-5-sonnet" gpt = "gpt-4o" local = "qwen-plus" [mcp] # MCP 协议版本 protocol_version = "2024-11-05" # 工具调用超时 tool_timeout_seconds = 60 [[mcp.tools]] name = "sap_table_query" description = "只读查询 SAP 业务表,如 BSIK、MARD、T003" # 工具实现指向本地脚本或 ABAP RFC 通道 handler = "handlers.sap_table_query" # 只读标记,禁止写操作 read_only = true [[mcp.tools]] name = "sap_config_lookup" description = "根据配置项名称定位 IMG 路径和配置表" handler = "handlers.sap_config_lookup" read_only = true [[mcp.tools]] name = "sap_field_resolve" description = "根据字段名反查所在表和表结构" handler = "handlers.sap_field_resolve" read_only = true [logging] level = "info" file = "logs/sap-ai-assistant.log"这份配置里有几个关键点需要解释。[provider]段是 TaoToken 的接入点,base_url固定为https://taotoken.net/api,api_key填你在控制台生成的那个 Key。default_model决定当前用哪个模型,我默认填了 Claude,因为它在理解 ABAP 代码和 SAP 业务逻辑上表现比较稳。
[provider.models]段是一个模型别名表。这样设计的好处是,当你想从 Claude 切到 GPT 或国产模型时,只需要改default_model的值,不用动其他任何地方。比如把default_model = "claude-3-5-sonnet"改成default_model = "gpt-4o",重启服务就切换完成。
[[mcp.tools]]段声明了三个工具,都是只读的。sap_table_query用于查业务表,sap_config_lookup用于定位配置,sap_field_resolve用于字段反查。read_only = true这个标记很重要,它从配置层面约束了 AI 助手只能查、不能改,避免误操作生产数据。handler字段指向具体的实现脚本,这部分需要你根据自己环境写,可以是 Python 脚本,也可以是调用 ABAP RFC 的桥接程序。
关于 CC Switch 切换,如果你用的是 Claude Code 类的工具,它的配置通常也支持类似的模型切换。核心思路是一样的:把 TaoToken 的base_url和api_key写进它的 provider 配置,然后在模型选择处填[provider.models]里声明的别名。这样你在不同工具之间切换时,底层走的都是同一个 TaoToken 通道,Key 只需要维护一份。
4. 验证请求:跑通一次 MCP 工具调用
配置写完之后,必须做一次端到端的验证,确认「MCP 工具调用 → TaoToken 转发 → 模型返回」这条链路是通的。下面用一个最小示例来演示。
假设你的 MCP 服务已经启动,监听在127.0.0.1:8765。我们用一段 Python 脚本来模拟一次工具调用请求。这段脚本的作用是:向 MCP 服务发起sap_field_resolve工具调用,查询ZFBDT这个字段落在哪张表。
import requests import json MCP_ENDPOINT = "http://127.0.0.1:8765/mcp" payload = { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "sap_field_resolve", "arguments": { "field_name": "ZFBDT", "system": "S4H_DEV" } } } headers = { "Content-Type": "application/json" } resp = requests.post(MCP_ENDPOINT, headers=headers, data=json.dumps(payload), timeout=90) print("状态码:", resp.status_code) print("返回内容:", json.dumps(resp.json(), ensure_ascii=False, indent=2))运行这段脚本,如果链路正常,你会看到类似下面的返回。注意,实际返回的字段名和表名以你的系统为准,这里展示的是结构。
{ "jsonrpc": "2.0", "id": 1, "result": { "content": [ { "type": "text", "text": "字段 ZFBDT 位于表 BSIK 和 BSAK,类型为 DATS,描述为『基准日』。在 BSIK 中用于标识未清项的基准日期,常与付款条件 ZBD1T/ZBD2T/ZBD3T 配合计算账龄。" } ], "isError": false } }看到这个返回,说明三件事都成了:MCP 服务正常接收了工具调用请求;TaoToken 通道正常转发了模型请求;模型正常返回了业务解读。整个过程里,你的 SAP 侧代码只需要知道 MCP 服务的地址,不需要关心底层用的是哪个模型、Key 是什么。
如果你想进一步验证模型切换,把config.toml里的default_model从claude-3-5-sonnet改成gpt-4o,重启 MCP 服务,再跑一次同样的脚本。返回结构不变,但文本风格和解读角度可能会有差异。这就是统一 Key 接入的价值——切换成本几乎为零。
再补一个更贴近 SAP 业务的验证:调用sap_table_query查一条供应商未清发票。请求参数里传table_name = "BSIK"、company_code = "你的公司代码"、limit = 5。返回结果里应该能看到凭证号、供应商号、过账日期、币种、借贷标识等字段。这一步跑通,就说明你的 AI 助手已经能实际查 SAP 数据了。
5. 本篇常见错排查
配置和验证过程中,有几个错误出现频率特别高,我按排查顺序列出来。
第一个是401 Unauthorized。这个基本是api_key填错了,或者 Key 已经失效。去控制台重新生成一个,注意复制时不要带空格。还有一种可能是base_url写成了带 UTM 参数的官网地址,正确写法是https://taotoken.net/api,不带任何查询字符串。
第二个是404 Not Found。如果请求 MCP 服务返回 404,检查MCP_ENDPOINT的路径是否正确,有些 MCP 实现是/mcp,有些是/v1/mcp,以你的服务实际路由为准。如果请求 TaoToken 返回 404,检查base_url后面有没有多写斜杠或路径。
第三个是timeout。SAP 侧查询大表时,模型等待时间可能超过默认超时。在config.toml里把timeout_seconds调到 120 甚至 180,tool_timeout_seconds调到 90。同时检查 SAP 侧的 RFC 连接是否稳定,网络抖动也会导致超时。
第四个是模型返回内容为空。这种情况通常是default_model填的模型名不在[provider.models]的声明里,或者模型名拼写错误。对照文档里的模型列表核对一遍。另外,如果max_retries设得太小,偶发的限流也会导致空返回,建议设成 2 或 3。
第五个是 MCP 工具调用返回isError: true。这通常是handler指向的脚本执行失败,比如 SAP 连接参数不对、表名不存在、字段名拼错。先单独跑一遍 handler 脚本,看它的报错信息,再回到 MCP 层排查。日志文件logs/sap-ai-assistant.log里会有详细的调用链记录,优先看这个。
第六个是 CC Switch 切换后不生效。检查切换工具里的 provider 配置是否指向了 TaoToken 的base_url,以及模型别名是否和config.toml里声明的一致。有些工具会缓存上一次的配置,切换后需要重启工具进程。
6. 从最小链路到可用助手
跑通上面这条链路之后,你手里就有了一个可扩展的骨架。接下来可以做的方向有几个:把sap_table_query的 handler 扩展成支持更多表,比如 EKPO、MSEG、VBRK;给sap_config_lookup加一个 IMG 路径缓存,减少重复查询;在 MCP 层加一个权限校验,确保不同用户只能查自己有权限的公司代码和工厂。
如果你打算把这套助手用在长期的编码和 Agent 任务上,比如让它持续跟踪 ABAP 代码变更、自动生成报表逻辑,建议看一下 Coding Plan 的说明 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它在长任务场景下的通道稳定性更好。接入细节和字段说明以官方文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 为准,配置字段有更新时以文档为最终依据。
最后提醒一句:SAP 生产系统的数据敏感度很高,MCP 工具的read_only标记一定要保留,handler 里也要做二次校验,确保只走 SELECT,不走任何写操作。AI 助手查数、人做决策,这个边界守住了,整套方案才站得住。