当 Claude 学会写 ABAP:MCP 协议让 AI 从“看代码“到“改代码“
摘要:AI 编程工具在 ABAP 面前失灵,根源在于"文件驱动"与"服务器端对象驱动"两种开发范式的结构性错位。MCP 协议为这座玻璃墙开了一扇窗——通过将 SAP ADT API 封装为 AI 可调用的标准化工具,Claude Code 终于能直接操作 ABAP 系统:搜索对象、读写代码、锁管理、语法检查、激活上线,全流程自主完成。本文从问题诊断到环境搭建、从 MCP 配置到实战演示,完整记录这套方案的落地过程。
一、为什么 AI 编程工具在 ABAP 世界里"水土不服"?
1.1 一个尴尬的现实
打开 Cursor 写 Python,AI 能帮你补全函数、生成测试、重构代码——体验丝滑。但切到 Eclipse 写 ABAP,同样的 AI 工具突然就"哑"了:它能补几个关键字,却帮不了你创建一个类、激活一个程序、甚至查一个传输请求。
问题出在哪?不是 AI 不够聪明,而是它根本够不着 ABAP 的世界。

主流 AI 编程工具的整个架构都建立在一个隐含假设上:代码 = 本地文件。读文件、写文件、diff 文件——所有操作都围绕文件系统展开。但 ABAP 偏不按这个套路来:
- 代码住在服务器上,不落盘到你本机。你在 Eclipse 里看到的"文件",本质上是 ADT API 拉回来的一段文本快照,改完还得通过 API 推回去;
- 开发动作远不止"编辑"。锁对象、写传输、激活、语法检查——这些在 Java/Python 世界里由构建工具完成的事,在 ABAP 里是开发流程本身的一部分。
结果就是:AI 工具在 ABAP 面前,像一个只会读写纸条的人,被隔在一面玻璃墙外。它能看到代码,但碰不到系统。
1.2 问题的根源:两种世界观的冲突
把问题抽象一下,冲突在于:
| AI 编程工具的世界观 | ABAP 的世界观 | |
|---|---|---|
| 代码在哪 | 本地文件系统 | SAP 服务器端 |
| 怎么改代码 | 编辑文件、保存 | 锁定 → 修改 → 激活 → 解锁 |
| 怎么发布 | git push / 构建 | 传输请求(Transport Request) |
| 质量保障 | 单元测试、CI | 语法检查、ATC |
这不是某个工具的缺陷,而是两种开发范式的结构性错位。AI 以"文件"为原子操作单元,ABAP 以"服务器端对象"为原子操作单元,中间缺少一座桥。
1.3 Joule 能解决问题吗?
SAP 自己推出了 Joule 作为 AI 编程助手,但它有一个明确的边界:主要服务于 BTP / Cloud 产品线。而国内 SAP 生态的现实是——大量企业仍在 On-Premise 系统上运行核心业务,这些系统接入 Joule 的路径漫长且不确定。
OP 用户需要一个今天就能用的方案。
二、MCP:给 AI 一双能伸进 SAP 系统的手
2.1 从"看得到"到"摸得着"
如果把 AI 工具比作一个坐在玻璃墙外的开发者,那 MCP(Model Context Protocol)就是墙上开的那个窗口。
MCP 是 Anthropic 提出的开放协议,定义了一套标准化的方式,让 AI 模型能够调用外部工具。它的核心思想很朴素:别让 AI 自己去猜怎么读文件、怎么发 HTTP 请求——把外部系统的能力封装成一个个"工具",AI 只需要说"帮我调用 searchObject",底层怎么跟 SAP 通信,它不需要关心。
这恰好解决了 ABAP 场景的核心痛点:AI 不需要理解 ADT API 的细节,只需要知道有哪些工具可用、每个工具要什么参数。
2.2 mcp-abap-abap-adt-api:把整个 ADT 装进 MCP
mcp-abap-abap-adt-api 这个项目做的事情,用一句话概括就是:把 SAP ADT REST API 的能力,翻译成 MCP 协议能理解的工具集。
它基于 abap-adt-api(一个成熟的 Node.js 库)封装,覆盖了 ABAP 开发的全链路操作:
| 能力维度 | 具体工具 | 解决什么问题 |
|---|---|---|
| 系统连接 | login / logout / dropSession |
AI 能登录 SAP、管理会话 |
| 对象操作 | searchObject / getObjectSource / setObjectSource / createObject / activate |
AI 能查找、读取、修改、创建、激活 ABAP 对象 |
| 开发管控 | lock / unLock / transportInfo / createTransport |
AI 能处理锁机制和传输请求 |
| 质量保障 | syntaxCheckCode |
AI 能在提交前做语法检查 |
| 数据字典 | GetTable / GetStructure / setDomainProperties / setDataElementProperties |
AI 能查看表结构、创建 DDIC 对象 |
项目地址:
- 原始仓库:mario-andreschak/mcp-abap-abap-adt-api(136 Stars)
- 国内 Fork(增加长代码处理、缩减 tool 数量、增加域/元素创建):lingcSun/mcp-abap-abap-adt-api
三、完整安装与环境搭建
3.1 前置条件
| 依赖项 | 要求 | 说明 |
|---|---|---|
| Node.js | v18+ | 从 nodejs.org 下载 |
| SAP 系统 | 可访问的 ABAP 系统 | 需要 URL、用户名、密码 |
| Git | 任意版本 | 用于克隆仓库 |
SAP 系统连接信息需要准备:
- 服务器 URL(如
https://your-sap-server.com:44300) - 用户名
- 密码
- Client 号(可选但推荐,如
100) - 语言(可选但推荐,如
ZH)
3.2 方式一:手动安装(推荐学习使用)
Step 1:克隆仓库
git clone https://github.com/mario-andreschak/mcp-abap-abap-adt-api.git
cd mcp-abap-abap-adt-api
如果网络受限,可使用国内 Fork 版本(增加了长代码处理、缩减 tool 数量、增加域/元素创建等功能):
git clone https://github.com/lingcSun/mcp-abap-abap-adt-api.git
cd mcp-abap-abap-adt-api
Step 2:安装依赖
npm install
此命令会根据 package.json 自动安装所有依赖。项目核心依赖如下:
{
"dependencies": {
"@modelcontextprotocol/sdk": "^1.4.1",
"abap-adt-api": "^6.2.0",
"dotenv": "^16.4.7",
"typescript": "^5.7.3"
},
"devDependencies": {
"@types/jest": "^29.5.14",
"@types/node": "^22.10.10",
"jest": "^29.7.0",
"ts-jest": "^29.2.5"
}
}
依赖说明:
| 依赖包 | 作用 |
|---|---|
@modelcontextprotocol/sdk |
MCP 协议 SDK,提供 Server 端框架 |
abap-adt-api |
SAP ADT REST API 的 Node.js 封装库 |
dotenv |
环境变量管理,从 .env 文件加载配置 |
typescript |
TypeScript 编译器 |
Step 3:配置环境变量
项目根目录下有 .env.example 模板文件,复制并重命名为 .env:
cp .env.example .env
编辑 .env 文件,填入你的 SAP 系统连接信息:
SAP_URL=https://your-sap-server.com:44300
SAP_USER=YOUR_SAP_USERNAME
SAP_PASSWORD=YOUR_SAP_PASSWORD
SAP_CLIENT=100
SAP_LANGUAGE=ZH
注意事项:
SAP_CLIENT和SAP_LANGUAGE是可选参数,但强烈建议填写- 如果使用自签名证书,需额外添加:
NODE_TLS_REJECT_UNAUTHORIZED="0"- 切勿将
.env文件提交到版本控制(该文件已在.gitignore中)
Step 4:编译项目
npm run build
该命令执行 tsc -p tsconfig.json,将 TypeScript 源码编译到 dist/ 目录。
Step 5:启动 MCP Server
npm run start
启动后,Server 通过 stdio 方式监听 MCP 请求。
如需调试模式(使用 MCP Inspector 查看工具调用详情):
npm run dev
3.3 方式二:通过 Smithery 自动安装
可以通过 Smithery 一键安装到 Claude Desktop:
npx -y @smithery/cli install @mario-andreschak/mcp-abap-abap-adt-api --client claude
注意:此方式主要适用于 Claude Desktop。VSCode 中的 Claude Code 建议使用方式一手动安装后自行配置。
四、集成到 VSCode 中的 Claude Code
本节以 VSCode 内置的 Claude Code 为主要配置目标,同时附带 Cline 和 Claude Desktop 的配置方法。
4.1 集成到 Claude Code(VSCode 扩展,推荐)
Claude Code 在 VSCode 中通过扩展运行,MCP Server 配置有两种作用域:
方式一:项目级配置(仅当前项目生效)
在项目根目录下创建 .claude/settings.json:
{
"mcpServers": {
"mcp-abap-abap-adt-api": {
"command": "node",
"args": [
"D:/path/to/mcp-abap-abap-adt-api/dist/index.js"
]
}
}
}
方式二:用户级配置(所有项目共享)
在用户目录下编辑 ~/.claude/settings.json(Windows 路径为 C:\Users\<你的用户名>\.claude\settings.json):
{
"mcpServers": {
"mcp-abap-abap-adt-api": {
"command": "node",
"args": [
"D:/path/to/mcp-abap-abap-adt-api/dist/index.js"
]
}
}
}
配置说明:
args中的路径替换为你实际编译后的dist/index.js绝对路径- Windows 路径使用正斜杠
/或双反斜杠\\- 配置完成后重启 Claude Code 扩展使其生效
方式三:通过 Claude Code 命令行添加
也可以在 Claude Code 终端中直接执行:
claude mcp add mcp-abap-abap-adt-api -- node D:/path/to/mcp-abap-abap-adt-api/dist/index.js
添加后可通过以下命令验证:
claude mcp list
验证 MCP Server 是否正常工作
在 VSCode 中打开 Claude Code 面板,输入以下测试指令:
请使用 searchObject 工具搜索 ABAP 对象 ZCL_TEST
如果返回对象 URI 信息,说明 MCP Server 配置成功。
4.2 集成到 Cline(VS Code 插件,备选)
如果使用 Cline 而非 Claude Code,在 Cline 的 MCP 配置文件中添加:
{
"mcpServers": {
"mcp-abap-abap-adt-api": {
"command": "node",
"args": [
"D:/path/to/mcp-abap-abap-adt-api/dist/index.js"
],
"disabled": false,
"autoApprove": []
}
}
}
4.3 集成到 Claude Desktop(备选)
在 Claude Desktop 的配置文件 claude_desktop_config.json 中添加:
{
"mcpServers": {
"mcp-abap-abap-adt-api": {
"command": "node",
"args": [
"D:/path/to/mcp-abap-abap-adt-api/dist/index.js"
]
}
}
}
五、核心功能详解
5.1 完整工具列表
| 功能分类 | 工具名称 | 说明 |
|---|---|---|
| 认证 | login |
安全登录 SAP 系统 |
| 对象管理 | searchObject |
按名称搜索 ABAP 对象,返回 URI |
getObjectSource |
读取对象源码(URL 需加 /source/main) |
|
setObjectSource |
修改对象源码 | |
createObject |
创建新 ABAP 对象(支持多语言) | |
activate |
激活 ABAP 对象 | |
| 传输管理 | transportInfo |
获取传输请求信息 |
createTransport |
创建传输请求 | |
| 锁管理 | lock |
锁定对象(编辑前必须) |
unLock |
解锁对象 | |
| 代码分析 | syntaxCheckCode |
执行语法检查 |
| DDIC 操作 | setDomainProperties |
设置域属性 |
setDataElementProperties |
设置数据元素属性 | |
GetTable |
查看表结构定义 | |
GetStructure |
查看结构体定义 | |
| 会话管理 | dropSession |
清除会话缓存 |
logout |
登出系统 |
5.2 禁用的处理器
以下处理器默认被注释掉,通常不需要启用:
| 处理器 | 禁用原因 |
|---|---|
| GitHandlers | Git 操作建议使用本地 Git |
| DebugHandlers | 调试更适合在 Eclipse ADT 中进行 |
| AtcHandlers | ATC 质量检查建议在 SAP GUI 中完成 |
| TraceHandlers | 性能追踪适合专用监控工具 |
| DiscoveryHandlers | ADT 发现/元数据主要用于 IDE |
| CodeCompletion | 代码补全对 LLM 不实用 |
如需启用,编辑 src/index.ts 取消相关代码注释即可。
六、落地方案:Claude Code + MCP + Skill + Memory 全流程实践
6.1 典型场景:AI 自主修改并激活 ABAP 类
以"修改 ZCL_TEST 类的 get_data 方法,增加日期过滤逻辑"为例,完整的 AI 自主开发流程如下:
用户输入需求
│
▼
Claude Code 调用 Memory 读取该类历史信息(对象 URI、所属传输请求)
│
▼
MCP 工具调用(Skill 驱动):
├── searchObject → 获取 ZCL_TEST 的完整 URI
├── lock → 锁定对象,Memory 存储返回的 lockHandle
└── getObjectSource → 获取服务器端源码
│
▼
Claude Code 基于需求生成修改后的 ABAP 代码
│
▼
验证与提交:
├── syntaxCheckCode → 语法检查,修复异常
├── setObjectSource → 提交修改(传入 lockHandle / 传输请求号)
├── activate → 激活对象
└── unLock → 解锁对象
│
▼
结果反馈:Claude Code 将操作结果(激活状态、语法检查日志)反馈给用户
6.2 修改 ABAP 代码的标准工作流
Step 1: searchObject → 搜索目标对象,获取 URI
Step 2: getObjectSource → 读取当前源码(URL 需加 /source/main 后缀)
Step 3: AI 分析并生成修改后的代码
Step 4: transportInfo → 获取传输请求号
Step 5: lock → 锁定对象,获取 lockHandle
Step 6: setObjectSource → 写入修改后的源码
Step 7: syntaxCheckCode → 执行语法检查
Step 8: activate → 激活对象
Step 9: unLock → 解锁对象
6.3 创建 DDIC 对象的工作流
Step 1: validateNewObject → 验证新对象参数
Step 2: createObject → 创建对象(支持多语言参数)
Step 3: transportInfo → 获取传输请求
Step 4: lock → 锁定对象
Step 5: setDomainProperties → 设置域属性
或 setDataElementProperties → 设置数据元素属性
Step 6: activate → 激活对象
Step 7: unLock → 解锁对象
6.4 实际对话示例
用户:帮我查找类 ZCL_INVOICE_XML_GEN_MODEL,读取它的源码,然后在方法 GET_DATA 中添加日期过滤逻辑。
AI 自动执行的操作序列:
- 调用
searchObject搜索类名 → 返回 URI/sap/bc/adt/oo/classes/zcl_invoice_xml_gen_model - 调用
getObjectSource读取源码 → 返回完整 ABAP 代码 - AI 分析代码,在
GET_DATA方法中插入日期过滤逻辑 - 调用
transportInfo获取可用的传输请求号 - 调用
lock锁定类 - 调用
setObjectSource写入修改后的完整源码 - 调用
syntaxCheckCode验证语法正确性 - 调用
activate激活 - 调用
unLock解锁
七、重要注意事项
7.1 文件处理机制
- SAP 系统与本地文件系统完全解耦
- 读取源码仅返回文本结果,不会自动创建本地文件
- 本地文件不是必须的,但建议创建副本用于跟踪变更
- 文件命名建议格式:
[对象名].[对象类型].abap- 示例:
SAPMV45A.prog.abap、CL_IXML.clas.abap
- 示例:
- 本地文件路径不包含目录,仅文件名
7.2 URL 后缀规则
使用 getObjectSource 和 setObjectSource 时,对象 URI 必须加上 /source/main 后缀:
错误:/sap/bc/adt/oo/classes/zcl_my_class
正确:/sap/bc/adt/oo/classes/zcl_my_class/source/main
7.3 锁机制要点
- 修改对象前必须先
lock,获取lockHandle lockHandle是后续setObjectSource和unLock操作的必要参数lockHandle可能过期或被其他用户释放- 如果锁失败,需要重新获取
7.4 激活与解锁顺序
activate 可以在解锁之前调用。具体顺序建议:先 setObjectSource → activate → unLock。
7.5 高效数据库访问建议
当 AI 生成 ABAP 代码时,应遵循以下原则避免性能问题:
" 推荐:使用 WHERE 过滤 + UP TO 1 ROWS
SELECT vgbel FROM vbrp
WHERE vbeln = @lv_vbeln
INTO @DATA(lv_vgbel)
UP TO 1 ROWS.
EXIT.
ENDSELECT.
" 避免:全表扫描
SELECT * FROM vbrp INTO TABLE @DATA(lt_data). " 不推荐
7.6 查看表和结构定义
当遇到字段名未知或表使用错误时,可使用:
GetTable:查看 ABAP Dictionary 表的字段名和数据类型GetStructure:查看结构体的字段名和数据类型- 如果遇到 404 错误,可尝试先用
searchObject查找后再用GetStructure
八、项目结构概览
mcp-abap-abap-adt-api/
├── src/
│ ├── index.ts # MCP Server 入口
│ ├── handlers/ # 各类工具处理器
│ │ ├── auth.ts # 认证相关(login/logout)
│ │ ├── object.ts # 对象管理(CRUD/激活)
│ │ ├── transport.ts # 传输请求管理
│ │ ├── code.ts # 代码分析(语法检查)
│ │ ├── ddic.ts # DDIC 操作(域/数据元素)
│ │ └── session.ts # 会话管理
│ └── utils/ # 工具函数
├── dist/ # 编译输出目录(启动入口)
├── .env.example # 环境变量模板
├── package.json # 项目依赖配置
├── tsconfig.json # TypeScript 配置
└── README.md # 项目文档
九、Custom Instruction 模板
为了让 AI 模型更好地理解和使用这些 MCP 工具,可以在客户端配置中添加以下自定义指令:
## mcp-abap-abap-adt-api Server
本服务器提供通过 ADT API 与 SAP 系统交互的工具,支持检索 ABAP 对象信息、
修改源码、管理传输请求。
**核心工具:**
- searchObject: 按查询字符串查找 ABAP 对象,返回对象 URI
- transportInfo: 获取对象的传输请求信息(TRKORR)
- lock / unLock: 锁定/解锁 ABAP 对象
- getObjectSource / setObjectSource: 读取/修改源码(URL 需加 /source/main)
- syntaxCheckCode: 语法检查
- activate: 激活对象
- createObject: 创建新对象
- setDomainProperties / setDataElementProperties: DDIC 对象配置
**标准工作流:**
searchObject → getObjectSource → 本地修改 → transportInfo → lock
→ setObjectSource → syntaxCheckCode → activate → unLock
十、风向:ABAP 开发正在向 AI 友好的方向演进
SAP 官方正在推进 ABAP Development Tools 对 VSCode 的全面适配。这件事的意义不只是"换个编辑器"——它正在悄然改变 ABAP 与 AI 工具之间的关系:
- 编辑体验趋同:当 ABAP 代码也能在 VSCode 里以本地文件的形式编辑时,AI 工具终于能用自己最擅长的方式(读写文件)介入 ABAP 开发,适配成本断崖式下降;
- 插件生态打通:VSCode 的扩展市场天然支持 MCP 协议接入,Claude Code、Cline 等工具可以直接挂载 ABAP MCP Server,形成"官方 IDE + AI 能力"的组合;
- 协议标准化趋势:MCP 正在成为 AI 连接外部系统的通用语言。当 SAP 生态和 MCP 生态在同一编辑器里交汇,ABAP 开发者用上 AI 辅助编程将不再是尝鲜,而是标配。
十一、总结
回到本文开头的问题:AI 编程工具为什么在 ABAP 里水土不服?因为中间缺了一层翻译。mcp-abap-abap-adt-api 通过 MCP 协议补上了这层翻译,让 Claude Code 终于能"听得懂"ABAP 系统在说什么、"做得了"ABAP 开发该做的事。
具体来说,这套方案打通了五个关键能力:
- 找得到:AI 通过
searchObject在 SAP 系统里精准定位任意对象 - 读得懂:AI 通过
getObjectSource拉取源码并理解代码逻辑 - 改得了:AI 通过
lock→setObjectSource→activate完成代码修改并上线 - 查得出:AI 通过
syntaxCheckCode在提交前拦截语法错误 - 记得住:Claude Code 的 Memory 机制让 AI 能积累项目上下文,越用越顺手
ABAP 开发者第一次可以用自然语言跟 AI 说"帮我改一下这个类的方法",然后看着 AI 自动完成搜索、锁定、读码、改码、检查、激活的全流程。这不是未来,这是今天就能跑起来的方案。
相关资源:
- 原始仓库:mario-andreschak/mcp-abap-abap-adt-api
- 国内 Fork:lingcSun/mcp-abap-abap-adt-api
- 底层 API 库:marcellourbani/abap-adt-api
- MCP 协议官方文档:modelcontextprotocol.io
- Smithery 一键安装:smithery.ai/server/@mario-andreschak/mcp-abap-abap-adt-api
更多推荐



所有评论(0)