1. 为什么 SAP 开发者需要一条统一的 AI 工程链路如果你同时写 ABAP、调 CDS、偶尔还要看 HANA 侧的执行计划大概率经历过这种割裂Claude Code 在终端里帮你改 TypeScript 脚本切到 Eclipse ADT 又要手动搜类、改方法、跑语法检查、激活、看 ATC再切到 HANA Studio 或 Database Explorer 查 SQL。工具之间没有共享上下文AI 助手也够不到 SAP 系统里的真实对象。vibing-steampunk核心程序叫vsp想解决的就是这件事。它是一个 ADT ↔ MCP Bridge把 SAP ADT 的/sap/bc/adt/*接口封装成 MCP 工具让 Claude Code 这类 coding agent 通过标准 JSON-RPC 调用完成读代码、改方法、语法检查、激活、跑 ABAP Unit、查 CDS 依赖、看传输历史等动作。它不是 ABAP 示例仓库而是面向 SAP 系统的 AI Agent 开发网关。但这里有个现实问题Claude Code 本身要连模型vsp 要连 SAP两条链路各有各的 Key 和配置。如果模型侧用一家、SAP 侧再维护一套凭据配置会散落在settings.json、.mcp.json、.env好几个文件里。这篇就按“统一 Key 统一配置骨架”的思路把 Claude Code、SAP ADT、ABAP Cloud、HANA 这条链路一次性串起来。适合已经在用 Claude Code、手上有 DEV 或 BTP ABAP 环境、想跑通 MCP 接入的 SAP 开发者。2. TaoToken 前置统一模型侧 Key 与接入地址在整条链路里TaoToken 承担的是模型侧统一入口的角色。Claude Code 需要调用大模型来完成代码理解和生成TaoToken 提供兼容的 API 地址和 Key这样你不需要在多个模型供应商之间来回切换配置。SAP 侧的 ADT 连接仍然走你自己的系统凭据两者职责分开配置才不会互相污染。先把模型侧的信息准备好官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基地址https://taotoken.net/api控制台创建和管理 Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keys 管理页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite注意API 基地址https://taotoken.net/api后面不加 UTM 参数直接作为base_url使用即可。Key 只在控制台生成不要写进会提交到 Git 的文件里。如果你后面要长期跑编码任务或 Agent 流程可以了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。只是想先验证模型通不通用模型对话页更快https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 。3. 可复制配置settings.json 与 config.toml 骨架这一节是全文的核心。整条链路分两层配置Claude Code 的模型侧配置和 vsp 的 SAP 侧配置。先建目录再分别落文件。3.1 目录结构约定建议在项目根目录下这样组织避免配置散落vibing-steampunk-demo/ ├── .claude/ │ └── settings.json ├── .vsp/ │ ├── config.toml │ └── cookies.txt # 仅 cookie 认证时需要 ├── .mcp.json └── .env # 本地凭据务必加入 .gitignore.gitignore至少包含.env .vsp/cookies.txt .vsp/config.toml3.2 Claude Code 的 settings.jsonClaude Code 通过环境变量读取模型侧配置。把 TaoToken 的地址和 Key 写进settings.json的env段{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的TaoTokenKey, ANTHROPIC_MODEL: claude-sonnet-4-20250514, ANTHROPIC_SMALL_FAST_MODEL: claude-3-5-haiku-20241022 }, permissions: { allow: [ mcp__vsp__search, mcp__vsp__read_source, mcp__vsp__syntax_check ], deny: [ mcp__vsp__delete_object ] } }这里permissions.allow只放只读和检查类工具写入类工具先不放开等只读链路验证通过再逐步加。ANTHROPIC_MODEL按你实际可用的模型名填不要照抄。3.3 vsp 的 config.tomlvsp 的 SAP 侧配置放在config.toml。下面是一个 basic auth 场景的骨架字段名以你本地vsp config init生成的示例为准[sap] url https://your-dev-system.example.com:44300 client 100 language ZH auth_type basic [sap.basic] user YOUR_DEV_USER password YOUR_DEV_PASSWORD [server] mode focused read_only true allowed_packages [$ZAI_SANDBOX, $ZSD_EXT_AI] allowed_ops [read, search, syntax_check, unit_test] [logging] level info file .vsp/vsp.log几个关键点必须说清楚url是能访问/sap/bc/adt的 Web 地址从 Fiori Launchpad 或浏览器地址栏拿不是SAP Logon 里的 message server 或 group server。client是 SAP 客户端号三位数字。read_only true是第一道防线先只读跑通。allowed_packages限定 agent 能碰的包别一上来就给$TMP之外的正式包。3.4 .mcp.json 把 vsp 注册给 Claude CodeClaude Code 通过.mcp.json发现 MCP server{ mcpServers: { vsp: { command: /usr/local/bin/vsp, args: [serve, --config, .vsp/config.toml], env: { SAP_URL: https://your-dev-system.example.com:44300, SAP_USER: YOUR_DEV_USER, SAP_PASSWORD: YOUR_DEV_PASSWORD } } } }command换成你本地 vsp 二进制的实际路径Windows 下是vsp.exe的完整路径。env里的凭据也可以只放.env再被 shell 加载避免明文进 JSON。4. 验证请求从连接测试到一次真实读取配置写完不能直接让 agent 改代码先分层验证。我一般按“连接层 → 授权层 → 读取层 → 写入层”四步走。4.1 连接层确认 ADT 端点可达先单独跑 vsp 的连接测试不经过 Claude Codevsp -s dev search zcl_* --type CLAS --max 50如果返回对象列表说明 HTTPS、证书、认证都通了。如果报连接超时先确认url是不是 Web 地址再确认网络能到该主机的 44300 端口。4.2 授权层确认用户权限够用用同一个用户跑一次语法检查确认有 repository 读权限和检查权限vsp -s dev syntax-check ZCL_PR_APPROVAL_STATUS --type CLAS返回检查结果哪怕有 warning就说明授权层没问题。如果报 403去 SAP 侧确认用户角色里有没有 ADT 相关授权。4.3 读取层让 Claude Code 通过 MCP 读真实代码启动 Claude Code在会话里发一条只读请求用 vsp 的 search 工具找 ZCL_PR_APPROVAL_STATUS然后读取它的源码 只输出方法签名列表不要修改任何东西。Claude Code 会调用mcp__vsp__search和mcp__vsp__read_source。如果它能准确列出方法签名说明 MCP 链路通了。这一步是整个配置的验收点。4.4 写入层在 sandbox 包做一次最小修改只读稳定后把read_only改成falseallowed_ops加上edit但allowed_packages仍然只留 sandbox 包。然后让 agent 改一个方法内部逻辑在 $ZAI_SANDBOX 包里把 ZCL_PR_APPROVAL_STATUS 的 get_status_text 方法 里 Pending 改成 In Approval改完跑语法检查和 ABAP Unit。vsp 的 EditSource 工作流会匹配 old string、确认唯一性、语法检查、lock、update、unlock、activate。返回激活成功和测试结果写入层就算跑通了。5. 本篇常见错排查配置这条链路时报错基本集中在下面几类。我把踩过的坑按现象、原因、动作整理成表方便对照。现象可能原因排查动作连接超时 / connection refusedurl填成了 message server 或 group server换成浏览器里 Fiori Launchpad 的 Web 地址确认端口401 Unauthorized用户名密码错或 client 号不对核对client三位数确认用户未被锁定403 Forbidden用户缺 ADT 授权在 SAP 侧补 ADT 相关角色重跑 syntax-checkMCP server 未启动.mcp.json里 command 路径错用绝对路径Windows 下确认.exe后缀Claude Code 看不到 vsp 工具.mcp.json没被加载重启 Claude Code确认文件在项目根目录语法检查报 ABAP SQL 语法错agent 用了标准 SQL 写法明确告诉它用 ABAP SQLORDER BY col DESCENDING而非DESC限行用max_rows而非LIMIT激活失败提示对象被锁对象已在开放 transport 里先释放或切换 transport再重试写入被拒allowed_packages没包含目标包把目标包加进白名单或换到 sandbox 包测试几个补充提醒。第一SAP_URL和SAP_USER这类环境变量如果同时在.env和.mcp.json里出现以进程实际加载的为准排查时先确认哪个生效。第二cookie 认证场景下cookies.txt会过期报 401 时先重新导出。第三BTP ABAP environment 用的是__VCAP_ID__和JSESSIONID和 on-premise 的 cookie 名不一样别混用。如果排障时不确定模型侧配置对不对可以先用模型对话页单独验证 Key 是否可用https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 。确认模型侧没问题再回头查 SAP 侧。6. 把链路固定下来权限、审计与后续接入链路跑通只是开始真正决定它能不能长期用的是边界设计。我的建议是把配置分成三档环境sandbox 允许读写、DEV 只读加白名单写、QAS 和生产只读。read_only、allowed_packages、allowed_ops、allowed_transports这几个开关就是你的防线别嫌麻烦。审计方面把logging.file指向固定路径定期看 agent 到底调了哪些工具、改了哪些对象。涉及表数据读取的操作强制max_rows业务数据输出做脱敏。这些纪律固化进 prompt 模板比事后追责有用得多。后续如果你要把这条链路接到更多工具模型侧继续用 TaoToken 统一 Key 就行新工具只要读同一套环境变量。Key 管理和文档都在控制台和接入文档里API Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite长期编码 / Agent 流程https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewriteClaude Code 侧如果要接 Anthropic 兼容的编码工作流可以参考https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-codeutm_campaignrewrite 。把模型侧和 SAP 侧分开治理这条 vibing-steampunk 工程链路才能既跑得快又不失控。
