mcpField
S
sap-adt-mcp

sap-adt-mcp

本地服务
github.com/yzonur开发工具203 周前更新

关于 sap-adt-mcp

sap-adt-mcp 通过 ADT 将 MCP 客户端连接到 SAP 系统,面向在单个或多个系统环境中工作的 ABAP 开发者。它提供开发工具、只读防护,并在本地记录写入操作。

主要功能

  1. 01读取和编辑 ABAP 源码
  2. 02运行语法检查、测试和 ATC
  3. 03搜索对象并浏览包
  4. 04比较版本与 SAP 系统
  5. 05管理传输请求和调试
  6. 06只读控制与本地写入审计

适用场景

  1. 01检查并更新 ABAP 对象
  2. 02检查代码质量并运行单元测试
  3. 03比较不同 SAP 系统中的源码
  4. 04查看变更和传输队列

MCP 相关

MCP 服务通过 50 多种高级工具以及通用请求工具和五个 Clean Core 提示词开放 ADT 操作。客户端可在已配置的 SAP 系统间选择,并可启用只读模式阻止写入。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"yzonur-sap-adt": {
"command": "npx",
"args": [
"-y",
"sap-adt-mcp"
],
"env": {
"SAP_ADT_MCP_CONFIG": "<SAP_ADT_MCP_CONFIG>"
}
}
}
}
启动命令npx -y sap-adt-mcp
需要配置的环境变量
SAP_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmsap-adt-mcp0.8.57

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

sap-adt-mcp

通过 ADT 为 Claude(以及任何兼容 MCP 的客户端)提供实时访问 SAP 系统的 MCP 服务。

在聊天窗口或自主 Agent 中读取源代码、搜索代码库、运行语法检查、运行单元测试、运行 ATC、比较不同系统环境中的同一对象,以及编辑并激活 ABAP。无需在 SAP 技术栈上安装附加组件。

npm 版本 CI 许可证:MIT Node.js


为什么

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
源代码 CRUDadt_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
CDSadt_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

服务按以下顺序查找配置:

  1. $SAP_ADT_MCP_CONFIG(绝对路径)
  2. ~/.sap-adt-mcp/config.json
  3. ./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)。
clientSAP 客户端(设置 sap-client 查询参数)。
language可选的登录语言(设置 sap-language)。
userRFC 用户。
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)可关闭缓存。

自动错误报告

服务器会向维护者发送简短的已脱敏报告,以便发现并修复缺陷。此功能默认开启,服务器启动时会打印通知说明这一点。报告有三个渠道:

  1. 崩溃 — 工具处理程序抛出意外错误。
  2. ADT 错误 — 工具返回非 2xx 的 ADT 响应,且分类器将其标记为可能的工具缺陷(406/415 内容协商错误、格式错误的请求、服务器分发器崩溃)。用户/业务端响应(401/403/404、锁定和入队冲突、数据预览 SQL 错误)不会上报。
  3. 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.enabledtrue控制全部三个渠道的总开关。
reporting.adtErrorstrue渠道 2(自动上报标记的 ADT 错误)。
reporting.allowManualtrue渠道 3(adt_report_issue 工具)。
reporting.includeArgstrue包含已脱敏的工具参数/复现参数。注意:对象名称可能会出现在其中。
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_transportTR 标头 + 对象。
adt_create_transport创建新的 TR。readOnly: true 时会拒绝。端点结构各不相同——请参阅注意事项。
adt_release_transport释放 TR。readOnly: true 时会拒绝。
adt_transport_queueTR 当前处于什么位置?在 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
函数组 / fmFUGR/FF(需要 group)
函数组FUGR
表 / 结构TABL
数据元素DTEL
域DOMA
cds / ddlsDDLS
访问控制 / dclsDCLS
元数据扩展 / ddlxDDLX
行为定义 / bdefBDEF
消息类 / msagMSAG

技能(打包的工作流)

原始工具是构建模块;skills/ 提供了为 Claude Code 准备的现成工作流,可用于编排这些工具。每个 SKILL.md 都列出了自身的前置条件(最低 NetWeaver 版本、所需授权、是否兼容只读操作)。

技能功能只读操作可用?最低系统要求
transport-release-gate对 TR 进行发布前质量检查:非活动对象、锁、语法、ATC、单元测试 → 放行/不放行报告。是否发布仍由人工决定。基本可用(单元测试和发布需要写入权限)NW 7.50+,已配置 ATC
dump-triageST22 分类:将转储归入不同类别,深入分析问题最严重的转储,为每类问题找出根因和修复方案。可以——可安全用于 PRDNW 7.50+(转储源)
legacy-code-doc对遗留 Z 代码进行逆向文档编写:结构、数据库交互点、调用方、风险、S/4 迁移说明。可以——可安全用于 PRDNW 7.4x+(7.55+ 提供数据样本)
abap-clean-coreSAP 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_gradeobject(必填)、type(必填)、system对单个对象评定 A/B/C/D 级。获取源代码和 ATC 结果,进行分类,列出理由;如果是 C/D 级,则概述 A 级重构方案。
/mcp__sap-adt__clean_core_reviewpackage(必填)、system、maxObjects(默认值为 50)遍历一个程序包并计算 Clean Core 份额%、技术债务评分和主要 D 级问题对象。
/mcp__sap-adt__clean_core_refactorobject、type、system(均为可选)进入重构模式。加载 BAPI 封装器 / MARA→已发布 CDS / 修改→BAdI 模式。指定 object 时会预先填入;否则等待指示。
/mcp__sap-adt__clean_core_createrequirement、package、system(均为可选)默认以 A 级进入创建模式——ABAP Cloud 语法、已发布 CDS 视图、RAP、业务对象接口。执行 create_object → set_source → syntax_check → activate 流程。
/mcp__sap-adt__clean_core_designuse_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。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。