摘要: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 对象

项目地址

三、完整安装与环境搭建

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_CLIENTSAP_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 自动执行的操作序列

  1. 调用 searchObject 搜索类名 → 返回 URI /sap/bc/adt/oo/classes/zcl_invoice_xml_gen_model
  2. 调用 getObjectSource 读取源码 → 返回完整 ABAP 代码
  3. AI 分析代码,在 GET_DATA 方法中插入日期过滤逻辑
  4. 调用 transportInfo 获取可用的传输请求号
  5. 调用 lock 锁定类
  6. 调用 setObjectSource 写入修改后的完整源码
  7. 调用 syntaxCheckCode 验证语法正确性
  8. 调用 activate 激活
  9. 调用 unLock 解锁

七、重要注意事项

7.1 文件处理机制

  • SAP 系统与本地文件系统完全解耦
  • 读取源码仅返回文本结果,不会自动创建本地文件
  • 本地文件不是必须的,但建议创建副本用于跟踪变更
  • 文件命名建议格式:[对象名].[对象类型].abap
    • 示例:SAPMV45A.prog.abapCL_IXML.clas.abap
  • 本地文件路径不包含目录,仅文件名

7.2 URL 后缀规则

使用 getObjectSourcesetObjectSource 时,对象 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 是后续 setObjectSourceunLock 操作的必要参数
  • lockHandle 可能过期或被其他用户释放
  • 如果锁失败,需要重新获取

7.4 激活与解锁顺序

activate 可以在解锁之前调用。具体顺序建议:先 setObjectSourceactivateunLock

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 通过 locksetObjectSourceactivate 完成代码修改并上线
  • 查得出:AI 通过 syntaxCheckCode 在提交前拦截语法错误
  • 记得住:Claude Code 的 Memory 机制让 AI 能积累项目上下文,越用越顺手

ABAP 开发者第一次可以用自然语言跟 AI 说"帮我改一下这个类的方法",然后看着 AI 自动完成搜索、锁定、读码、改码、检查、激活的全流程。这不是未来,这是今天就能跑起来的方案。


相关资源

更多推荐