关于 sap-adt-mcp
sap-adt-mcp 通过 ADT 将 MCP 客户端连接到 SAP 系统,面向在单个或多个系统环境中工作的 ABAP 开发者。它提供开发工具、只读防护,并在本地记录写入操作。
主要功能
- 01读取和编辑 ABAP 源码
- 02运行语法检查、测试和 ATC
- 03搜索对象并浏览包
- 04比较版本与 SAP 系统
- 05管理传输请求和调试
- 06只读控制与本地写入审计
适用场景
- 01检查并更新 ABAP 对象
- 02检查代码质量并运行单元测试
- 03比较不同 SAP 系统中的源码
- 04查看变更和传输队列
MCP 相关
MCP 服务通过 50 多种高级工具以及通用请求工具和五个 Clean Core 提示词开放 ADT 操作。客户端可在已配置的 SAP 系统间选择,并可启用只读模式阻止写入。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y sap-adt-mcpSAP_ADT_MCP_CONFIGAbsolute path to your config.json (host/client/user/password per SAP system). Defaults to ~/.sap-adt-mcp/config.json. See config.example.json in the repo.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
sap-adt-mcp
通过 ADT 为 Claude(以及任何兼容 MCP 的客户端)提供实时访问 SAP 系统的 MCP 服务。
在聊天窗口或自主 Agent 中读取源代码、搜索代码库、运行语法检查、运行单元测试、运行 ATC、比较不同系统环境中的同一对象,以及编辑并激活 ABAP。无需在 SAP 技术栈上安装附加组件。
为什么
SAP 开发中有很多重复性工作:阅读源代码、检查调用方、比较系统。AI 助手擅长处理这类任务, 但前提是能访问系统。ADT(ABAP Development Tools)是 Eclipse 使用的 HTTP API;每个现代 NetWeaver 和 S/4 系统都自带 ADT。此服务代表 Agent 使用 ADT,让 Agent 能够在真实系统上执行实际工作, 并采用与您在 Eclipse 中授予开发者相同的身份验证和访问范围。
包含的内容
50 多个高级工具,封装了最常用的 ADT 端点,另提供一个通用扩展入口以处理其他需求,以及 5 个可由用户调用的 Clean Core 提示词,将工具集转化为以结果为导向的斜杠命令(详见下文的 Clean Core 提示词)。
| 类别 | 工具 |
|---|---|
| 连接 | adt_list_systems、adt_ping、adt_system_info |
| 源代码 CRUD | adt_get_source、adt_set_source |
| 质量 | adt_syntax_check、adt_pretty_print、adt_run_unit_tests、adt_run_atc、adt_run_atc_package、adt_run_atc_transport |
| 生命周期 | adt_create_object、adt_delete_object、adt_activate、adt_lock、adt_unlock、adt_list_inactive_objects |
| 版本 | adt_list_versions、adt_compare_versions |
| 发现 | adt_browse_package、adt_list_packages、adt_search_objects、adt_grep_source、adt_where_used |
| CDS | adt_cds_data_preview、adt_cds_dependencies、adt_list_released_apis |
| 跨系统 | adt_compare_source、adt_transport_diff |
| 传输 | adt_list_transports、adt_get_transport、adt_create_transport、adt_release_transport、adt_transport_queue |
| 运行时错误 | adt_list_dumps、adt_get_dump |
| 调试器 | adt_debug_set_breakpoint、adt_debug_delete_breakpoint、adt_debug_listen、adt_debug_stack、adt_debug_variables、adt_debug_step、adt_debug_goto_stack、adt_debug_set_variable、adt_debug_set_watchpoint、adt_debug_delete_watchpoint、adt_debug_stop |
| 数据 | adt_read_table、adt_value_help |
| 生成 | adt_rap_scaffold |
| 实验性¹ | adt_get_note、adt_check_note_status、adt_implement_note、adt_list_locks、adt_schedule_job、adt_read_spool |
| 扩展入口 | adt_request |
¹ 实验性工具面向 ADT 端点(SNOTE、SM12 锁定项、SM36/SP01),经典 NetWeaver 不提供这些端点;在此类系统上,它们会返回 available:false 并附带备用方案提示,而不会失败。在提供相应后端服务的系统上即可使用(通常为 S/4HANA)。
支持多系统。 一份配置即可连接多个 SAP 系统(DEV / QAS / PRD 或整个系统环境);可通过 system 参数切换,也可使用 adt_compare_source / adt_transport_diff 跨两个系统进行比较。
默认安全。 readOnly 标志(全局或按系统设置)会阻止所有写入方法。只读 POST 查询(搜索、使用位置查询、软件包树)仍可使用,因此 Agent 仍能进行发现。
稳健可靠。 每个请求都设有超时。自动协商 CSRF 令牌,并在遇到 403 时自动重试。可选择跳过自签名证书验证。还可选择将调试跟踪信息输出到 stderr。
结构化错误。 ADT 的 <exc:exception> 封装会解析为 { type, message, namespace },因此调用失败时不会将 XML 倒入 Agent 的上下文窗口。
安装
此软件包此前以
claude-for-abap名称发布——该软件包仍可使用,但已弃用;新安装请使用sap-adt-mcp。
# global
npm install -g sap-adt-mcp
# or run without installing
npx sap-adt-mcp
需要 Node.js 22.19+(作为 HTTP 客户端使用的 undici v8 要求此最低版本)。
配置
创建配置文件:
mkdir -p ~/.sap-adt-mcp
cp config.example.json ~/.sap-adt-mcp/config.json
$EDITOR ~/.sap-adt-mcp/config.json
服务按以下顺序查找配置:
$SAP_ADT_MCP_CONFIG(绝对路径)~/.sap-adt-mcp/config.json./config.json(服务启动时的当前工作目录)
配置示例
{
"defaultSystem": "DEV",
"readOnly": false,
"systems": {
"DEV": {
"host": "https://sap-dev.example.com:44300",
"client": "100",
"language": "EN",
"user": "DEVELOPER",
"password": "env:SAP_DEV_PASSWORD",
"rejectUnauthorized": false
},
"QAS": {
"host": "https://sap-qas.example.com:44300",
"client": "200",
"user": "DEVELOPER",
"password": "env:SAP_QAS_PASSWORD"
},
"PRD": {
"host": "https://sap-prd.example.com:44300",
"client": "300",
"user": "READONLY",
"password": "env:SAP_PRD_PASSWORD",
"readOnly": true
}
}
}
每个系统的选项
| 字段 | 含义 |
|---|---|
host | 基础 URL,包含协议和 ICM HTTPS 端口(例如 https://...:44300)。 |
client | SAP 客户端(设置 sap-client 查询参数)。 |
language | 可选的登录语言(设置 sap-language)。 |
user | RFC 用户。 |
password | 字面字符串,或用于从环境中读取密码的 env:VAR_NAME。 |
rejectUnauthorized | 设为 false 可跳过对自签名证书的 TLS 验证。默认值为 true。 |
readOnly | 阻止此系统的 POST / PUT / DELETE / PATCH 请求(只读 POST 查询仍可使用)。 |
timeoutMs | 覆盖默认的 30 秒请求超时时间。 |
只读模式
readOnly: true(顶层或按系统设置)会拒绝任何不安全的 HTTP 方法。
列入白名单的只读 POST 端点(nodestructure、search、
usagereferences、parsers、checkruns)仍可用,因此 Agent 仍能
发现和分析,但无法进行修改。
建议:为 QAS 和 PRD 配置文件设置 readOnly: true。DEV 保持可写。
自签名证书
许多内部 SAP 系统使用自签名证书。"rejectUnauthorized": false
仅会为该配置文件禁用 TLS 验证。不要在 PRD 上这样设置。
审计日志
服务器对 SAP 执行的每次写入操作(POST/PUT/DELETE/PATCH——锁定、 源代码更新、激活、传输操作)都会追加到本地 JSONL 文件中,其中包括触发操作的 MCP 工具,以及只读模式下遭拦截的尝试和 相应违规行为。读取和只读查询不会记录。任何内容都不会离开你的计算机—— 这就是你对“AI 到底改了什么?”的本地记录。
默认位置:~/.sap-adt-mcp/audit.log。每行一个 JSON 对象:
{"ts":"2026-06-11T12:00:00.000Z","tool":"adt_set_source","host":"https://...","sapUser":"DEVELOPER","method":"PUT","path":"/sap/bc/adt/programs/programs/ztest/source/main","status":200,"ok":true,"transport":"E4DK900123"}
配置或禁用:
{ "audit": { "enabled": false, "path": "/var/log/sap-adt-mcp/audit.log" } }
……或设置 SAP_ADT_MCP_AUDIT=0(也接受 false/no/off)。
结果缓存
Agent 在推理时会重复调用相同的发现工具。只读工具
adt_search_objects、adt_browse_package、adt_list_packages、
adt_where_used、adt_system_info 和 adt_value_help 的结果会按系统和参数集
在内存中缓存 60 秒。此服务器执行的任何写入都会清空整个缓存,因此你不会读到自己所做更改的过期结果;
其他位置(SAP GUI、Eclipse)所做的更改最多可能延迟一个 TTL。缓存的
结果会带有 _meta["sap-adt-mcp/cache"] = { hit: true, ageMs }。
{ "cache": { "ttlMs": 120000 } }
"ttlMs": 0(或 SAP_ADT_MCP_CACHE_TTL_MS=0)可关闭缓存。
自动错误报告
服务器会向维护者发送简短的已脱敏报告,以便发现并修复缺陷。此功能默认开启,服务器启动时会打印通知说明这一点。报告有三个渠道:
- 崩溃 — 工具处理程序抛出意外错误。
- ADT 错误 — 工具返回非 2xx 的 ADT 响应,且分类器将其标记为可能的工具缺陷(406/415 内容协商错误、格式错误的请求、服务器分发器崩溃)。用户/业务端响应(401/403/404、锁定和入队冲突、数据预览 SQL 错误)不会上报。
- Agent 上报 — 调用工具的 Agent 通过
adt_report_issue工具提交另外两个渠道无法发现的缺陷(成功响应中的数据错误、被忽略的参数、缺少的功能)。
发送的内容:sap-adt-mcp 版本、Node 版本、操作系统、工具名称,以及用于去重的错误/发现内容指纹;还包括一个匿名安装 ID(随机字节,缓存在 ~/.sap-adt-mcp/install-id),用于在分类处理时将同一安装的重复报告归组——它无法识别你或你的系统。任何内容离开你的计算机之前,都会清除其中的主机名、用户、密码、令牌、IP 和电子邮件地址;工具参数和自由文本字段也会以同样方式脱敏。报告
会发送到维护者拥有的中继服务,由其创建/去重 GitHub issue——GitHub 凭据由中继服务保管,本软件包不会持有。
全部关闭:
{ "reporting": { "enabled": false } }
……或设置 SAP_ADT_MCP_REPORT=0(也接受 false/no/off)。更精细的控制:
| 键 | 默认值 | 作用 |
|---|---|---|
reporting.enabled | true | 控制全部三个渠道的总开关。 |
reporting.adtErrors | true | 渠道 2(自动上报标记的 ADT 错误)。 |
reporting.allowManual | true | 渠道 3(adt_report_issue 工具)。 |
reporting.includeArgs | true | 包含已脱敏的工具参数/复现参数。注意:对象名称可能会出现在其中。 |
reporting.endpoint | 中继 URL | 指向你自己的中继服务(参见 worker/)。 |
连接客户端
Claude Code(CLI)
claude mcp add sap-adt -- npx sap-adt-mcp
通过注册传递密钥:
claude mcp add sap-adt \
--env SAP_DEV_PASSWORD=... \
--env SAP_PRD_PASSWORD=... \
-- npx sap-adt-mcp
Claude Desktop
编辑 claude_desktop_config.json(Settings → Developer → Edit Config):
{
"mcpServers": {
"sap-adt": {
"command": "npx",
"args": ["-y", "sap-adt-mcp"],
"env": {
"SAP_DEV_PASSWORD": "..."
}
}
}
}
完全退出并重启 Claude Desktop(系统托盘 → Quit),使更改生效。
连接前验证
npx sap-adt-mcp --validate-config
加载配置并对每个系统执行 ping;如果有任何系统无法访问或拒绝凭据,则以非零状态码退出。排查问题时,请先运行此命令。
工具
对象源代码的增删改查
| 工具 | 用途 | 说明 |
|---|---|---|
adt_get_source | 按对象名称和类型获取 ABAP 源代码。 | 返回纯文本。对于类,可通过 include 选择包含文件:main(默认)、definitions、implementations、macros、testclasses。函数模块需要 group。对于大型对象,可传入 outputFile,将源代码直接写入磁盘(响应中不包含内联的 source)。 |
adt_set_source | 替换源代码。负责依次执行 lock → PUT → unlock。 | 通过 source 内联提供新源代码;对于超过单次调用 I/O 限制的大型对象,可通过 sourceFile(MCP 自行读取的本地路径)提供。可选的 transport 会将更改分配给一个 TR(corrNr);可选的 lockHandle 可复用外部获取的锁。在 readOnly: true 时拒绝执行。 |
adt_create_object | 在程序包中创建新的 ABAP 对象。 | 支持的类型:program、class、interface、include、functiongroup、function、cds、accesscontrol、metadataext、behaviordef、messageclass。创建后,使用 adt_set_source 设置源代码正文并激活。在 readOnly: true 时拒绝执行。 |
adt_delete_object | 删除对象。 | 获取锁并执行 DELETE。在 readOnly: true 时拒绝执行。 |
adt_activate | 激活一个或多个对象。 | 传入 objects: [{ name, type, group? }]。 |
adt_pretty_print | 运行 SAP 端的 ABAP 格式化工具。 | 无状态——传入源代码,获取格式化后的源代码。 |
adt_lock / adt_unlock | 获取 / 释放锁,以便执行多步编辑。 | 对于一次性编辑,优先使用 adt_set_source(它会为你管理锁)。如果需要在单个 Agent 回合中的多次写入之间保持对象锁定,请使用这些工具。 |
质量
| 工具 | 用途 | 说明 |
|---|---|---|
adt_syntax_check | 对对象执行 ADT 语法检查。 | 返回 <chkrun:reports> XML;Agent 会读取严重性和行号。 |
adt_run_unit_tests | 运行 ABAP Unit。 | 传入测试容器对象(通常是类)。 |
adt_run_atc | 运行 ABAP Test Cockpit。 | API 接口因 NW 版本而异——请参阅注意事项。 |
发现
| 工具 | 用途 | 说明 |
|---|---|---|
adt_browse_package | 查看程序包内容的一个层级。 | 按类型返回 counts。超过 500 个对象时仅返回前 500 个条目(truncated: true);full: true 会返回全部条目。 |
adt_list_packages | 从根程序包开始递归遍历。 | 支持 prefix(仅向下遍历匹配的子程序包)和安全上限 maxPackages(默认值为 200)。始终按类型返回 totals;当树中对象超过 500 个时,除非设置 full: true,否则不返回各程序包的 entries(但仍保留计数)。 |
adt_search_objects | 按名称模式快速搜索。 | 支持通配符 *。返回经过解析的 { name, type, description, packageName, uri } 记录。 |
adt_where_used | 使用位置列表。 | 返回相同格式的解析记录。结果上限为 maxResults(默认值为 200);如果列表被截断,响应会包含后端自身的 numberOfResults 和 truncated。 |
跨系统
| 工具 | 用途 | 说明 |
|---|---|---|
adt_compare_source | 比较两个系统中的同一对象。 | 返回统一差异和 { added, removed } 统计信息。 |
adt_transport_diff | 比较两个系统中某个 TR 内的所有对象。 | 结果上限为 maxObjects(默认值为 50)。 |
运行时错误
| 工具 | 用途 | 备注 |
|---|---|---|
adt_list_dumps | 列出 ST22 短转储。 | 可选筛选条件:user、host、from/to(YYYYMMDD)、maxResults(默认为 20)。将 Atom 源解析为结构化条目,其中包含 runtimeError、program、user、updated,并将特定于版本的 rba:*/dump:* 字段作为映射呈现。由于某些版本会忽略服务端上限,因此会在客户端进行截断。 |
adt_get_dump | 按 ID 获取单个转储。 | 分两步获取:先获取元数据 XML(运行时错误、程序、链接),再从 dump:link relation="contents" 子资源获取格式化的转储文本。返回一个 chapters 映射(shortText、whatHappened、errorAnalysis、howToCorrect、whereTerminated、sourceCodeExtract 等)。传入 chapters: [...] 可限制内容,传入 full: true 可包含原始文本。 |
调试器
通过 ADT 的 /sap/bc/adt/debugger/* API 使用外部 ABAP 调试器。设置断点,
等待会话命中断点,然后检查调用栈/变量、单步执行,并(在保护机制下)更改值。后端需要调试授权;最低要求为
NW 7.31 SP04 + Kernel 7.21(S/4 上也适用)。
| 工具 | 用途 | 备注 |
|---|---|---|
adt_debug_set_breakpoint | 设置外部断点。 | 提供 uri,或 object+type(+include)+line。可选的 condition。返回断点 id。 |
adt_debug_delete_breakpoint | 根据 id 移除断点。 | |
adt_debug_listen | 在限定时间内等待被调试程序命中断点。 | 返回 { caught: true, debuggee, … } 并自动附加;超时则返回 { caught: false }(默认 30 s,最多 55 s)——再次调用即可。每个进程只能有一个监听器。 |
adt_debug_stack | 获取已附加的被调试程序的调用栈。 | |
adt_debug_variables | 读取变量值。 | names: ['sy-subrc','lv_total'];省略时返回作用域根节点。 |
adt_debug_step | 推进执行。写操作。 | kind:into / over / return / continue / runToLine / jumpToLine(需要 uri)/ terminate。若 continue 使运行结束,则返回 status: "debuggeeEnded"——这表示成功。 |
adt_debug_goto_stack | 切换活动栈帧。写操作。 | stackUri(来自调用栈)或从 0 开始的 position。 |
adt_debug_set_variable | 设置变量值。写操作。 | name + value。更改当前会话状态。 |
adt_debug_set_watchpoint / adt_debug_delete_watchpoint | 在变量发生更改时中断。写操作。 | 尽力而为——观察点契约没有参考实现;请在实时运行中检查 raw。 |
adt_debug_stop | 结束会话:恢复被调试程序,然后删除监听器及其设置的所有断点。 | 完成后请调用,以免留下未清理的内容或让请求一直处于挂起状态。release: false 会跳过恢复操作。 |
典型流程:
1. adt_debug_set_breakpoint { object: "ZREPORT", type: "program", line: 42 } → id
2. adt_debug_listen {} → ARM IT FIRST, then trigger the run
3. (trigger: a Fiori/OData call, an ADT classrun, an RFC, a job)
4. listen returns caught:true → already attached (or caught:false → call again)
5. adt_debug_stack {} → where execution paused
6. adt_debug_variables { names: ["sy-subrc", "lv_total"] }
7. adt_debug_step { kind: "over" } → advance; or set_variable / continue
8. adt_debug_stop {} → resume the debuggee + cleanup
外部断点会捕获什么: HTTP/ICF(Fiori、OData、ADT)、RFC 和后台会话——不会捕获你自己的 SAP GUI 对话会话。从 SE38 使用 F8 运行报表不会捕获任何内容,也不会打开调试器;这看起来像功能失效,实际并非如此。要调试仅限对话会话的代码,请在 ICF 会话中使用一次性的 IF_OO_ADT_CLASSRUN 包装类运行,并触发
POST /sap/bc/adt/oo/classrun/<class>:
METHOD if_oo_adt_classrun~main.
DATA lt_list TYPE TABLE OF abaplist.
" There is no screen in an ICF session, so list output must go to memory.
SUBMIT zoy_dbg_target EXPORTING LIST TO MEMORY AND RETURN.
ENDMETHOD.
SUBMIT 会打开一个全新的程序上下文,因此你调试的是目标报表本身。
时序: 在触发运行之前启动 adt_debug_listen——对于快速请求(Fiori/OData),点击后再启动监听已经太迟。被捕获的被调试程序随后只会等待约 15–20 s 以供附加,然后便会自行恢复,因此 listen 会立即附加,中间不会有其他往返。因而,caught: false 可能有三种原因:运行尚未发生、监听器启动太晚,或该行在此流程中从未执行——请保留一个已知可用的控制断点,以便区分断点错误和设置问题。
只读模式: 允许检查(断点、监听、调用栈、变量);在 readOnly: true 下,上述写操作工具(step、goto-stack、set-variable、观察点)会被拒绝。默认情况下,不允许调试其他用户的会话(requestUser);可通过 "debug": { "allowRequestUser": true } 按系统启用(需要后端调试授权)。
数据
| 工具 | 用途 | 备注 |
|---|---|---|
adt_read_table | 通过 ADT Data Preview API 执行 OpenSQL SELECT。 | 类似 SE16 的表读取。仅允许 SELECT——INSERT/UPDATE/DELETE 会在客户端被拒绝;SAP 端点也会在服务器端强制执行此限制。maxRows 上限为 5000(默认值为 100)。需要 NetWeaver 7.55+ / S/4HANA。 |
adt_system_info | 当前连接的是哪个系统? | 从表 CVERS 读取产品信息(S/4HANA 版本、ECC 或普通 NetWeaver)、SAP_BASIS 发行版和 SP 级别,以及是否支持 ABAP Cloud(SAP_BASIS ≥ 7.57)。includeComponents: true 会列出所有已安装组件。与 adt_read_table 使用相同的 Data Preview 基线。 |
adt_value_help | 为域、数据元素或 table + field 提供类似 F4 的值帮助。 | 返回带文本的域固定值(DD07L/DD07T);否则,按所请求的语言联接检查表 / 值表及其文本表(language:ISO EN/TR 或 SAP 键;默认使用配置文件语言)。includeCheckTable 即使在存在固定值时也会读取检查表。不评估搜索帮助。与 adt_read_table 使用相同的 Data Preview 基线。 |
传输
| 工具 | 用途 | 备注 |
|---|---|---|
adt_list_transports | 按用户 / 状态列出 TR。 | 默认用户 = 配置用户;默认状态 = modifiable。 |
adt_get_transport | TR 标头 + 对象。 | |
adt_create_transport | 创建新的 TR。 | readOnly: true 时会拒绝。端点结构各不相同——请参阅注意事项。 |
adt_release_transport | 释放 TR。 | readOnly: true 时会拒绝。 |
adt_transport_queue | TR 当前处于什么位置? | 在 systems 中的每个系统(例如 ["DEV","QAS","PRD"])上读取 E070(状态、所有者、目标)和 TPALOG(tp 步骤 + 返回码),并按目标报告:exported、in-import-queue、imported、imported-with-errors、import-aborted。任务会解析为其请求。无法访问的系统会被报告,但不会导致操作失败。通过 ADT 无法访问 TMS 缓冲区文件,因此 in-import-queue 状态来自已记录的转发步骤。 |
备用方案
adt_request — 直接调用 ADT REST。用于高层工具未涵盖的特殊端点。会自动处理身份验证 / CSRF / cookies / sap-client。
对象类型
友好别名(任一列中的名称均可使用):
| 别名 | TADIR 代码 |
|---|---|
| 程序 / 报表 | PROG |
| 包含程序 | INCL |
| 类 | CLAS |
| 接口 | INTF |
| 函数组 / fm | FUGR/FF(需要 group) |
| 函数组 | FUGR |
| 表 / 结构 | TABL |
| 数据元素 | DTEL |
| 域 | DOMA |
| cds / ddls | DDLS |
| 访问控制 / dcls | DCLS |
| 元数据扩展 / ddlx | DDLX |
| 行为定义 / bdef | BDEF |
| 消息类 / msag | MSAG |
技能(打包的工作流)
原始工具是构建模块;skills/ 提供了为 Claude Code 准备的现成工作流,可用于编排这些工具。每个 SKILL.md 都列出了自身的前置条件(最低 NetWeaver 版本、所需授权、是否兼容只读操作)。
| 技能 | 功能 | 只读操作可用? | 最低系统要求 |
|---|---|---|---|
transport-release-gate | 对 TR 进行发布前质量检查:非活动对象、锁、语法、ATC、单元测试 → 放行/不放行报告。是否发布仍由人工决定。 | 基本可用(单元测试和发布需要写入权限) | NW 7.50+,已配置 ATC |
dump-triage | ST22 分类:将转储归入不同类别,深入分析问题最严重的转储,为每类问题找出根因和修复方案。 | 可以——可安全用于 PRD | NW 7.50+(转储源) |
legacy-code-doc | 对遗留 Z 代码进行逆向文档编写:结构、数据库交互点、调用方、风险、S/4 迁移说明。 | 可以——可安全用于 PRD | NW 7.4x+(7.55+ 提供数据样本) |
abap-clean-core | SAP Clean Core 框架知识:级别、决策框架、治理。 | 可以(仅限知识查询) | 无 |
要使用某项技能,请将其文件夹复制到项目的 .claude/skills/(或复制到 ~/.claude/skills/,以供所有项目使用):
cp -r node_modules/sap-adt-mcp/skills/dump-triage .claude/skills/
# or from a clone: cp -r sap-adt-mcp/skills/dump-triage .claude/skills/
Claude Code 会自动加载这些技能;当对话符合条件时就会触发(例如,“E4DK900123 是否可以安全发布?”→ transport-release-gate)。
Clean Core:提示词 + 参考资料
此服务为 SAP S/4HANA 工作提供可选启用的 Clean Core 层。 它由两部分组成,并且特意将两者分开:
- 五个 MCP 提示词(
src/prompts.js)——用于实际操作。用户通过斜杠命令调用它们。每个提示词都将 Clean Core 框架的一部分与相关的adt_*工具结合起来,让模型能够在真实系统上执行操作,而不只是讲解各个级别。 - 长篇参考资料(
skills/abap-clean-core/)——框架的完整内容:Stay Clean / Get Clean 操作指南、A/B/C/D 级别深入解析、Cloudification Repository 状态语义、ABAP Cloud 允许/禁止清单、SAP Application Extension Methodology(3 个阶段)、治理实践、KPI 计算、ATC 豁免流程。阅读一次,将其链接到 PR 中,也可交给新团队成员。上面的提示词会引用所需内容;其他所有内容都在参考资料中。
设计选择
- 可选启用,而非自动触发。 Clean Core 是一套 S/4HANA 准则,不应强加给 ECC 开发者。除非用户输入斜杠命令,否则不会触发任何操作。
- 每个提示词都内置 ECC 适用性检查。 每个提示词正文首先要求模型确认目标系统是否为 S/4HANA。如果是 ECC,模型会停止执行,并改用经典 ABAP 术语提供帮助,不会使用级别标签。
- 采用描述性而非评判性的语气。 对于“我知道这是 D 级,直接发布吧”这样的要求,我们会予以尊重。Agent 会发布、标注级别、简要说明之后如何重构为 A 级,然后继续处理。
提示词
在 Claude Code 中(假设你将服务注册为 sap-adt),
具体命令如下:
| 命令 | 参数 | 功能 |
|---|---|---|
/mcp__sap-adt__clean_core_grade | object(必填)、type(必填)、system | 对单个对象评定 A/B/C/D 级。获取源代码和 ATC 结果,进行分类,列出理由;如果是 C/D 级,则概述 A 级重构方案。 |
/mcp__sap-adt__clean_core_review | package(必填)、system、maxObjects(默认值为 50) | 遍历一个程序包并计算 Clean Core 份额%、技术债务评分和主要 D 级问题对象。 |
/mcp__sap-adt__clean_core_refactor | object、type、system(均为可选) | 进入重构模式。加载 BAPI 封装器 / MARA→已发布 CDS / 修改→BAdI 模式。指定 object 时会预先填入;否则等待指示。 |
/mcp__sap-adt__clean_core_create | requirement、package、system(均为可选) | 默认以 A 级进入创建模式——ABAP Cloud 语法、已发布 CDS 视图、RAP、业务对象接口。执行 create_object → set_source → syntax_check → activate 流程。 |
/mcp__sap-adt__clean_core_design | use_case(可选) | 架构模式——符合标准、三阶段方法、堆栈内或并行部署、混合模式。不写入代码。生成目标解决方案备忘录。 |
斜杠命令的名称结构由 MCP 客户端决定:它会根据你注册服务时使用的别名,自动添加 mcp__<server-alias>__ 前缀。如果你使用其他别名注册服务(例如 claude mcp add cc -- npx sap-adt-mcp),前缀也会相应变化(/mcp__cc__clean_core_grade)。
在 Claude Desktop 中,提示词会显示在斜杠命令选择器中,命名方式相同。
参数传递示例
原子提示词(grade、review)会接收所有内联参数,并返回结构化分析:
You: /mcp__sap-adt__clean_core_grade object:ZCL_PRICING type:class system:DEV
Agent: → adt_get_source { ... }
→ adt_run_atc { ... }
Verdict: Level C. Two SELECTs from MARA without using the released
I_Product view; one CALL FUNCTION to internal FM RV_PRICE_PRINT.
Refactor sketch: replace SELECT with `from I_Product`; encapsulate
the RV_PRICE_PRINT call in a Z-class so the dependency is localised.
模式加载提示词(refactor、create、design)可以选择性地接收种子;如果不提供种子,它们会等待用户用自然语言继续说明:
You: /mcp__sap-adt__clean_core_create
Agent: I'm in Clean Core CREATE mode (Level A by default). What do you
want to build, on which package and system?
You: A small Fiori list-report of overdue invoices, package ZFIN_REPORTS,
system DEV.
Agent: Plan: a CDS view projecting I_OperationalAcctgDocItemCube for items
with NetDueDate < today; a behavior definition; a service binding
exposing it to Fiori Elements list-report. Three objects. Confirm?
也可以提供种子参数,让请求一次完成:
You: /mcp__sap-adt__clean_core_create requirement:"Fiori list-report of
overdue invoices" package:ZFIN_REPORTS system:DEV
阅读详细参考资料
skills/abap-clean-core/ 是提示词引用内容及更多资料的权威来源。如果你要为实际项目建立 Clean Core 治理机制——包括 KPI 基线、ATC 豁免规范、成熟度评估,以及架构层面的堆栈内与并行部署权衡——这里有详细内容。
此目录由一个入口文件(SKILL.md)和 references/ 中的四个深入介绍文件组成:
references/levels-detailed.md— Cloudification Repository 状态值、已发布的本地 API 与远程 API、重新分类机制,以及各类反模式的修复方法references/decision-framework.md— 符合标准、SAP Application Extension Methodology 详解、堆栈内与并行部署的适用条件、混合模式、示例场景references/governance.md— Stay Clean / Get Clean 操作指南、四项 KPI 及其计算方法、ATC 豁免流程、成熟度评估、多年路线图references/abap-cloud-rules.md— 完整的允许 / 禁止清单、RAP / CDS / 业务对象接口 / Custom Fields、预构建服务、经典系统迁移到云端的模式
你可以将 skills/abap-clean-core/ 复制或创建符号链接到 ~/.claude/skills/,将参考资料安装为会自动加载的 Claude 技能;但这是一个明确的选择。此仓库的默认行为是选择加入、仅提供提示词。
示例
请参阅 examples/,了解端到端的 Agent 工作流:项目发现、类审计、跨系统发布验证、基于使用位置的重构、测试分类。
快速示例:
You: "Compare class ZCL_PRICING between DEV and PRD on the live systems."
Agent: → adt_compare_source { systemA: "DEV", systemB: "PRD",
object: "ZCL_PRICING", type: "class" }
Returns: { identical: false, stats: { added: 14, removed: 9 },
diff: "..." }
Then narrates the meaningful changes.
架构
MCP client (Claude Desktop / Claude Code / custom)
│ stdio (JSON-RPC)
▼
┌──────────────────────────────────┐
│ src/server.js │ CLI + MCP dispatch (thin)
│ ├─ src/tools/*.js │ one module per category:
│ │ │ connection, source, quality,
│ │ │ lifecycle, discovery,
│ │ │ cross-system, transports,
│ │ │ runtime, data, request
│ ├─ src/object-uris.js │ type alias → ADT URI map
│ ├─ src/node-structure.js │ package tree XML parser
│ ├─ src/object-references.js │ <objectReference> parser
│ ├─ src/dump-feed.js │ runtime-dumps Atom parser
│ ├─ src/data-preview.js │ Data Preview XML parser + SELECT guard
│ ├─ src/diff.js │ unified diff (LCS)
│ ├─ src/adt-error.js │ <exc:exception> parser
│ ├─ src/lock.js │ ADT lock acquire / release
│ └─ src/adt-client.js │ HTTP client: auth / CSRF / cookies / timeout
└──────────────────────────────────┘
│ HTTPS
▼
SAP system (ADT REST: /sap/bc/adt/...)
运行时依赖有两个:@modelcontextprotocol/sdk(MCP 线协议)和 undici(使用自定义 TLS 调度器的 HTTP)。其他所有内容均使用标准库。
多步编辑模式
对于大多数编辑,adt_set_source 已经足够——它会获取锁、写入并释放锁。对于在单个轮次中多次操作同一对象的工作流(例如,应用 N 个方法级补丁,然后激活),请使用粘性锁模式:
1. adt_lock { object: "ZCL_X", type: "class" } → returns lockHandle
2. adt_set_source { object: "ZCL_X", type: "class", (repeat as needed)
source: "...", lockHandle: "<handle>" }
3. adt_activate { objects: [{ name: "ZCL_X", type: "class" }] }
4. adt_unlock { object: "ZCL_X", type: "class",
lockHandle: "<handle>" }
存在 lockHandle 参数时,adt_set_source 会跳过内部的加锁 / 解锁。
大型对象(数千行)
数千行的类或程序可能超过每次调用的 I/O 上限,因此无法以内联方式传入源代码。请将内容保留在磁盘上——它不会进入 Agent 上下文:
1. adt_get_source { object: "ZCL_BIG", type: "class",
outputFile: "/tmp/zcl_big.abap" } → writes the file, no inline source
2. (edit /tmp/zcl_big.abap locally)
3. adt_set_source { object: "ZCL_BIG", type: "class",
sourceFile: "/tmp/zcl_big.abap",
transport: "E4DK900123" } → MCP reads the file and PUTs it
注意:分配到传输请求可以在无头模式下工作,但 TR 创建(adt_create_transport)在某些系统上会通过 GUI 对话框处理,并可能失败并返回 500——请改用现有的 TR ID。
注意事项
- NetWeaver 版本差异。 一些 ADT 端点(尤其是传输请求、ATC 和对象创建 XML 格式相关端点)在 NW 7.5x、S/4 本地部署和 Steampunk 之间存在细微的格式差异。如果高级工具返回 HTTP 4xx,工具说明会注明它调用的端点——请根据你的版本改用
adt_request,并提供正确的路径 / 内容类型。 - ABAP Cloud(BTP / Steampunk)。 目前仅对本地部署的 ADT 7.5x+ 进行了实际测试。Steampunk 使用更严格的对象类型允许列表(仅限已发布 / 公共 API),且部分集合端点有所不同。Steampunk 用户:请提交 issue,说明存在差异的端点;欢迎提交 PR。
- 对象创建 XML 格式。 请求正文模板针对较新的本地部署版本。某些较旧的系统需要额外属性(
adtcore:masterLanguage等)——如果系统拒绝创建请求负载,请提交 issue 并附上响应正文。 - DDIC 基本对象(表、数据元素、域)无法通过
adt_create_object创建——它们需要更丰富的 DDIC 专用请求负载,我们尚未对此进行通用化。目前请使用adt_request。
故障排除
Claude Desktop 的 MCP 服务列表中显示“failed”。 在终端运行 sap-adt-mcp --validate-config。如果输出 OK,则服务正常,问题出在你的 claude_desktop_config.json(路径或环境变量错误)。
出现 x-csrf-token: required 的 403 错误。 这种情况应该会自动恢复——客户端会重新获取令牌并重试。如果问题仍然存在,你可能在 ADT 前方使用了会破坏 Basic auth 的 SSO / 前端身份验证;请检查 ICM 和 SAP Web Dispatcher 规则。
只读模式拒绝了一个明显用于读取的端点。 它可能是一个未列入白名单的 POST 端点。请提交 PR 或 issue 并提供路径;我们会将其加入白名单。或者暂时将系统设置为 readOnly: false。
SAP_ADT_MCP_DEBUG=1 会将每个请求和响应(状态、延迟、URL、去除 Authorization 的请求标头)追踪到 stderr。MCP 客户端会在其服务日志中显示 stderr,请在那里查看。
参与贡献
请参阅 CONTRIBUTING.md——欢迎提交错误报告、扩展工具覆盖范围、提供 NetWeaver 兼容性说明、文档和示例。
许可证
MIT——请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。