1. 先搞清楚:SAP ADT MCP 到底卡在哪一层
SAP ADT MCP 是 SAP 官方给 ABAP Development Tools 配的 MCP Server,用来让 Agent 在 ABAP 开发任务里调用一组受控工具。它当前公开的能力集中在生成对象、运行 ABAP Unit、激活对象这类任务型动作上,而没有把「读取任意 ABAP 开发对象源码」做成一个普通 Agent tool 暴露出来。这个现象对用 Cline、CC Switch 接入 SAP 的开发者来说很反直觉:VS Code ADT 明明能打开对象、看源码、查引用,为什么换成 Agent 就不行了?
关键差异在于调用主体变了。IDE 里的 read 是人点开一个对象,单点、可见、有界面反馈;MCP 里的 read 一旦做成 tool,就变成 Claude Code、Copilot、Cline 这类 Host 可以在 Agent loop 里主动、连续、批量调用的外部能力。Agent 为了回答一个问题,可能顺着 association、composition、where-used 一路读下去,读取范围远超开发者原本想给模型看的内容。所以这不是「ADT 后端没有读对象能力」,而是官方在 MCP 这一层做了边界选择。
这篇面向已经在用 Cline / CC Switch 接 SAP 场景的开发者,交付一套 TaoToken 统一 Key 通道的 settings.json / config.toml 可复制骨架,并给出 MCP 工具列表探测与 read 能力缺失的验证动作。你可以照着把通道搭起来,再用探测结果确认当前 ADT MCP 到底暴露了哪些 tool。
2. 前置:用 TaoToken 统一 Key 通道接 MCP Host
在验证 ADT MCP 工具边界之前,先把模型通道理顺。Cline、CC Switch、Claude Code 这类 Host 各自要配 base_url 和 key,如果每个都单独填,切换和排障会很乱。我习惯用 TaoToken 做统一入口:一个 Key 走所有 Host,base_url 指向https://taotoken.net/api,模型名按需选。
TaoToken 在这里的角色是模型调用通道,不替代编辑器,也不碰你的 SAP 系统。它解决的是「Agent 侧模型请求从哪走」的问题,SAP 侧的 ADT MCP Server 仍然由 VS Code ADT 扩展自己管理。两者是分开的:模型通道归 TaoToken,ABAP 工具通道归 ADT MCP。
先拿 Key。打开控制台创建 API Key,建议按用途分 Key,比如cline-sap、ccswitch-sap各一个,方便后面看调用量时区分。创建入口在控制台的 API Keys 页面:
控制台与 API Keys:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
拿到 Key 后先别急着写进配置文件,用一条 curl 确认通道通不通,避免后面把「模型通道问题」误判成「ADT MCP 问题」:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "reply with ok"}], "max_tokens": 16 }'返回里有choices[0].message.content就说明通道正常。这一步很关键,因为后面探测 ADT MCP 工具列表时,如果 Agent 报错,你要能快速区分是模型通道挂了还是 MCP Server 没连上。
3. 可复制配置:settings.json 与 config.toml 骨架
下面给两套骨架,分别对应 Cline(VS Code settings.json 风格)和 CC Switch(config.toml 风格)。把sk-xxxx换成你自己的 TaoToken Key,model按你实际可用的模型名填。
3.1 Cline 侧 settings.json 骨架
Cline 的模型配置在 VS Code 设置里,用 JSON 写更清楚。核心是baseUrl指向 TaoToken API,apiKey用你的 Key,model选一个支持 tool use 的模型——这点很重要,因为 ADT MCP 的工具调用依赖模型能正确发起 tool call:
{ "cline.apiProvider": "openai", "cline.openAiBaseUrl": "https://taotoken.net/api", "cline.openAiApiKey": "sk-xxxx", "cline.openAiModelId": "claude-sonnet-4-20250514", "cline.enableMcp": true, "cline.mcpServers": { "sap-adt": { "command": "node", "args": ["/path/to/adt-mcp-server/index.js"], "env": { "ADT_HOST": "https://your-sap-host:44300", "ADT_CLIENT": "100", "ADT_USER": "DEVELOPER", "ADT_PASSWORD": "your-password" } } } }这里sap-adt这个 MCP Server 的启动方式取决于你用的是官方 ADT MCP 还是第三方实现。官方内置的走 VS Code ADT 扩展自己的连接,第三方(比如基于 abap-adt-api 的)才需要你手动填 command 和 env。如果你用的是官方扩展,mcpServers这段可以省掉,工具列表由扩展在 Copilot Chat 的 Configure Tools 里管理。
3.2 CC Switch 侧 config.toml 骨架
CC Switch 用 TOML,结构更扁平。同样把模型通道指向 TaoToken,MCP 部分单独列:
[model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "sk-xxxx" model = "claude-sonnet-4-20250514" max_tokens = 8192 [mcp.sap-adt] transport = "stdio" command = "node" args = ["/path/to/adt-mcp-server/index.js"] [mcp.sap-adt.env] ADT_HOST = "https://your-sap-host:44300" ADT_CLIENT = "100" ADT_USER = "DEVELOPER" ADT_PASSWORD = "your-password"两个骨架的共同点是:模型通道和 MCP 通道解耦。TaoToken 只管base_url和api_key这一段,ADT 连接参数归 MCP Server 自己。这样你换模型、换 Key 时不用动 SAP 配置,排查时也能分层定位。
注意:ADT 密码不要明文提交到 Git。用环境变量或本地 secret 管理,配置文件里只留占位符。
4. 验证:探测 MCP 工具列表,确认 read 能力缺失
配置写完后,别直接让 Agent 去读 ABAP 对象——大概率会失败,而且失败信息不一定清楚。正确做法是先探测工具列表,看 ADT MCP 到底注册了哪些 tool,再判断 read 是不是真的不在里面。
4.1 用 MCP 协议直接列工具
MCP 的 tools 列表通过tools/list方法获取。如果你用的是 stdio 型 MCP Server,可以手动起一个会话发请求。下面用一段 Node 脚本模拟 MCP Host 的初始化加列工具流程:
// probe-mcp-tools.mjs import { spawn } from "node:child_process"; const server = spawn("node", ["/path/to/adt-mcp-server/index.js"], { env: { ...process.env, ADT_HOST: "https://your-sap-host:44300" } }); let buf = ""; server.stdout.on("data", (d) => { buf += d.toString(); for (const line of buf.split("\n")) { if (!line.trim()) continue; try { const msg = JSON.parse(line); if (msg.id === 2) { console.log("TOOLS:", JSON.stringify(msg.result, null, 2)); server.kill(); } } catch {} } }); function send(obj) { server.stdin.write(JSON.stringify(obj) + "\n"); } send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: "2024-11-05", capabilities: {}, clientInfo: { name: "probe", version: "1.0" } } }); setTimeout(() => send({ jsonrpc: "2.0", id: 2, method: "tools/list", params: {} }), 500);跑完你会拿到一个 tools 数组。重点看每个 tool 的name和description。按当前官方 ADT MCP 的公开边界,你大概率会看到生成、测试、激活类工具,而看不到类似read_object_source、getObjectSource、search_objects这种泛化读取工具。
4.2 用 Agent 侧做一次负向验证
工具列表确认后,再让 Agent 实际试一次读取,观察它怎么失败。在 Cline 里发一条明确指令:
请用 sap-adt MCP 读取类 ZCL_DEMO_ORDER 的源代码,并贴出前 20 行。预期结果是 Agent 找不到对应的 read tool,要么回复「没有可用工具读取源码」,要么尝试用别的工具绕但失败。这个负向验证很有价值:它证明限制在工具注册层,而不是你的连接或权限配错了。如果 Agent 报的是连接错误、认证失败,那问题在 ADT 连接,不在 read 能力边界。
4.3 对照第三方实现看差异
想确认「技术上能读」这件事,可以临时接一个第三方 ADT MCP 做对照。基于 abap-adt-api 的开源实现通常注册了getObjectSource、searchObject、transportInfo、lock、activate等工具,读取源码时在对象 URI 后拼/source/main。用同样的探测脚本跑一遍,你会看到工具列表明显更长,read 类工具在里面。
这个对照能帮你把结论钉死:官方 ADT MCP 缺 read,是产品边界选择,不是 ADT API 做不到。第三方敢放出来,是因为它把安全评估责任交给采用者;官方要为企业默认体验负责,所以首版更保守。
5. 本篇常见错排查
报错一:Agent 说没有 sap-adt 工具。先确认 MCP Server 进程起来了。stdio 型 Server 如果 command 路径写错,Host 不会报明显错误,只是工具列表为空。用第 4 节的探测脚本单独跑一次,能起来再回 Host 里看。
报错二:模型不发起 tool call。这通常是模型通道问题,不是 MCP 问题。有些模型对 tool use 支持不好,或者 TaoToken 侧选的模型不支持 function calling。换一个明确支持 tool use 的模型,再用 curl 确认通道返回正常。
报错三:ADT 认证失败 401/403。检查ADT_CLIENT、ADT_USER、ADT_PASSWORD和ADT_HOST端口。SAP 开发系统常见端口是 44300 起,别填成 8000。另外确认这个用户有对应开发包的权限,否则即使有 read tool 也会被后端拒。
报错四:把 read 缺失误判成配置错误。这是最容易踩的坑。Agent 读不到源码时,很多人反复改配置、换 Key、重装扩展,其实工具根本没注册。先用tools/list确认工具集合,再决定要不要继续调配置。
报错五:第三方 MCP 接上后读取范围失控。如果你为了验证接了第三方 read 工具,注意它可能一次读很多对象。建议只在非敏感自研包上试,别对着财务、人事、定价相关包跑 Agent 自动读取。
6. 后续怎么走:通道与工具分开治理
把模型通道和 MCP 工具通道分开治理,是这套配置最大的价值。TaoToken 负责模型请求的稳定入口,ADT MCP 负责 ABAP 工具边界,两边独立排障。当前官方 ADT MCP 不给 Agent 开放泛化 read,短期会让 Agent 没法像读本地 Git 仓库那样自由理解 ABAP 系统,但这也避免了企业在没准备好的情况下把核心知识资产交给自动上下文通道。
实操上,需要 Agent 理解某个对象时,先在 VS Code ADT 里手动打开,把必要片段交给 Agent;对非敏感自研包,可以接第三方 MCP 做受控实验;对敏感包,暂时不要让 Agent 自由读取。等官方提供更细粒度的 read policy 或 workspace scoped context,再纳入正式流程。
模型对话验证通道:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite
长期编码与 Agent 场景用 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite
接入文档与 MCP 配置参考:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
Claude Code 接入说明:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude_code&utm_campaign=rewrite