免责声明:此服务器仍处于试验阶段!使用时请谨慎!
MCP-Server mcp-abap-abap-adt-api 是一个设计用于促进 ABAP 系统与 MCP 客户端之间无缝通信的模型上下文协议(MCP)服务器。它是 abap-adt-api 的封装,并提供了一系列工具和资源,用于管理 ABAP 对象、处理传输请求、执行代码分析等,从而提高 ABAP 开发工作流程的效率和效果。
login 工具安全地与 ABAP 系统进行身份验证。createTransport 和 transportInfo 等工具管理传输请求。dropSession 和 logout 处理会话缓存和终止。要通过 Smithery 自动安装 ABAP-ADT-API MCP-Server 到 Claude Desktop:
npx -y @smithery/cli install @mario-andreschak/mcp-abap-abap-adt-api --client claude
克隆仓库
git clone https://github.com/mario-andreschak/mcp-abap-abap-adt-api.git
cd mcp-abap-abap-adt-api
安装依赖
npm install
配置环境变量
在根目录下提供了一个 .env.example 文件作为所需环境变量的模板。为了设置您的环境:
a. 复制 .env.example 文件并将其重命名为 .env:
cp .env.example .env
b. 打开 .env 文件,并用实际的 SAP 连接详情替换占位符值:
SAP_URL=https://your-sap-server.com:44300
SAP_USER=YOUR_SAP_USERNAME
SAP_PASSWORD=YOUR_SAP_PASSWORD
SAP_CLIENT=YOUR_SAP_CLIENT
SAP_LANGUAGE=YOUR_SAP_LANGUAGE
注意:SAP_CLIENT 和 SAP_LANGUAGE 变量是可选的,但推荐使用。
如果您使用的是自签名证书,还可以设置:
NODE_TLS_REJECT_UNAUTHORIZED="0"
重要提示:永远不要将您的 .env 文件提交到版本控制中。它已经被包含在 .gitignore 中以防止意外提交。
构建项目
npm run build
运行服务器
npm run start
(或者选择将 MCP 服务器集成到 VSCode)
一旦服务器启动,您可以使用支持模型上下文协议(例如 Cline)的 MCP 客户端或工具与其交互。为了将 MCP 服务器与 Cline 集成,请使用以下 MCP 配置:
"mcp-abap-abap-adt-api": {
"command": "node",
"args": [
"PATH_TO_YOUR/mcp-abap-abap-adt-api/dist/index.js"
],
"disabled": true,
"autoApprove": [
]
},
使用此自定义指令向您的模型解释该工具:
## mcp-abap-abap-adt-api 服务器
此服务器提供了通过 ADT(ABAP 开发工具)API 与 SAP 系统交互的工具。它允许您检索有关 ABAP 对象的信息、修改源代码以及管理传输。
**关键工具及其用法:**
* **`searchObject`**:基于查询字符串(例如类名)查找 ABAP 对象。
* `query`:(字符串,必需)搜索词。
* 返回对象的 URI。 示例:`/sap/bc/adt/oo/classes/zcl_invoice_xml_gen_model`
* **`transportInfo`**:检索给定对象的传输信息。
* `objSourceUrl`:(字符串,必需)对象的 URI(从 `searchObject` 获得)。
* 返回传输详情,包括传输请求号(`TRKORR` 或 JSON 响应中的 `transportInfo.LOCKS.HEADER.TRKORR`)。
* **`lock`**:锁定 ABAP 对象以供编辑。
* `objectUrl`:(字符串,必需)对象的 URI。
* 返回一个 `lockHandle`,这是后续修改所必需的。
* **`unLock`**:解锁先前锁定的 ABAP 对象。
* `objectUrl`:(字符串,必需)对象的 URI。
* `lockHandle`:(字符串,必需)从 `lock` 操作获得的锁句柄。
* **`setObjectSource`**:修改 ABAP 对象的源代码。
* `objectSourceUrl`:(字符串,必需)对象的 URI *后缀 `/source/main`*。 示例:`/sap/bc/adt/oo/classes/zcl_invoice_xml_gen_model/source/main`
* `lockHandle`:(字符串,必需)从 `lock` 操作获得的锁句柄。
* `source`:(字符串,必需)完整的修改后的 ABAP 源代码。
* `transport`:(字符串,可选)传输请求号。
* **`syntaxCheckCode`**:对给定的 ABAP 源代码执行语法检查。
* `code`:(字符串,必需)要检查的 ABAP 源代码。
* `url`:(字符串,可选)对象的 URL。
* `mainUrl`:(字符串,可选)主 URL。
* `mainProgram`:(字符串,可选)主程序。
* `version`:(字符串,可选)版本。
* 返回语法检查结果,包括任何错误。
* **`activate`**:激活 ABAP 对象。(参见下面关于激活/解锁的注意事项)
* `object`:要激活的对象。
* **`getObjectSource`**:检索 ABAP 对象的源代码。
* `objectSourceUrl`:(字符串,必需)对象的 URI *后缀 `/source/main`*。
**修改 ABAP 代码的工作流:**
1. **找到对象 URI**:使用 `searchObject`。
2. **读取原始源代码**:使用 `getObjectSource`(带有 `/source/main` 后缀)。
3. **本地克隆并修改源代码**:(例如,使用 `write_to_file` 创建本地副本,使用 `read_file`、`replace_in_file` 修改此本地副本)。
4. **获取传输信息**:使用 `transportInfo`。
5. **锁定对象**:使用 `lock`。
6. **设置修改后的源代码**:使用 `setObjectSource`(带有 `/source/main` 后缀)。
7. **执行语法检查**:使用 `syntaxCheckCode`。
8. **激活**对象,使用 `activate`。
9. **解锁对象**:使用 `unLock`。
**重要注意事项:**
* **文件处理**:SAP 完全与本地文件系统解耦。读取源代码只会返回代码作为工具结果——它不会影响文件。文件不会与 SAP 同步,只是我们参考的本地副本。请注意:严格来说,您不需要创建源代码的本地副本,因为它们对 SAP 没有影响,但它有助于我们跟踪更改。
* **文件处理**:您将使用的本地文件名将不包含路径,仅包含文件名!建议使用类似 `[ObjectName].[ObjectType].abap` 的模式。(例如,对于 ABAP 程序 SAPMV45A,使用 SAPMV45A.prog.abap;对于类 CL_IXML,使用 CL_IXML.clas.abap)
* **URL 后缀**:在使用 `setObjectSource` 和 `getObjectSource` 时,请记得在对象 URI 后添加 `/source/main`。
* **传输请求**:获取传输请求号(例如,从 `transportInfo` 或用户处获取),并在相关操作中包含它。
* **锁句柄**:从 `lock` 操作获得的 `lockHandle` 对 `setObjectSource` 和 `unLock` 至关重要。确保您使用的是有效的 `lockHandle`。如果锁定失败,您可能需要重新获取锁。锁可能会过期或被其他用户释放。
* **激活/解锁顺序**:`activate` 和 `unLock` 操作的确切顺序可能需要澄清。请参阅工具描述或询问用户。看起来可以在不解锁的情况下使用 `activate`。
* **错误处理**:工具返回 JSON 响应。检查这些响应中的错误消息。
## 高效数据库访问
SAP 系统包含大量数据。编写高效访问数据库的 ABAP 代码以最小化性能影响和网络流量至关重要。避免选择整个表或使用广泛的 `WHERE` 子句,当您只需要特定数据时。
* **使用 `WHERE` 子句**:始终在 `SELECT` 语句中使用 `WHERE` 子句来过滤从数据库检索的数据。仅选择您需要的具体行。
* **`UP TO 1 ROWS`**:如果您只需要一条记录,可以使用 `SELECT SINGLE` 语句,前提是您可以保证提供 `SELECT SINGLE` 语句的所有键字段。否则,使用带有 `UP TO 1 ROWS` 补充的 `SELECT` 语句。这告诉数据库在找到第一个匹配记录后停止搜索,从而提高性能。示例:
```abap
SELECT vgbel FROM vbrp WHERE vbeln = @me->lv_vbeln INTO @DATA(lv_vgbel) UP TO 1 ROWS.
EXIT. " 在此之后退出任何循环。
ENDSELECT.
```
## 检查表和结构定义
在处理 ABAP 对象时,您可能会遇到与未知字段名称或不正确的表使用相关的错误。您可以使用以下工具检查表和结构定义:
* **`GetTable`**:使用此工具检索 ABAP 字典表的结构,包括其字段名称和数据类型。这对于验证 `SELECT` 语句中使用的正确字段非常有用。
* 如果需要检查包含结构,您可能需要使用 `searchObject` 查找包含项,然后使用 `GetTypeInfo` 或 `GetStructure`。您可能会收到 404 错误并尝试使用 `GetStructure` 再试一次。
* **`GetStructure`**:使用此工具检索 ABAP 字典结构的结构,包括其字段名称和数据类型。这对于验证 `SELECT` 语句中使用的正确字段非常有用。
* 如果需要检查包含结构,您可能需要使用 `searchObject` 查找包含项,然后使用 `GetTypeInfo` 或 `GetStructure`。
欢迎贡献!请遵循以下步骤进行贡献:
分叉仓库
创建新分支
git checkout -b feature/your-feature-name
提交更改
git commit -m "添加某些功能"
推送到分支
git push origin feature/your-feature-name
打开拉取请求
本项目根据 MIT 许可证授权。