@abapify/adt-mcp (英语)
MCP(模式上下文协议)服务器将SAP ADT操作暴露为AI助手,IDE集成和自动化管道的结构化工具.
这个包裹船 两次运输数字 :
| 二进制 | 运输 | 国家模式 |
|---|---|---|
adt-mcp | stdio (JSON-RPC 过管道) | 无国籍者——接通电话. |
adt-mcp-http | 可流取的 HTTP | 会话范围已缓存 AdtClient,锁,和更改. |
见 docs/deployment/mcp-http.md 用于完整的HTTP部署指南(Docker,Okta,多系统,故障排除). 其余的这个README专注于stdio.
快速启动( stdio)
# Run via npx (no install required)
npx @abapify/adt-mcp
在克洛德桌面中配置
添加为 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)或者您的OS上的等同路径:
{
"mcpServers": {
"adt": {
"command": "npx",
"args": ["@abapify/adt-mcp"]
}
}
}
配置 VS 代码( GitHub 副驾驶代理模式)
添加为 .vscode/mcp.json 在工作空间中,或到您的用户设置 "mcp"数字 :
{
"servers": {
"adt": {
"type": "stdio",
"command": "npx",
"args": ["@abapify/adt-mcp"]
}
}
}
在 Cursor / Windsurf 中配置
添加到您的 MCP 服务器列表 :
{
"mcpServers": {
"adt": {
"command": "npx",
"args": ["@abapify/adt-mcp"]
}
}
}
HTTP运输(自第一波起)
adt-mcp-http 是可流的 HTTP 输入点。 它的目标是共享/远程部署(Docker、Kubernetes、Kiro、团队).
最小运行 :
bunx nx build adt-mcp
node packages/adt-mcp/dist/bin/adt-mcp-http.mjs --port 3000 --auth-token "$(openssl rand -hex 32)"
最小烟雾测试:
TOKEN=<your token>
curl -sf http://127.0.0.1:3000/healthz
curl -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-X POST http://127.0.0.1:3000/mcp \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"demo","version":"0"}}}'
抓起来 Mcp-Session-Id 响应头,然后呼叫 sap_connect,你需要的工具, 最后 sap_disconnect ——或关闭运输自动触发清理.
Auth 模式 : none (dev/回转), bearer (共享秘密), proxy (信托) x-forwarded-user 从上游代理, oauth (OIDC JWT针对Okta / Entra ID / Cognitto的验证). 全旗 + env 矩阵 docs/deployment/mcp-http.md。 。 。 .
会话生命周期工具
仅在HTTP运输中可用 :
| 工具 | 目的 |
|---|---|
sap_connect | 每一次MCP会话进行SAP安全会话握手. 接受内置证书或 a systemId 已解决 SAP_SYSTEMS_JSON 编号 : SAP_SYSTEMS_FILE。 。 。 . |
sap_disconnect | 释放锁,DELETE SAP安全会话,并放下缓存客户端. |
(自第3波起)交易变更
Bundle 多个 ADT 写入单个原子单位:
| 工具 | 目的 |
|---|---|
changeset_begin | 打开与当前 MCP 会话绑定的交易单位工作( 一次一个) . |
changeset_add | 阶段一个对象写入——获得一个锁并PUT提供源. 德弗斯启动. |
changeset_commit | 批量活化单个调用中每个已上演的对象,再放出所有锁. |
changeset_rollback | 释放每个被扣的锁 并标记回滚的更改器。 源 PUT 不返回( SAP 没有交易抛弃) . |
见 docs/deployment/mcp-http.md#transactional-changesets 是一个实例.
连接参数
每个工具都需要这些连接参数(通过每次呼叫,从未存储) :
| 参数 | 类型 | 需求 | 说明 |
|---|---|---|---|
baseUrl | 字符串 | ✅ | SAP系统基础URL,例如. https://my-system.example.com:8000 |
client | 字符串 | —— 说 | SAP客户号,例如:. 100 |
username | 字符串 | —— 说 | 基本认证的用户名 |
password | 字符串 | —— 说 | 基本认证的密码 |
安全说明: 证书按请求直接转交SAP系统。 MCP服务器没有状态,并且坚持没有证书.
工具参考
发现系统( S)
discovery
在SAP系统中发现可用的ADT服务. 用于在使用其他工具之前检查系统支持的终点.
参数: 仅连接
回返情况: JSON对象具有可用的服务收藏及其链接.
system_info
获取SAP系统和/或会话信息.
参数:
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
scope | "session" | "system" | "both" | "both" | 获取什么信息 |
回返情况:
{
"session": { "user": "DEVELOPER", "client": "100", "language": "EN", ... },
"system": { "systemId": "DEV", "release": "757", ... }
}
对象仓库
search_objects
在仓库中搜索 ABAP 对象 。 支持通配符.
参数:
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
query | 字符串 | ✅ | 搜索名词等. ZCL_* 或者说 MY_CLASS |
maxResults | 编号 | 50 | 最大结果数 |
回返情况:
{
"count": 3,
"objects": [
{ "name": "ZCL_MY_CLASS", "type": "CLAS/OC", "uri": "/sap/bc/adt/oo/classes/zcl_my_class", ... }
]
}
get_object
获取特定ABAP对象的名称细节 。 进行精确匹配搜索,如果找不到精确匹配,则返回对象元数据加上类似对象列表.
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
objectName | 字符串 | 要查找的 ABAP 对象名称 |
回返情况:
{ "found": true, "object": { "name": "ZCL_MY_CLASS", "type": "CLAS/OC", "uri": "...", ... } }
或,未找到时:
{ "found": false, "message": "Object 'FOO' not found", "similar": [...] }
源代码
list_source_versions
列出不可移动的 ADT 源版元数据和运输出处 一个对象的源组件。 结果是只使用元数据;它从未嵌入 ABAP来源.
| 参数 | 类型 | 说明 |
|---|---|---|
objectName | 字符串 | ABAP 对象名称 |
objectType | 字符串 | 对象类型( E)PROG, (中文(简体) ), CLAS, (中文(简体) ), INTF, (...) (中文(简体) ) |
component | 绳子? | 精确组件 ID 如 implementations |
get_source_version
明确读取一个不可变源 URI 返回
list_source_versions 或者说 cts_transport_source_manifest输出范围
以 maxBytes (1 MiB 默认, 4 MiB 硬盖) 并失败而非截取.
| 参数 | 类型 | 说明 |
|---|---|---|
uri | 字符串 | 服务器关系不可改变 /sap/bc/adt/... URI 资源 |
maxBytes | 号码? | UTF-8 响应限制 |
cts_transport_source_manifest
构建一个仅包含元数据、 组件- 角精确度的指令列表 非空运列表。 每个叶子都报告它的变化类型,精确度, 具体请求/任务来源,已知的不可改变基准/标题参考文献, 以及无法证实完全隔离时的打字诊断.
| 参数 | 类型 | 说明 |
|---|---|---|
transports | 字符串 [] | 订购的请求/任务标识符 |
selector | 对象? | 可选 objFunc, (中文(简体) ), pgmid,以及 type 过滤器 |
concurrency | 号码? | 受约束元数据/食用货币(最多32个) |
get_source
为程序、类、接口或函数组获取ABAP源代码。 支持版本感知读取,类包括,方法级读取,并用regex grep来进行有符号效率的源探索.
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
objectName | 字符串 | ABAP 对象名称 |
objectType | 绳子? | 对象类型提示( E)PROG, (中文(简体) ), CLAS, (中文(简体) ), INTF。在提供搜索回路时跳过. |
version | 埃努姆吗? | active (默认, 上次激活) 或 inactive (未激活的草稿). |
include | 绳子? | 对于 CLAS:来源包括(main, (中文(简体) ), definitions, (中文(简体) ), implementations, (中文(简体) ), testclasses, (中文(简体) ), macros, (中文(简体) ), text_symbols, (中文(简体) ), localtypes) (中文(简体) ). |
method | 绳子? | 对于 CLAS: 要读取的方法名称, 或 * 以列出所有方法. |
grep | 绳子? | Regex 模式; 返回与上下文匹配的源行而不是完整源行 。 对于 CLAS 源,每个匹配都附加了自有方法/类/包含的注释. |
maxBytes | 号码? | 以字节表示的最大UTF-8响应大小(默认为一米B,硬盖为二米B). |
format | 埃努姆吗? | raw (违约)或 structured (类包括并用方法边界为JSON). |
回返情况:
- 默认 :
{ object, bytes, source, version, include } method=*数字 :{ object, methodCount, methods }method=<name>数字 :{ object, method, startLine, endLine, bytes, source }grep数字 :{ object, pattern, matchCount, matches, methodContext }format=structured数字 :{ object, source, bytes, version, include, includes, methods }
实例:
get_source objectName=ZCL_ORDER objectType=CLAS version=inactive
get_source objectName=ZCL_ORDER objectType=CLAS include=testclasses
get_source objectName=ZCL_ORDER objectType=CLAS method=get_name
get_source objectName=ZCL_ORDER objectType=CLAS grep="SELECT.*FROM"
提示 : 不要合并 method 财务报告和审定财务报表 grep启用 grep 然后找到密码 method 以读取完整的方法.
update_source
将新的 ABAP 源代码写入已有对象 。 内部执行全SAP ADT锁 PUT 解锁循环.
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
objectName | 字符串 | ABAP 对象名称 |
objectType | 绳子? | 对象类型提示 |
sourceCode | 字符串 | 新建 ABAP 源代码 |
transport | 绳子? | 运输请求号(可运输物品需要) |
回返情况:
{ "status": "updated", "object": "ZCL_MY_CLASS" }
⚠️ 更新后总是激活 ——不活动源没有编译,无法执行.
get_test_classes
检索测试类定义(FOR TESTING)嵌入于ABAP类. 返回测试类的原始来源.
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
className | 字符串 | ABAP类名称,例如. ZCL_MY_CLASS |
回返情况: 本地测试类的普通ABAP来源包括.
激活语法( C)
activate_object
激活一个或多个ABAP对象. 支持单对象和批量模式.
单个对象模式 :
| 参数 | 类型 | 说明 |
|---|---|---|
objectName | 字符串 | ABAP 对象名称 |
objectType | 字符串 | 对象类型( E)PROG, (中文(简体) ), CLAS, (中文(简体) ), INTF, (...) (中文(简体) ) |
批量模式 :
| 参数 | 类型 | 说明 |
|---|---|---|
objects | Array<{objectName, objectType}> | 一个请求中要激活的对象 |
回返情况:
{ "status": "activated", "count": 2, "objects": [{ "name": "ZCL_FOO", "type": "CLAS" }, ...] }
check_syntax
运行一个对象的ABAP语法检查并返回结构化的检查消息. 使用 checkrun schema — 在工具代码中没有解析 XML .
参数:
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
objectName | 字符串 | ✅ | ABAP 对象名称 |
objectType | 绳子? | —— 说 | 快速解析对象类型提示 |
version | "active" | "inactive" | "new" | "active" | 要检查的版本 |
回返情况:
{
"hasErrors": false,
"hasWarnings": true,
"reports": [
{
"reporter": "syntax",
"triggeringUri": "/sap/bc/adt/oo/classes/zcl_foo",
"checkMessageList": {
"checkMessage": [{ "type": "W", "shortText": "Variable X is unused", ... }]
}
}
]
}
单位测试
run_unit_tests
运行 ABAP 单位在物体或包上进行测试,并收到按测试方法细分的通过/失败计数.
参数:
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
objectName | 字符串 | ✅ | 对象名称( 类、 程序或软件包) |
objectType | 绳子? | —— 说 | 类型提示( E)CLAS, (中文(简体) ), PROG, (中文(简体) ), DEVC, (...) (中文(简体) ) |
withCoverage | 布尔 | false | 是否收集代码覆盖数据 |
回返情况:
{
"totalTests": 5,
"passCount": 4,
"failCount": 1,
"errorCount": 0,
"programs": [ ... ]
}
软件包管理
list_package_objects
列出包中包含的ABAP对象. 用途 quickSearch 带有 packageName 过滤器.
参数:
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
packageName | 字符串 | ✅ | 包名,例如:. ZPACKAGE |
objectType | 绳子? | —— 说 | 按类型过滤( N)CLAS, (中文(简体) ), PROG, (...) (中文(简体) ) |
maxResults | 编号 | 200 | 最大结果计数 |
回返情况:
{
"packageName": "ZPACKAGE",
"count": 12,
"objects": [{ "name": "ZCL_FOO", "type": "CLAS/OC", ... }]
}
改变和运输系统(CTS)
cts_list_transports
列出CTS的运输请求.
参数:
| 参数 | 类型 | 默认 |
|---|---|---|
maxResults | 编号 | 50 |
回返情况: 运输请求描述符.
cts_get_transport
获取具体运输请求的细节.
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
transportId | 字符串 | 运输编号,例如:. DEVK900001 |
回返情况: 完整的运输描述符,包括任务和对象.
cts_create_transport
创建新的运输请求 .
参数:
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
description | 字符串 | ✅ | 运输说明 |
type | "K" | "W" | "K" | 工作中心(K)或自定义(W(中文(简体) ) |
cts_create_task
在现有运输请求下创建并核查可修改的任务.
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
transport | 字符串 | 父母运输申请号 |
owner | 字符串 | SAP 用户将拥有此任务 |
回返情况: 母运输编号,创建任务编号,规范所有者,
财务报告和审定财务报表 created 状态.
cts_release_transport
发布运输请求.
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
transport | 字符串 | 运输编号 |
releaseAll | 布尔 | 在请求前释放可修改的任务 |
cts_delete_transport
删除运输请求.
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
transport | 字符串 | 运输编号 |
flow_checkout_tr
将允许的本地工作空间调和到精确的运输源边界.
工具代表 @abapify/adt-flow; 它不运行 Git 命令 .
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
transports | 字符串 [] | ✅ | 非空运输范围 |
workspaceRoot | 字符串 | ✅ | 服务器所属根中的绝对目录 |
base | 布尔 | false | 在范围前选择版本 |
verifyInventory | 布尔 | false | 重算存货而不是重用精确标题索引 |
JSON结果包含更改、移动、去除、不变、描述和
SAP的电话数。 与 verifyInventory: true,其中还包含刷新
清单和每个项目的决议结果。 它从不包含源体或
证书.
flow_index_tr
长期库存和未解决的当地允许的边界说明
不读取或实现源文件的工作空间。 不像严格
flow_checkout_tr,此工具将不准确的组件记录为省略
稍后精确的检出可以重试它们.
| 参数 | 类型 | 说明 |
|---|---|---|
transports | 字符串 [] | 非空运输范围 |
workspaceRoot | 字符串 | 服务器所属根中的绝对目录 |
JSON结果包含运输/物体说明和疏漏诊断; 它的源调数总是零.
ABAP 测试舱(ATC)
atc_run
运行 ABAP 测试 Cockpit 检查对象或包并返回结果工作列表 .
在目的模式下,此操作需要明确 safe_execute
赠款。 A 类 read 赠款不足,因为SAP创建了临时
用于分析的服务器侧工作列表.
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
scope | 对象 | ATC 范围 : { kind: 'package', packageName }, (中文(简体) ), { kind: 'transport_request', trkorr },或 { kind: 'objects', objects: [{ objectType, objectName }] } |
回返情况:
{ "status": "completed", "worklist": { ... } }
共同工作流程
读取 编辑 保存 激活
1. get_source objectName=ZCL_FOO objectType=CLAS
2. update_source objectName=ZCL_FOO objectType=CLAS sourceCode="..." transport=DEVK900001
3. check_syntax objectName=ZCL_FOO objectType=CLAS version=inactive
4. activate_object objectName=ZCL_FOO objectType=CLAS
5. run_unit_tests objectName=ZCL_FOO objectType=CLAS
探索软件包
1. list_package_objects packageName=ZPACKAGE
2. get_object objectName=ZCL_FOO objectType=CLAS
3. get_source objectName=ZCL_FOO objectType=CLAS
质量门
1. check_syntax objectName=ZCL_FOO objectType=CLAS
2. atc_run scope={"kind":"objects","objects":[{"objectType":"CLAS","objectName":"ZCL_FOO"}]}
3. run_unit_tests objectName=ZCL_FOO objectType=CLAS
建筑
┌──────────────┐ stdio (JSON-RPC) ┌──────────────────────────────┐
│ MCP Client │ ◄───────────────────► │ @abapify/adt-mcp │
│ (AI / IDE) │ │ McpServer (17 tools) │
└──────────────┘ └──────────────┬───────────────┘
│ calls
┌──────────────▼───────────────┐
│ @abapify/adt-client │
│ (typed contracts via speci) │
└──────────────┬───────────────┘
│ HTTP/HTTPS
┌──────────────▼───────────────┐
│ SAP System (ADT REST) │
└──────────────────────────────┘
设计原则:
- 无逻辑重复 - 工具代表
@abapify/adt-client服务. - 基于Schema的序列化 - 请求/答复 XML 是通过打入的系统处理的,来自
@abapify/adt-schemas。没有手动 XML 构建,也没有第三方 XML 解析器. - 结构化 JSON – 每个工具返回JSON,从不原始控制台输出.
- Zod 验证 – 所有工具输入在到达SAP系统之前都经过验证.
- 连线 – 每个工具调用都会创建自己的ADT客户端;服务器是无国籍的.
程序用途
import { createMcpServer } from '@abapify/adt-mcp';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = createMcpServer();
const transport = new StdioServerTransport();
await server.connect(transport);
自定义客户端工厂(例如用于测试或SSO)
import { createMcpServer } from '@abapify/adt-mcp';
const server = createMcpServer({
clientFactory: (params) =>
createAdtClient({
baseUrl: params.baseUrl,
username: params.username ?? '',
password: params.password ?? '',
client: params.client,
}),
});
测试
集成测试使用Vitest和一个内置的模拟APT服务器,不需要SAP系统.
# Run all integration tests
bunx vitest run tests/integration.test.ts
在自己的测试中使用模拟服务器
模拟ADT服务器 住在私人 @abapify/adt-fixtures 软件包
(monorepo- only – 它不发布于 npm). 在这个仓库里
集成测试直接导入:
import { createMockAdtServer } from '@abapify/adt-fixtures';
发展
bunx nx build adt-mcp # build
bunx nx typecheck adt-mcp # type check
bunx nx lint adt-mcp # lint
bunx nx test adt-mcp # run integration tests with Vitest
特征对等地图
| CLI 命令 | MCP 工具 | 状态 |
|---|---|---|
adt discovery | discovery | ✅ |
adt info | system_info | ✅ |
adt search | search_objects | ✅ |
adt get | get_object | ✅ |
adt source get | get_source | ✅ |
adt source versions | list_source_versions | ✅ |
adt source version get | get_source_version | ✅ |
adt source put | update_source | ✅ |
adt activate | activate_object | ✅ |
adt check | check_syntax | ✅ |
adt aunit run | run_unit_tests | ✅ |
adt atc run | atc_run | ✅ |
adt cts tr list | cts_list_transports | ✅ |
adt cts tr get | cts_get_transport | ✅ |
adt cts tr task create | cts_create_task | ✅ |
adt cts tr source-manifest | cts_transport_source_manifest | ✅ |
adt cts tr delete | cts_delete_transport | ✅ |
adt cts tr create | cts_create_transport | ✅ |
adt cts tr release | cts_release_transport | ✅ |
adt flow checkout tr | flow_checkout_tr | ✅ |
adt flow index tr | flow_index_tr | ✅ |
adt ls | —— 说 | 未来 |
adt cts search | —— 说 | 未来 |
adt import package | —— 说 | 未来 |
adt import transport | —— 说 | 未来 |