关于 abap-adt-mcp
abap-adt-mcp 为 ABAP 开发者将 MCP 主机连接到 SAP ADT 服务,提供代码编辑、测试、传输和诊断工具。服务端策略可按目标系统限制写操作。
主要功能
- 01读取和编辑 ABAP 源码
- 02创建对象并运行单元测试
- 03执行 ATC 检查和快速修复
- 04检查传输、转储和使用情况
- 05按目标系统和包执行策略
适用场景
- 01编辑类并运行其测试
- 02使用 ATC 检查软件包
- 03从短转储追查源代码
- 04发布前审查传输变更
MCP 相关
通过 MCP 工具向 Claude Desktop、Claude Code、VS Code 等 MCP 主机提供 SAP ADT 操作。目标系统策略由服务端在调用 SAP 前执行。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y abap-adt-mcpSAP_SYSTEMS_FILEPath to a JSON file mapping destination names to system configs (url, client, authType basic/sso/sso2/oauth, credentials). Recommended; keep the file mode 0600. See systems.example.jsonSAP_SYSTEMS密钥Inline JSON map of destinations (same shape as SAP_SYSTEMS_FILE). Contains credentials — prefer SAP_SYSTEMS_FILESAP_DEFAULT_DESTINATIONDestination name used when a tool call omits `destination` (alternatively mark an entry with "default": true)SAP_AUTH_TYPE密钥Default auth type for entries that don't specify one: sso (default), sso2, basic, or oauthMCP_HTTP_PORTWhen set (1024-65535), serve Streamable HTTP on http://127.0.0.1:<port>/mcp with bearer-token auth instead of stdioMCP_HTTP_HOSTBind address for the HTTP transport (default 127.0.0.1). Set 0.0.0.0 only inside containers that publish the portMCP_HTTP_TOKEN密钥Bearer token for the HTTP transport; auto-generated and written to ~/.abap-adt-mcp/http-token when unsetMCP_HTTP_MAX_SESSIONSMaximum concurrent MCP sessions on the HTTP transport (default 16); further initialize requests get 503MCP_HTTP_MAX_BODY_BYTESLargest request body the HTTP transport accepts, in bytes (default 4194304); larger bodies are refused with HTTP 413MCP_HTTP_SESSION_TTL_MINUTESIdle minutes after which an HTTP session (and its SAP sessions/locks) is closed (default 30)MCP_HTTP_ALLOWED_ORIGINSComma-separated Origin values allowed on the HTTP transport (loopback origins always allowed when bound to loopback; * allows any)MCP_HTTP_ALLOWED_HOSTSComma-separated Host header values allowed (DNS-rebinding protection; loopback hosts always allowed when bound to loopback)MCP_EXPORT_ROOTWhen set, exportPackageSources may only write inside this directoryMCP_AUDIT_FILEPath of a JSONL audit trail: one record per tool call (tool, destination, duration, outcome ok/error/denied/unavailable, policy gate, redacted argument summary)MCP_ADT_TRACE_FILEDiagnostics: path of a JSONL trace with one line per ADT request (method, URI, status, headers). Cookie, Set-Cookie, Authorization and CSRF values are reduced to name and length; no response body is kept, error lines carry the first 300 characters of the redacted error text. Off when unset.MCP_READ_ONLYSet to 1 to make every destination read-only (server-side; only read-only annotated tools plus login/logout run). Per-destination policies live in systems.jsonMCP_ALLOW_DATA_PREVIEWSet to 1 to let tableContents read table and CDS rows on every destination that does not state policy.allowDataPreview itself (reading table data is off by default)MCP_ALLOW_FREE_SQLSet to 1 to allow runQuery and tableContents with sqlQuery on every destination that does not state policy.allowFreeSql itself (free SQL is off by default; implies table data)MCP_TOOLSETSToolsets to publish: comma list (core,source,objects,transports,analysis,tests,atc,data,discovery,runtime,refactoring,rap,services,git,debugger,traces) or a preset: all (default) or focusedMCP_DISABLED_TOOLSETSToolsets to hide, comma list (core cannot be disabled)MCP_MAX_RESPONSE_CHARSCharacter budget for a single tool response before results are paged/truncated (default 40000, minimum 5000). Raise it if your MCP host accepts larger tool outputsSAP_ALLOW_REENTRANCE_TICKETSet to 1 to enable the reentranceTicket tool (disabled by default: it returns a live SAP logon credential into the conversation)SAP_URLLegacy single-system mode: base URL of the SAP system, e.g. https://host:44300SAP_USERLegacy single-system mode: SAP usernameSAP_PASSWORD密钥Legacy single-system mode: SAP passwordSAP_CLIENTLegacy single-system mode: SAP client number, e.g. 100SAP_LANGUAGELegacy single-system mode: logon language, e.g. ENSAP_BROWSER_PATHSSO destinations: path to a Chromium/Chrome/Edge binary for the browser login (auto-detected when unset)SAP_BROWSER_PROFILE_DIRSSO destinations: directory of the persistent browser profile that keeps the identity-provider session (default ~/.abap-adt-mcp/sso/<host>)SAP_SSO2_COMMANDLegacy single-system sso2 mode: absolute path to the trusted local ticket providerSAP_SSO2_ARGSLegacy single-system sso2 mode: JSON array of provider arguments (never put a ticket here)SAP_SSO2_TIMEOUT_MSLegacy single-system sso2 mode: provider timeout in milliseconds (default 30000; range 1000-300000)SAP_TLS_INSECURELegacy single-system mode: set to 1 to skip TLS certificate verification for that system only (sandboxes with self-signed certificates)SAP_OAUTH_TOKEN_URL密钥Legacy single-system mode with SAP_AUTH_TYPE=oauth: OAuth2 token endpoint (client_credentials)SAP_OAUTH_CLIENT_ID密钥Legacy single-system mode with SAP_AUTH_TYPE=oauth: OAuth2 client idSAP_OAUTH_CLIENT_SECRET密钥Legacy single-system mode with SAP_AUTH_TYPE=oauth: OAuth2 client secretSAP_OAUTH_SCOPE密钥Legacy single-system mode with SAP_AUTH_TYPE=oauth: optional OAuth2 scopeMCP_PROFILE_GATEPlatform gate for toolsets the destination does not expose (debugger, traces, abapGit, ...): enforce (default, refuse before calling SAP), warn (log only) or offMCP_SOURCE_CACHE_TTL_SECONDSLifetime of the per-session source cache used by grepPackage, cdsViewInfo and syntaxCheckCode (default 300; 0 keeps entries until logout)MCP_CACHE_DIRDirectory for the cached SAP cloudification repository used by apiReleaseState (default ~/.abap-adt-mcp/cache)MCP_API_CLASSIFICATION_FILESExtra classification files for apiReleaseState, comma list: a path inside SAP's cloudification repository (partner/objectClassifications_ACME.json) or an https URL本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
2收录的工具列表 · 更新于 2 天前
此工具无需参数。
详细介绍
abap-adt-mcp
让 Claude 在你的 SAP 系统上读取、编写、测试和检查 ABAP 代码。
English · Português (Brasil) · Deutsch · 项目网站
你在 Claude 中输入一句话,就能得到一个已激活的类、通过的单元测试和一个传输编号。abap-adt-mcp 就是中间的服务:Model Context Protocol 服务,为 Claude Desktop、Claude Code、VS Code 或任何其他 MCP 宿主提供 Eclipse 所用的相同 ADT 服务,并可连接你配置的每个 SAP 系统,无论是 S/4HANA Cloud 还是本地部署。173 个工具,一个进程,并由服务自身强制执行防护措施:标记为只读的目标会拒绝所有写入,不会让请求到达 SAP,无论宿主是否批准。
看看它如何运行。项目网站 上有七段短片、三步配置指南,以及可以向模型提出的问题。
连接生产系统前请注意
看看它如何运行

这就是全部思路。你输入一句话,模型选择工具,服务锁定对象、写入、激活并解锁,随后单元测试通过,并附上一个传输编号。如果要求在生产系统上进行相同更改,系统会在发出任何 SAP 调用前返回 policyDenied:防护措施位于服务中,而非聊天窗口中。
七段短片展示了这一过程和背后的单项任务:追踪短转储对应的代码行、运行 ATC 并应用快速修复、审查传输、创建带测试的类,以及检查 ABAP Cloud 就绪情况。你可以在项目网站观看。
目录
- 看看它如何运行
- 配置
- 向模型提出的问题
- 管理员须知
- 身份验证
- S/4HANA Cloud 与本地部署
- 其他安装方式
- 配置
- 工具目录
- 与 SAP 官方 ADT MCP Server 的比较
- SAP API 政策
- 故障排除
- 测试与贡献
- 致谢
- 许可证
设置
需要满足三项先决条件:
- 从 nodejs.org 安装 Node.js 22.12 或更高版本(22 或 24 LTS)。如果使用公司管理的笔记本电脑,只需向 IT 提交一条申请:“请安装 Node.js LTS(22 或更高版本)”;无需安装其他内容。
- 有权访问 SAP 系统,与使用 Eclipse ADT 时相同:对于 S/4HANA Cloud,需要开发人员业务角色(标准交付中的
SAP_BR_DEVELOPER);对于本地部署,请联系 Basis 团队,在SICF中启用/sap/bc/adt服务,并配置常用的 ADT 授权。 - 使用 Chromium 浏览器(Chrome、Edge 或 Brave)进行浏览器登录(
authType: sso,默认值);使用basic、oauth或sso2时不需要。
1. 描述 SAP 系统
在主目录中创建文件夹 .abap-adt-mcp,并在其中创建文件 systems.json,每个系统(即“目标”)对应一个条目:
- Windows:文件夹路径为
C:\Users\<your user name>\.abap-adt-mcp。将 JSON 粘贴到记事本中,并在“另存为”中将“保存类型”设为“所有文件”,文件名设为systems.json,否则记事本会将文件保存为systems.json.txt,导致服务找不到文件。 - macOS:文件夹路径为
/Users/<you>/.abap-adt-mcp(在 Finder 中按 Shift-Cmd-G,输入~);可使用任意编辑器。
{
"DEV": {
"url": "https://myXXXXXX.s4hana.cloud.sap",
"client": "080",
"authType": "sso",
"default": true,
"policy": { "allowedPackages": ["ZFIN"] }
}
}
DEV是你为系统指定的名称,也是你在聊天中使用的名称;"default": true表示可以省略该名称。url:打开启动板或 Eclipse 时使用的地址,不包含路径。client:SSO 会话登录的客户端(启动板用户菜单中的“关于”会显示此信息)。如果客户端有误,之后访问你能在 Eclipse 中打开的对象时会显示“未授权”。authType默认值为sso:登录时会打开一次浏览器窗口,与 Eclipse ADT 的方式类似。其他模式见身份验证。policy.allowedPackages:模型可写入的包,使用精确名称或模式(ZFIN、Z*)。省略此项时,所有你能在 Eclipse 中编辑的包均可写入;建议先从一个包开始。
成功进行首次调用后,再按第 4 步添加生产环境和本地部署系统。
2. 在宿主中注册服务
此软件包在 npm 上的名称为 abap-adt-mcp;npx 会获取它。Claude Desktop 无需终端,使用第一个代码块。Claude Code 使用一条命令。VS Code、Cursor 和其他宿主请参阅下方说明。每个配置项都会为服务传递两项设置:SAP_SYSTEMS_FILE(systems.json 的位置)和 MCP_TOOLSETS=focused,用于发布 114 个日常开发工具,而不是全部 173 个,以免工具架构占用聊天上下文(需要调试器、跟踪、abapGit、RAP 或重构功能时,可移除此设置)。
Claude Desktop,无需使用终端:
- Settings > Developer > Edit Config 会打开存放
claude_desktop_config.json的文件夹;使用记事本或任意编辑器打开该文件。如果 Settings 中没有 Developer 选项卡,说明你的 Claude Desktop 由 IT 管理:请 IT 添加下方配置项。 - 如果文件中已有
"mcpServers",只需在其中添加"abap-adt-mcp"配置项;如果文件为空,则粘贴整个代码块。 - 将
<you>替换为你的用户名(macOS:/Users/<you>/.abap-adt-mcp/systems.json)。Windows 路径中的正斜杠是有意为之:JSON 中每个反斜杠都需要写成\\,正斜杠则无需转义。 - 退出并重新打开应用。
{
"mcpServers": {
"abap-adt-mcp": {
"command": "npx",
"args": ["-y", "abap-adt-mcp"],
"env": { "SAP_SYSTEMS_FILE": "C:/Users/<you>/.abap-adt-mcp/systems.json", "MCP_TOOLSETS": "focused" }
}
}
}
Claude Code,在终端中输入一行命令(-s user 会为每个项目注册此服务,而不只是当前文件夹):
claude mcp add -s user abap-adt-mcp -e SAP_SYSTEMS_FILE=$HOME/.abap-adt-mcp/systems.json -e MCP_TOOLSETS=focused -- npx -y abap-adt-mcp
Windows PowerShell 中也可使用相同命令:
claude mcp add -s user abap-adt-mcp -e SAP_SYSTEMS_FILE=$env:USERPROFILE\.abap-adt-mcp\systems.json -e MCP_TOOLSETS=focused -- npx -y abap-adt-mcp
搭配 GitHub Copilot 使用的 VS Code:在 .vscode/mcp.json 中使用相同的配置项,并将其放在顶层 servers 键下,而不是 mcpServers;docs/HOSTS.md 提供了经过测试的文件,其中使用 ${input:} 存放机密信息。
- Cursor、Cline、Windsurf、Copilot CLI 和 Eclipse:请参阅 docs/HOSTS.md。
- 保留键名
abap-adt-mcp:这是宿主显示的名称、所有工具的前缀,也是本项目 Agent 技能查找时使用的名称。
3. 打个招呼
打开一个新聊天并输入(将 DEV 替换为你选择的密钥;该类是 SAP 标准类,因此此提示词为只读,在任何系统上都安全):
列出我的 SAP 系统,登录 DEV,并向我展示类 CL_ABAP_CHAR_UTILITIES 的源代码。
浏览器窗口会打开,供你进行 SSO 登录(勾选“保持登录”,之后登录时不会再提示);随后模型会调用 listSystems、searchObject 和 getObjectSource,回复中会列出你的目标系统,并以该类的源代码结尾。运行你尚未永久批准的工具前,宿主会先询问:该对话框是宿主提供的便利措施,policy 块才是保障。如果宿主中没有显示该服务,请参阅故障排除,了解要查看的日志。
首次编辑前,有两点值得了解:
- 如果策略禁止写入,系统会返回拒绝,而不是静默地不执行任何操作:
kind: "policyDenied",Policy: setObjectSource blocked on destination PRD (readOnly)。 - 模型所做的每项更改都会保存在你的传输请求和对象的版本历史中:
objectDiff和revisions可以显示这些更改;未经你批准发布传输请求,任何内容都不会离开 DEV。
4. 添加生产和本地部署的系统
以下是包含生产环境条目和本地部署条目的同一文件(systems.example.json 包含所有选项):
{
"DEV": {
"url": "https://myXXXXXX.s4hana.cloud.sap",
"client": "080",
"authType": "sso",
"default": true,
"policy": { "allowedPackages": ["Z*"] }
},
"PRD": {
"url": "https://myYYYYYY.s4hana.cloud.sap",
"client": "100",
"authType": "sso",
"policy": { "readOnly": true, "allowDataPreview": false, "deniedTools": ["exportPackageSources"] }
},
"ONPREM": {
"url": "https://sap.example.com:44300",
"client": "100",
"authType": "basic",
"user": "DEVELOPER",
"password": "${env:ONPREM_PASSWORD}",
"policy": { "allowedPackages": ["Z*", "$*"] },
"tls": { "ca": "/etc/ssl/corp-ca.pem" }
}
}
- 如果必须配置生产目标系统,
PRD是其最低限度的策略:readOnly会拒绝所有写入,无论模型收到什么请求;allowDataPreview: false会禁止访问表数据,即使环境允许其他目标系统访问也不例外;deniedTools会禁用exportPackageSources,这是唯一会将整个软件包复制到磁盘的读取工具。 ${env:VAR}会从环境变量中读取机密,因此机密不会保存在文件中;在宿主启动服务的位置添加变量:在claude mcp add中使用-e ONPREM_PASSWORD=...(或在启动 Claude Code 的 shell 中导出该变量);Claude Desktop 的env块中添加"ONPREM_PASSWORD": "...",因为 Claude Desktop 不会传递你的 shell 环境变量。包含明文密码的文件必须设置为仅你本人可读(在 macOS 和 Linux 上运行chmod 600 ~/.abap-adt-mcp/systems.json;在 Windows 上,你的用户配置文件夹本身就是私有的);仅使用 SSO 的文件无需任何操作。tls.ca指定企业 CA 证书。只能针对单个目标系统放宽证书验证(设置insecureTls: true,启动时会显示提示),不能针对整个进程放宽。- 较旧的本地部署系统(SAP_BASIS 低于 7.51,例如 SAP ERP 6.0 EHP7 或 EHP8)可以通过 HTTP 正常读取,但无法在请求之间保持锁定,因此写入会失败。请为其条目设置
"transport": "rfc"并添加rfc块,然后安装 SAP NetWeaver RFC SDK。你需要使用自己的 S-user 从 SAP 下载该 SDK,因为 SAP 不允许随附该 SDK。docs/RFC.md 中提供了操作步骤。
设置就这些。接下来:可以向模型提出什么请求。
向模型提出的问题
MCP 服务是模型可从中选择的工具箱:用自然语言提问,模型会自行选择调用顺序。
| 提问 | 模型会调用的工具 |
|---|---|
| “解释一下 ZCL_ORDER_SERVICE 的方法 GET_DATA 是做什么的。” | searchObject、getMethodSource |
| “表 ZTABLE 还有哪些地方在使用?分别由哪些程序使用?” | whereUsed、sourceTextSearch、grepPackage |
| “展示 CDS 视图 ZI_PRODUCT 的字段和关联。” | cdsViewInfo、objectStructureElements |
| “在 GET_DATA 开头添加空值检查,激活并运行单元测试。” | resolveTransport、syntaxCheckCode、editObjectSource(使用 activate=true)、unitTestRun、objectDiff |
| “在软件包 ZDEMO 中创建类 ZCL_HELLO,让它打印 Hello World,并添加单元测试。” | validateNewObject、resolveTransport、createObject、setObjectSource、createTestInclude、unitTestRun |
| “对软件包 ZFIN 运行 ATC,并应用所有安全的快速修复。” | createAtcRun、atcWorklists、atcQuickfixProposals、atcApplyQuickfix、atcSummary |
“传输 DEVK900123 有哪些更改?请检查并告诉我是否可以安全发布。” | transportDetails、transportUnifiedDiff |
| “用户 DEVELOPER 最近一次短转储是因为什么?请提出修复方案。” | dumps、dumpDetails、getObjectSource |
| “ZCL_ORDER_SERVICE 是否已准备好用于 ABAP Cloud?哪些 SAP 对象会阻碍它?” | apiReleaseState、createAtcRun |
| “选择 ZTABLE 中 STATUS = 'X' 的最新十行。” | runQuery;如果数据预览不允许读取该表,则使用 tableContents |
| “试运行这段代码,并展示输出。” | runSnippet |
| “DEV 支持哪些工具集?那里可以使用调试器吗?” | systemProfile |
MCP 服务会自行处理以下事项,因此你无需明确提出:
- 写入工具会自行锁定、写入并解锁;
activate=true会在同一次调用中激活对象。 - 所有错误都会以包含
kind、hint和nextTools的 JSON 返回,让模型能够恢复,而不是盲目重试;会话过期后,系统会重新进行身份验证并重试一次调用。 - 大型结果会在 40,000 个字符的预算内分页,并报告
hasMore;耗时较长的调用会发送进度通知。 - 仅当目标系统允许时才会读取表:按名称调用
tableContents需要allowDataPreview,而runQuery需要allowFreeSql。 - 创建和编辑流程会通过 MCP 的
instructions字段传递,另有六个即用型工作流作为 MCP 提示词提供(create-object、safe-edit、review-transport、fix-atc、clean-core-check、debug-dump;在 Claude Code 中使用/mcp__abap-adt-mcp__safe-edit DEV ZCL_ORDER_SERVICE "return early when the input table is empty")。 - 每个工具都带有
readOnlyHint/destructiveHint注释,因此按注释控制审批的宿主只会在写入操作时请求审批。
各工具的调用顺序、参数格式和使用示例见 docs/WORKFLOWS.md。
管理员指南
从系统全景负责人关心的角度,了解 MCP 服务是什么:
- 身份。 每次调用都会以目标系统的用户身份访问 SAP,并使用该用户的授权;服务不会绕过任何 SAP 检查,也不会拥有用户无权访问的权限。使用
sso和sso2时,该用户就是键盘前的操作者;basic和oauth使用存储的凭据,因此在需要追责时,优先使用具名用户。仅有显示权限的 SAP 用户所需授权列于 docs/CONFIGURATION.md。 - 进程。 每人运行一个进程,由 MCP 宿主启动,通过 stdio 通信;除非启动可选的 HTTP 传输,否则不会在网络上监听。
- 网络。 服务会连接已配置的 SAP 主机、浏览器 SSO 期间使用的身份提供方,以及
raw.githubusercontent.com(用于apiReleaseState调用的 SAP 云化仓库;缓存 24 小时;设置deniedTools: ["apiReleaseState"]可避免访问网络)。不进行遥测,也不检查更新;npx本身会连接 npm 注册表。 - 本机代码。 只有
"transport": "rfc"的目标系统会加载本机代码:用户自行安装的 SAP NetWeaver RFC SDK,通过 koffi 调用。koffi 是带预编译二进制文件的可选依赖;其安装脚本会检查二进制文件能否加载,只有无法加载时才会尝试使用 CMake 从源代码构建,构建失败也不会造成影响。仅用于 HTTP 目标系统的安装可以通过npm install --omit=optional不安装该依赖(docs/RFC.md)。 - 模型会看到什么。 用户批准的每次工具调用结果(源代码、已打开的表格行、转储、ATC 检查结果、脱敏后的错误文本)都会发送给 MCP 宿主,再由宿主根据其自身的数据条款发送给模型提供方(由宿主而非本服务决定模型提供方);服务不会向其他任何地方发送数据。
readOnly、deniedTables和deniedTools可限制各目标系统所涉及的数据。 - 磁盘。
~/.abap-adt-mcp/:systems.json(由你管理)、各主机的 SSO 浏览器配置文件(sso/<host>,权限模式为0700)、云化缓存、软件包导出文件(exports/,仅在exportPackageSources可能写入时存在)、HTTP 令牌、启用时的审计日志,以及 RFC 目标系统使用的 SAP RFC SDK 自身日志(rfc/,权限模式为0700)。SAP 会话 Cookie 绝不会写入磁盘。 - 机密信息。
systems.json中的每个字符串都支持${env:VAR};如果文件可被他人读取且其中包含内联密码,则会被拒绝。错误消息会经过脱敏处理(承载令牌、Cookie、密码、user:password@hostURL);成功的工具结果不会脱敏,因此应使用readOnly、deniedTables和deniedTools限定结果范围。reentranceTicket(模型可能会在其他地方传递的登录票据)默认禁用,除非设置SAP_ALLOW_REENTRANCE_TICKET=1。 - 策略无法检查的内容。 模型运行的 ABAP(
runSnippet、runClass、unitTestRun)使用用户的授权执行;deniedTables会扫描代码片段文本,但不会检查动态 SQL 或代码调用的任何内容。如果不能接受执行代码,请将这些工具列入deniedTools或使用readOnly。 - 不可信输入。 SAP 中的注释、表格行和馈送内容可能包含试图引导模型的文本。请使用会在调用工具前征求许可的宿主,并在批准前查看工具目录中以粗体显示的工具(具有破坏性的工具)。
- 审计。
MCP_AUDIT_FILE=/var/log/abap-adt-mcp/audit.jsonl会为每次调用追加一行 JSON,记录工具、目标系统、结果、耗时、拒绝请求的策略关卡,以及已脱敏机密信息的参数。该文件由用户自己的进程在每台工作站上写入;集中收集和防篡改措施需自行安排。docs/CONFIGURATION.md 中提供了记录格式。 - SAP API 政策。 SAP 将本服务使用的 ADT 服务称为内部服务,仅供通过 SAP 认可渠道进行开发使用;本项目不属于这些渠道。使用未发布接口的风险由使用者自行承担。请咨询 SAP 联系人,并将本服务限制在开发和测试系统中。详情见 SAP API Policy。
- 撤销访问。 笔记本电脑丢失或机密信息泄露后,应逐项撤销访问(SSO 配置文件、身份提供方会话、OAuth 机密信息、SAP 密码、本地文件):SECURITY.md,停用。
- 发布。 只有最新发布版本会获得修复;如需受控部署,请固定版本,而不要使用安装说明中的未固定版本
npx -y abap-adt-mcp(其他安装方式)。已测试的模式:sso、sso2和本地部署的basic;oauth和 Communication-Userbasic未经测试(身份验证)。漏洞:SECURITY.md,报告漏洞。
策略键
在任何 SAP 调用之前,服务器都会针对 systems.json 中的每个目标强制执行以下策略:
| 键 | 效果 |
|---|---|
readOnly | 仅运行只读工具:所有源代码写入、lock、runSnippet、runClass、unitTestRun 和 createAtcRun 都会被拒绝。表读取(如果已打开)和 exportPackageSources 仍然允许;使用下面的键关闭它们。 |
allowDataPreview | 除非设为 true,否则默认关闭:tableContents 可以按名称读取表或 CDS 实体的行。显式设为 false 时优先于 MCP_ALLOW_DATA_PREVIEW。 |
allowFreeSql | 除非设为 true,否则默认关闭:runQuery 和带有 sqlQuery 的 tableContents(隐含 allowDataPreview)。 |
deniedTables | 模型不得读取的模式(["PA*", "HR*", "USR02"]),适用于读取操作以及模型编写或运行的 ABAP 文本;SAP 自身的显示授权仍是最低限制。 |
deniedTools | 完全拒绝的工具:名称、模式(rapGen*)或 toolset:git。 |
allowedPackages | 仅允许在这些包中写入(["Z*", "$*"]);无法解析的包会被拒绝。 |
allowedTransports | 仅允许使用这些传输请求进行写入;拒绝创建新的传输请求。 |
拒绝操作会返回 kind: "policyDenied",并指出触发的限制;listSystems 会显示所有策略和生效的 dataAccess。威胁模型和剩余风险见 SECURITY.md;各工具的限制及操作示例见 docs/CONFIGURATION.md;SAP API Policy 下的合规状态见 docs/API-POLICY.md。
身份验证
每个目标都会单独选择其 authType。详情和 SAP 端的设置步骤见 docs/AUTH.md。
| 模式 | 适用场景 | 配置项 | SAP 端 |
|---|---|---|---|
sso(默认) | S/4HANA Cloud 命名用户,以及响应 Basic 身份验证质询的本地部署系统 | 无需配置:每台主机只需打开一次浏览器;会话保存在内存中。SAP_BROWSER_PATH 可指定浏览器。 | 用户在 Eclipse ADT 中已有的开发人员业务角色 |
sso2 | 无头本地部署环境中的命名用户,且可信的本地 SNC/RFC 桥接程序可以签发短期票据 | sso2.command、args、timeoutMs | 由 Basis 配置 SNC 映射、票据接受和 ADT ICF 登录 |
basic | 本地部署的 AS ABAP 用户、S/4HANA Cloud Communication Users | user 和 password(格式为 ${env:VAR}) | 具有 ADT 授权的用户 |
oauth | S/4HANA Cloud 无人值守客户端 | oauth.tokenUrl、clientId、clientSecret | Communication User、配置了 OAuth 2.0 的 Communication System,以及针对租户 ADT 场景的 Communication Arrangement |
- S/4HANA Cloud 上的命名业务用户不能使用 Basic 身份验证:他们通过
sso登录,或者需要创建 Communication User。使用 Communication User 的oauth和basic遵循 SAP 关于技术用户的文档,但本项目未在实时租户上进行过验证;依赖这些方式之前,请先在自己的环境中确认。 - 本地部署系统发起 Basic 身份验证质询时,浏览器窗口会要求输入 SAP 密码;如果允许浏览器保存密码,该密码会存储在
~/.abap-adt-mcp/sso/<host>下的专用配置文件中。 - 进程始终启用 TLS 验证。针对每个目标,
tls.ca可添加企业 CA,tls.servername可指定通过 IP 地址访问的系统的证书名称,tls.cert+key(或pfx+passphrase)可提供客户端证书,而insecureTls: true会在启动时公布。可选的gitUser/gitPassword可避免在对话中暴露 abapGit 凭据。
S/4HANA Cloud 与本地部署
systemProfile(destination) 会报告目标是云端还是本地部署,以及后端缺少哪些工具集;在调用 SAP 之前,这些工具就会被拒绝。docs/TESTPLAN.md 记录了在一个 Public Cloud 租户上的情况:
| 主题 | S/4HANA Cloud(公有版) | 本地部署 / 私有版 |
|---|---|---|
| 身份验证 | 命名用户:仅支持浏览器 SSO。无人值守:使用 Communication Arrangement 中的 OAuth2,或使用 Communication User 进行基本身份验证。 | 基本身份验证;通过 tls 使用客户端证书;在支持 Basic 挑战的系统上使用浏览器 SSO;通过本地票据提供程序使用无头 sso2。 |
| 本地对象 | 在测试的租户上,$TMP 被拒绝(授权对象 S_ABPLNGVS);请使用包含 ABAP for Cloud Development 的客户包及其传输,resolveTransport 会选中它。在该环境中,runSnippet 需要 packageName、transport 和 responsible。 | 可使用 $TMP,无需传输;runSnippet 默认使用 $TMP。 |
| 工具集 | 在测试的租户上没有 RAP 生成器;调试器、跟踪和 abapGit 取决于租户和授权。缺少调试器时,可通过 dumps/dumpDetails 查找根本原因;如果租户没有文本索引,sourceTextSearch 会回退到 grepPackage。 | 当前版本提供完整的 ADT 集合。 |
| 已发布 API | apiReleaseState 可检查名称、对象 URL 或整个源代码;ATC 变体为 ABAP_CLOUD_DEVELOPMENT_DEFAULT。createObject 需要 responsible。 | 可选。 |
| 业务数据 | runQuery/tableContents 会遵循显示授权,且目标必须允许使用这些工具。runSnippet 需要 S_DEVELOP,因此只能用于开发系统。 | 相同。 |
更多信息请参阅 docs/CLOUD.md,以及基于实际会话编写的 docs/FIELD-NOTES.md。
其他安装方式
- 固定版本。
npx -y abap-adt-mcp会在每次启动时获取最新版本;如需控制部署,请固定版本(npx -y [email protected],或使用容器标签vX.Y.Z)。各个版本都带有 npm 来源证明,可通过npm audit signatures验证。 - Claude Code 插件。 使用两条命令即可注册服务并安装两个 Agent 技能(
abap-adt-mcp讲解开发流程,abap-adt-mcp-setup引导完成安装):先运行/plugin marketplace add williansaez/abap-adt-mcp,然后运行/plugin install abap-adt-mcp@abap-adt-mcp。插件会固定其随附的版本,并发布每个工具集;第 1 步中的systems.json仍需由你编写。 - 容器。
ghcr.io/williansaez/abap-adt-mcp:latest(也提供vX.Y.Z)基于node:22-alpine构建,以 uid 1000 运行。请以只读方式挂载systems.json,并传入其中引用的密钥;浏览器 SSO 需要本地浏览器,因此请在工作站上通过 npm 运行sso目标。docs/HOSTS.md 提供了docker run命令和文件所有权方面的注意事项。 - MCP registry。 登记名称为
io.github.williansaez/abap-adt-mcp,供可浏览注册表的主机使用。 - 从源代码安装。 运行
git clone https://github.com/williansaez/abap-adt-mcp.git、npm ci、npm run build,然后将主机指向node /absolute/path/abap-adt-mcp/dist/index.js。检出目录旁的systems.json会被自动加载。
配置
- 来源按优先级排列:
SAP_SYSTEMS(内嵌 JSON)、SAP_SYSTEMS_FILE、安装目录旁的systems.json,然后是旧版单系统变量(SAP_URL、SAP_CLIENT、SAP_USER、SAP_PASSWORD等)。 - 每个目标的键:
url、client、language、authType、default、user/password、sso2、oauth、insecureTls、gitUser/gitPassword、policy、tls、transport/rfc;任何字符串都可以是${env:VAR}。 - 没有全局的
deniedTools、deniedTables或allowedPackages:这些配置需在每个条目中分别设置。
你最可能会设置的变量:
| 变量 | 用途 | 默认值 |
|---|---|---|
SAP_SYSTEMS_FILE | 目标配置文件的路径 | 推荐使用,而不是内嵌 SAP_SYSTEMS |
MCP_TOOLSETS | 要发布的工具集:all、focused 或逗号分隔的列表 | all(上述设置选择了 focused) |
MCP_READ_ONLY | 1 会将每个目标设为只读 | 关闭 |
MCP_ALLOW_DATA_PREVIEW、MCP_ALLOW_FREE_SQL | 对未声明该键的目标,设为 1 可启用表数据或 SQL | 关闭 |
MCP_AUDIT_FILE | JSONL 审计记录 | 关闭 |
MCP_MAX_RESPONSE_CHARS | 单次工具响应分页前的字符预算 | 40000 |
MCP_HTTP_PORT | 使用持有令牌的方式,通过 127.0.0.1:<port>/mcp 提供 Streamable HTTP 服务,而不是使用 stdio | 未设置(stdio) |
SAP_BROWSER_PATH | SSO:要使用的 Chromium 二进制文件 | 自动检测 |
每个变量、其默认值及影响范围、HTTP 传输(令牌、会话和请求体限制、DNS 重绑定防护、共享实例的含义)以及审计记录格式,详见 docs/CONFIGURATION.md。
工具目录
每个工具的参考文档(描述、参数、只读/破坏性标注)见 docs/TOOLS.md。该文档根据实时的 tools/list 响应生成,并通过 CI 中的契约测试验证。除 listSystems 和 healthcheck 外,每个工具都接受可选的 destination。
工具架构会占用上下文。MCP_TOOLSETS 可设置为预设(all,默认值,或 focused = 114 个开发工具),也可设置为下方工具集名称组成的逗号分隔列表;MCP_DISABLED_TOOLSETS 可移除部分工具集;core 始终会发布。
粗体名称带有 destructiveHint: true(共 23 个工具):这些工具会覆盖、删除、释放或运行某些内容;对于按注释控制审批的宿主,每次调用前都会要求审批。
在 focused 预设中(114 个工具)
| 工具集 | 工具 |
|---|---|
core (6)目标、运行状况和会话 | login, logout, dropSession, listSystems, healthcheck, systemProfile |
source (16)源代码 | lock, unLock, listLocks, forceUnlock, getObjectSource, setObjectSource, editObjectSource, getMethodSource, setMethodSource, prettyPrinterSetting, setPrettyPrinterSetting, prettyPrinter, revisions, objectDiff, getTextElements, setTextElements |
objects (27)对象和导航 | objectStructure, searchObject, findObjectPath, objectTypes, reentranceTicket, classIncludes, classComponents, deleteObject, activateObjects, activateByName, activatePackage, inactiveObjects, objectRegistrationInfo, creatableTypeDetails, validateNewObject, createObject, nodeContents, mainPrograms, typeHierarchy, objectStructureElements, objectEnhancements, packageTree, exportPackageSources, whereUsed, cdsViewInfo, sourceTextSearch, grepPackage |
transports (18)传输 | transportDetails, transportUnifiedDiff, transportInfo, resolveTransport, createTransport, hasTransportConfig, transportConfigurations, getTransportConfiguration, setTransportsConfig, createTransportsConfig, userTransports, transportsByConfig, transportDelete, transportRelease, transportSetOwner, transportAddUser, systemUsers, transportReference |
analysis (16)语法和代码分析 | syntaxCheckCode, syntaxCheckCdsUrl, codeCompletion, findDefinition, usageReferences, syntaxCheckTypes, codeCompletionFull, runClass, codeCompletionElement, usageReferenceSnippets, fixProposals, fixEdits, fragmentMappings, abapDocumentation, apiReleaseState, runSnippet |
tests (4)单元测试 | unitTestRun, unitTestEvaluation, unitTestOccurrenceMarkers, createTestInclude |
atc (14)ATC | atcCustomizing, atcQuickfixProposals, atcApplyQuickfix, atcCheckVariant, atcSummary, createAtcRun, atcWorklists, atcUsers, atcExemptProposal, atcRequestExemption, isProposalMessage, atcContactUri, atcChangeContact, atcDocumentation |
data (10)数据访问和 DDIC | annotationDefinitions, ddicElement, ddicRepositoryAccess, packageSearchHelp, getDomainProperties, setDomainProperties, getDataElementProperties, setDataElementProperties, tableContents, runQuery |
runtime (3)运行时错误 | feeds, dumps, dumpDetails |
仅使用 MCP_TOOLSETS=all 或按工具集名称指定时可用(59 个工具)
| 工具集 | 工具 |
|---|---|
discovery (7)发现与元数据 | featureDetails, collectionFeatureDetails, findCollectionByUrl, loadTypes, adtDiscovery, adtCoreDiscovery, adtCompatibilityGraph |
refactoring (8)重构 | renameEvaluate, renamePreview, renameExecute, extractMethodEvaluate, extractMethodPreview, extractMethodExecute, changePackagePreview, changePackageExecute |
rap (8)RAP 生成 | rapGenIsAvailable, rapGenGetSchema, rapGenGetContent, rapGenValidateInitial, rapGenValidateContent, rapGenPreview, rapGenGenerate, rapGenPublishService |
services (4)业务服务 | publishServiceBinding, unPublishServiceBinding, fetchServiceDetails, bindingDetails |
git (10)abapGit | gitRepos, gitExternalRepoInfo, gitCreateRepo, gitPullRepo, gitUnlinkRepo, stageRepo, pushRepo, checkRepo, remoteRepoInfo, switchRepoBranch |
debugger (13)调试器 | debuggerListeners, debuggerListen, debuggerDeleteListener, debuggerSetBreakpoints, debuggerDeleteBreakpoints, debuggerAttach, debuggerSaveSettings, debuggerStackTrace, debuggerVariables, debuggerChildVariables, debuggerStep, debuggerGoToStack, debuggerSetVariableValue |
traces (9)跟踪 | tracesList, tracesListRequests, tracesHitList, tracesDbAccess, tracesStatements, tracesSetParameters, tracesCreateConfiguration, tracesDeleteConfiguration, tracesDelete |
工具缺失有两种原因:其工具集尚未发布(拒绝信息会指出该工具集),或者目标端无法提供该工具(systemProfile 会报告缺失内容)。
与 SAP 官方 ADT MCP 服务的比较
SAP 的 ADT MCP Server 随 ADT for VS Code 和 Eclipse 一起提供,并以服务键 abap-adt 发布,使用自己的工具名称。本项目以 abap-adt-mcp 发布,可通过一个进程服务多个目标,在服务端强制执行策略,并增加了 resolveTransport、editObjectSource、grepPackage、apiReleaseState、runSnippet 和 objectDiff 等组合工具。两者可以在同一主机上并行运行;docs/ROUTING.md 列出了 SAP 名称与本项目名称的对应关系。
名称以 SAP 帮助页面“Model Context Protocol Tools”上的列表为准(2026 年 9 月)。SAP 的服务可以创建、激活、测试、检查和传输对象;它不读取或搜索源代码、不写入源代码、不加锁,也不显示转储:这些功能仅由本服务提供。
| SAP 官方工具 | abap-adt-mcp 工具 |
|---|---|
abap_lists_destinations | listSystems、systemProfile |
abap_creation-get_all_creatable_objects、abap_creation-get_object_type_details | objectTypes、creatableTypeDetails |
abap_creation-run_validation、abap_creation-create_object | validateNewObject、createObject |
abap_activate_objects | activateByName、activateObjects、activatePackage |
abap_run_unit_tests | unitTestRun、unitTestEvaluation |
abap_transport-create、abap_transport-get | createTransport、resolveTransport、transportInfo、transportDetails、userTransports |
abap_transport-unifiedDifference | transportUnifiedDiff |
abap_generators-list_generators、abap_generators-get_schema、abap_generators-generate_objects | rapGenIsAvailable、rapGenGetSchema、rapGenValidateContent、rapGenPreview、rapGenGenerate |
abap_business_services-fetch_services、abap_business_services-fetch_service_information | fetchServiceDetails、bindingDetails |
abap_atc_run、abap_atc_get_result | createAtcRun、atcWorklists、atcSummary |
abap_atc_execute_deterministic_quickfixes | atcQuickfixProposals、atcApplyQuickfix |
abap_atc_apply_ai_fix、abap_atc_get_ai_fix_result(需要 Joule 许可证) | 无对应工具:模型读取检查结果(atcDocumentation),并自行编辑源代码(editObjectSource) |
| SAP 的服务中没有:读取和搜索源代码、写入源代码、加锁、转储、数据、使用位置、调试器、abapGit、Clean Core 检查 | getObjectSource、searchObject、sourceTextSearch、grepPackage、setObjectSource、editObjectSource、lock、dumps、runQuery、whereUsed、调试器和 abapGit 工具集、apiReleaseState |
SAP API 政策
- SAP 的说法。 本服务调用的 ADT REST 服务(
/sap/bc/adt)也是 Eclipse ADT 使用的服务;SAP 未在 SAP Business Accelerator Hub 上列出这些服务。2026 年 4 月的 SAP API Policy 限制使用未发布的接口,以及 AI Agent 在 SAP 认可的架构之外使用 API。SAP 针对该政策的常见问题解答称,ADT API 属于内部 API,仅可通过认可的渠道用于开发;其列出的渠道中不包括第三方 MCP 服务;同一份常见问题解答也允许一般情况下使用第三方 MCP 服务,并说明使用未发布接口的风险由使用者自行承担。 - 这对你意味着什么。 SAP 是否接受你的使用方式,应向你的 SAP 联系人确认,而不是向本项目确认。
- 应该怎么做。 提出这个问题,并将本服务用于开发系统和测试系统上的开发工作。
本服务在自身方面的处理方式:它以登录用户的 SAP 身份运行,不会绕过任何 SAP 授权检查;只有在某个目标允许读取表数据后,它才会读取表数据;它会逐个运行发往某个目标的调用;apiReleaseState 会将其检查的每个 SAP 对象标记为 released、classic、notReleased 或 prohibited。docs/API-POLICY.md 按章节介绍了相关政策、应向 SAP 提出的问题以及保守的配置方案。
故障排除
- 服务器始终未在宿主端显示。 查看宿主端的 MCP 日志:在 macOS 上,Claude Desktop 会将
mcp.log和mcp-server-abap-adt-mcp.log写入~/Library/Logs/Claude;在 Windows 上,则写入%APPDATA%\Claude\logs;Claude Code 可通过/mcp查看状态。Claude Desktop 只会在启动时读取配置:每次更改后都要退出并重新打开。spawn npx ENOENT:未安装 Node.js,或应用可见的 PATH 中没有 Node.js。请安装它,或在command中填写npx的绝对路径(Windows 上为C:/Program Files/nodejs/npx.cmd,macOS 上为/usr/local/bin/npx或/opt/homebrew/bin/npx)。EBADENGINE:宿主找到的 Node 版本低于 22.12。No ABAP systems configured:SAP_SYSTEMS_FILE指向的文件不存在(在 Windows 上,请检查文件名是否为systems.json.txt)。is not valid JSON:存在多余的逗号,或 Windows 路径使用了单反斜杠。
- 未弹出浏览器窗口,或 SSO 失败。 必须安装 Chromium 浏览器;自动检测失败时,
SAP_BROWSER_PATH指向该浏览器。要完全退出某个租户,请删除主目录下.abap-adt-mcp中的sso/<host>文件夹(Windows 上为C:\Users\<you>)。在没有显示器的机器上(如 CI 运行器、容器),登录会立即拒绝,并改为使用oauth或sso2。 - 登录成功,但之后所有操作都显示“not authorized”或“not found”。 SSO 会话登录到了与
client设置不同的客户端:请将client设置为该租户的登录客户端。 kind: "sessionExpired"反复出现。 服务器已重新进行身份验证并重试一次;请让模型为该目标调用login。旧会话中的锁句柄已失效:请重新加锁。kind: "locked",提示被另一个会话锁定。listLocks会显示服务器自身的锁;如果对象不在其中,该锁属于另一个会话(Eclipse 或其他用户),只有该会话或SM12才能释放它。kind: "policyDenied"。 目标的policy禁止了此调用,消息会指出限制项:防护机制正在正常工作。对于未开放tableContents和runQuery的目标,包括未设置policy的目标,这些工具调用都会被拒绝;消息会指出需要设置的键。- 工具被拒绝,提示不可用或未启用。 “Not available on destination”:该租户缺少此 ADT 集合(
systemProfile会显示)。"Belongs to toolset ... which is not enabled":请将该工具集添加到MCP_TOOLSETS,或使用MCP_TOOLSETS=all。 - 本地部署环境中的证书错误(
kind: "tlsCertificate")。 提示会指出目标及修复方法:颁发者未知时设置tls.ca(提示中会附带openssl命令行);名称不匹配时设置tls.servername;证书过期时在STRUST中续期。 - 在较旧的本地部署系统上,虽然加锁成功,但写入因
invalid lock handle失败。 低于 7.51 的 SAP_BASIS 不会在 HTTP 请求之间保留锁。请将目标切换为 RFC 传输:docs/RFC.md。 editObjectSource报告匹配项为 0 个或多个。 未写入任何内容。锚点必须与 SAP 上当前文本完全一致,包括缩进;如果有多个匹配项,请增加周围的行以缩小范围。runQuery在用户可以显示的表上失败。 数据预览会拒绝dataMaintenance受限的表;请使用tableContents。
更多情况及对应的确切消息,请参阅 docs/TROUBLESHOOTING.md。
测试与贡献
git clone https://github.com/williansaez/abap-adt-mcp.git
cd abap-adt-mcp
npm ci
npm run build
npm test
- Jest 测试套件覆盖处理程序、错误提示、响应大小、工具集和目录契约;CI 会在 Node 22 和 24 上运行测试,并构建容器镜像。
- 更改工具后,运行
npm run tools:docs,并提交重新生成的docs/TOOLS.md、快照和 README 目录(包括已翻译的 README)。 npm run docs:check是文档检查关卡:不得包含客户标识符,不得使用破折号,不得有失效链接,且server.json中必须声明所有环境变量。- 发布由标签驱动:通过可信发布发布 npm 包及其来源证明、GHCR 镜像和 MCP 注册表条目。
- Fork 仓库、创建分支并发起拉取请求;详情请见 CONTRIBUTING.md。欢迎提交会话报告至 docs/FIELD-NOTES.md,但请勿包含客户名称、租户或传输编号。
英文 README 是葡萄牙语和德语版本的参考。路线图见 docs/ROADMAP.md,每个版本的更新记录见 CHANGELOG.md。
致谢
本服务因那些在真实系统环境中使用它并分享发现的人们而不断发展。
- João Gementi 贡献了无头
sso2模式(已通过 SNC 完成身份验证的具名本地用户,无需浏览器或已存储的密码即可连接),并改进了 Cookie 客户端;现在,任何会将 SAP 会话带离其配置来源的请求都会被拒绝。 - Alexandre Leite 报告了 Secure Login Client 场景,由此开启了 2.1.0 里程碑,并测试了本地身份验证路径。
- 本项目始于 mario-andreschak 的原始
mcp-abap-abap-adt-api服务。
如果你发现了问题、修复了问题,或在我们未接触过的系统环境中运行了某种模式,请提交问题或拉取请求,并参阅 CONTRIBUTING.md。
许可证
MIT。基于 Marcello Urbani 的 abap-adt-api 构建。如果本项目为你节省了时间,可以赞助作者。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。