mcpField
S
sap-abap-sql

sap-abap-sql

本地服务
github.com/daslabhq开发工具112 周前更新

关于 sap-abap-sql

sap-abap-sql 是面向 SAP ADT 数据预览控制台的 MCP 服务,用于检查和修正 ABAP Open SQL,也可执行配置系统上的只读查询。它专注于该控制台的方言规则,不连接系统的语句检查工具无需配置。

主要功能

  1. 01检查并改写 SQL 语句
  2. 02解释控制台拒绝的语句
  3. 03列出方言规则
  4. 04执行配置系统的只读查询
  5. 05标记达到上限的截断结果

适用场景

  1. 01发送查询前修正括号间距
  2. 02诊断 ADT 控制台的 SQL 错误
  3. 03从配置的 SAP 系统读取表数据

MCP 相关

通过 MCP 提供语句准备、错误解释、方言规则和查询工具。前三种工具处理传入的语句而不连接网络;查询工具连接用户配置的 SAP 系统并以只读方式运行。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"run-daslab-sap-abap-sql": {
"command": "npx",
"args": [
"-y",
"sap-abap-sql-mcp"
]
}
}
}
启动命令npx -y sap-abap-sql-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmsap-abap-sql-mcp0.3.0

工具

4

收录的工具列表 · 更新于 2 周前

参数类型必填说明
sqlstring是单条 ABAP Open SQL SELECT 语句。

详细介绍

SAP ABAP SQL(MCP 服务)

tests npm

在 ABAP Open SQL 到达 SAP 的 ADT 数据预览控制台之前,对其进行检查和修正。

如果你曾让大模型连接本地部署的 SAP 系统,就会见过这些错误:

你发送的内容SAP 的回应
SELECT SUM(netwr) FROM vbap400 Unknown column name "SUM(NETWR)"
SELECT COUNT(DISTINCT kunnr) FROM vbak400 ")" is invalid here (due to grammar)
SELECT a FROM t WHERE (x = '1' OR y = '2')400 ") " was expected here.

三个错误,三条表面上的规则,一个真正的原因:解析器要求每个括号内侧都要有空格。 第三个错误甚至直接告诉了你。加上空格后,三个语句都能通过。

这些消息里没有任何一条说“加空格”,所以模型只能猜。在一次记录的会话中,同一条格式错误的语句连续发送了十次,每次只改变了一个字面值。两次会话中,211 次工具调用有 57 次失败,其中大多数都与方言有关。

这个服务了解这些规则,因此你的 Agent 不必重新摸索。

这是哪种方言

ADT 数据预览控制台(/sap/bc/adt/datapreview/freestyle),Agent 和 ADT 客户端通过 HTTP 读取表数据的地方。在 ABAP 程序内部编写的 Open SQL 是另一种方言:它有 INTO TABLE、UP TO n ROWS、@host 变量,而且没有字符数上限。不要将其用于程序源代码,并指望结果正确。

适用于本地部署的系统(ECC、S/4HANA 本地部署、私有云)。如果你使用的是带有规范 OData API 的 S/4HANA Cloud,则不需要这些内容。

它会接触我的系统吗?

只有你明确要求时才会,而且只会从你自己的机器发起。

四个工具中的三个是针对你传入的语句执行的纯函数:不建立连接、不使用凭据、不发起网络调用。它们是默认工具,无需任何配置即可运行。

第四个工具 abap_sql_query 会在你配置的系统上运行语句并返回行数据。凭据保存在你机器上此服务的环境中。不会经由任何第三方代理,也不会存储任何内容。

{
  "mcpServers": {
    "sap-abap-sql": {
      "command": "npx",
      "args": ["-y", "sap-abap-sql-mcp"],
      "env": {
        "SAP_URL": "https://your-system:44300",
        "SAP_USER": "...",
        "SAP_PASSWORD": "...",
        "SAP_HEADERS": "X-Your-Proxy-Token: ..."
      }
    }
  }
}

SAP_HEADERS 是可选项,每行填写一个 Name: value。本地部署的系统很少能直接访问:它们位于隧道或代理之后;如果隧道或代理需要自己的请求头才能放行,那么 SAP 还没收到请求,所有请求就都会被拒绝。其表现是出现一条内容恰好为“ADT is switched off”的 403 错误,但事实并非如此。

从设计上就是只读的:数据预览控制台无法写入,因此不存在可被误用的写入路径。

安装

{
  "mcpServers": {
    "sap-abap-sql": {
      "command": "npx",
      "args": ["-y", "sap-abap-sql-mcp"]
    }
  }
}

工具

工具功能
abap_sql_prepare返回要发送的语句;如果拒绝该语句,则指出需要如何修正
abap_sql_explain解读被控制台拒绝的语句,但不对其进行改写
abap_sql_query在你配置的系统上运行准备好的语句并返回行数据
abap_sql_rules列出此方言与标准 SQL 的不同之处

所有工具均为只读,不会产生副作用。

abap_sql_prepare  SELECT COUNT(DISTINCT kunnr) FROM vbak
→ { "ok": true, "statement": "SELECT COUNT( DISTINCT kunnr ) FROM vbak", "length": 40, "limit": 255 }

abap_sql_prepare  SELECT a FROM t LIMIT 10
→ { "ok": false, "rule": "no-limit",
    "fix": "ABAP Open SQL has no LIMIT. Cap the result with the reader's row limit instead." }

连接时,服务器还会在 instructions 中提供这五条规则,因此客户端在编写任何内容之前就能获取这些规则。需要明确查看规则时,可以使用 abap_sql_rules。

它了解什么

圆括号间距,包括所有需要它的情况:聚合函数、DISTINCT、子查询、布尔分组。COUNT(*) 保持紧凑,因为解析器两种写法都能接受,而且每个字符都会占用下文所述的长度限制。

**255 个字符的上限。**控制台接受 255 个字符,拒绝 256 个字符,计算时会合并空白字符。换行并不会增加可用长度,而且检查发生在重写之后,因为添加空格会让语句变长。这会影响你规划查询的方式:任何实际查询都必须拆分,并由你在一侧进行联接。

LIMIT、DESC/ASC 和点限定字段都会被拒绝,并指出对应的 ABAP 形式。p.vbeln 不是解析器会宽容对待的拼写错误,而是 3 个词元。

字面量的位置。'PUMP (SPARE)' 中的圆括号是数据,两个连续空格也一样。系统能识别 ABAP 的两种字符串形式和注释形式,因此重写绝不会改变语句的含义。这正是正则表达式会悄无声息地处理错误的地方,而不是明确报错。

它不会替你做什么

有两项限制来自控制台,而非我们,它们决定了你能提出什么请求:

每条语句最多 255 个字符,因此任何实际查询都必须拆分成多条语句,并由你在一侧进行联接。不支持窗口函数、CTE 和累计总计。

**行数硬性限制为 5,000 行。**如果结果达到上限,系统会标记为 truncated,而不是当作完整结果返回,因为基于悄悄截断的结果在客户端计算总数,只会得到自信却错误的结果。这种失败情况比报错更糟。

如果你发现自己要拼接 4 条语句才能回答一个问题,那是控制台的限制,没有客户端能解决。

范围

它负责准备语句,并可选择执行语句。它不会浏览对象、执行 ABAP、写入任何内容,也不了解你的表代表什么。

如果你更愿意调用库而不是运行服务,方言逻辑位于 abap-sql 中。分词使用 abaplint 的词法分析器,它是 TypeScript 中唯一正确的 ABAP 分词器。

由 Daslab 构建。我们将 Agent 连接到本地部署的 ERP 系统。从网络外部连接到这类系统是另一个问题,我们提供了一篇免费的实用指南:通过 HTTP 连接本地部署的 S/4HANA。

发布

git tag v0.3.0 && git push --tags。CI 会检查标签是否与 package.json 一致、运行测试、使用 provenance 发布到 npm、构建 .mcpb 包,并将其附加到 GitHub release。

发布使用 npm trusted publishing,因此此仓库中没有令牌,也无需轮换。npm 通过 OIDC 信任此仓库和此工作流。

有两个步骤仍需手动完成,因为 CI 没有它们所需的凭据:MCP Registry(mcp-publisher publish)和 Smithery(smithery mcp publish)。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。