摘要
让 Claude 直接从 HANA 回答本地部署或 Private Cloud 上 SAP S/4HANA 的业务问题,以 SAP 自身的数据字典作为工具。只读、自托管,无需 BTP。
试试这样问
SAP S/4HANA (HANA SQL) 的示例提示
点击任意提示即可复制,然后粘贴到 Claude、ChatGPT、Cursor、Gemini、Copilot 或 OpenClaw 中,在该连接器上运行。
Claude 是 AI,可能会出错。请核对回答。
摘要: 借助 SAP S/4HANA (HANA SQL) 连接器,Claude 可以直接从 HANA 数据库读取 S/4HANA 系统。在编写查询之前,Claude 会先在 SAP 自身的数据字典中查找 BUKRS、HSL 或 VBRK 的含义,从而选对表、选对货币字段、选对集团。会话在 HANA 内部即为只读,结果最多 1,000 行,每条语句都有超时限制。您需要 SAP Basis 提供的一个 HANA 数据库用户,以及一个能访问 HANA SQL 端口的自托管 AnythingMCP。
| 概览 | |
|---|---|
| 连接器 | SAP S/4HANA (HANA SQL),10 个工具 |
| 系统 | S/4HANA 本地部署、Private Cloud(RISE)、HANA Enterprise Cloud |
| 访问方式 | 只读:每次调用单条 SELECT,SET TRANSACTION READ ONLY,最多 1,000 行,60 秒超时 |
| 驱动 | 内置 hdb;SAP 的 @sap/hana-client 可选,需自行安装 |
| 托管 | 自托管在能访问 HANA 的网络内(AnythingMCP 开源,AGPL-3.0) |
| 测试 | 每个工具都在运行中的 SAP S/4HANA 2025 系统上实测过 |
- 10 个 sap_* 工具
- 角色与工具权限
- 默认只读
- 审计日志
为什么普通的 SQL 连接器不足以应对 SAP
SAP 的表名和字段名是简短的德语缩写:ACDOCA 是通用日记账,RBUKRS 是公司代码,HSL 是公司代码货币金额,VBRK 是开票凭证抬头。只看到列名的模型只能靠猜,而 SAP 对猜测毫不留情:金额对应另一列上的货币字段,每张表都按集团(MANDT)划分,日期是 YYYYMMDD 格式的字符串,凭证编号带有前导零。
连接器把 SAP 自身的数据字典作为工具交给 Claude。它读取 SAP 用来描述自身的表(DD02L、DD03L、DD04T、DD07T、DD08L 以及 CDS 注解),因此 Claude 能看到每个字段的业务标签、每个金额对应的货币或单位字段、字段中各代码的含义、表之间如何关联,以及 SAP 的哪些 CDS 视图已发布且属于分析型。在此之后,它才编写查询。
Claude 如何找到数据
sap_guide讲解面向 SQL 的 SAP 数据模型:集团、YYYYMMDD格式的日期、货币、通用日记账。它不产生任何费用,也不接触任何数据。sap_org_structure列出公司代码及其货币和会计年度变式、工厂和销售组织。几乎每个问题都会限定在其中某一项上。sap_search_cds_views和sap_search_tables查找数据所在位置,优先选择 SAP 已发布的分析型 CDS 视图,这些视图已处理好关联、货币和正负号。sap_describe_table为每个字段提供业务标签、每个金额对应的货币或单位字段,以及每个代码的检查表。sap_query执行一条只读SELECT,按集团、组织和期间过滤,并在 SQL 中完成汇总。
可以问什么
以下是三个问题的完整过程。SQL 来自 sap_guide 中的查询范例;请将集团 100、公司代码 1010 和日期替换为您自己的值。Claude 会说明它所做的假设,例如哪些科目计为收入,并请您确认。
“2025 年我们每个过账期间的收入是多少?”
HANA SQLsap_guidesap_org_structuresap_queryACDOCA通用日记账,主分类账 0L
SELECT POPER, RHCUR AS CURRENCY, -SUM(HSL) AS REVENUE
FROM ACDOCA
WHERE RCLNT = '100' AND RLDNR = '0L' AND RBUKRS = '1010' AND GJAHR = '2025'
AND RACCT BETWEEN '0040000000' AND '0049999999' -- 收入科目:请确认范围
GROUP BY POPER, RHCUR ORDER BY POPER;
每个过账期间一行,以公司代码货币计。收入记在贷方,因此对合计取负值。
“哪些客户有逾期超过 60 天的发票,金额是多少?”
HANA SQLsap_guidesap_org_structuresap_queryACDOCA通用日记账,客户行项目(KOART = D)
SELECT KUNNR, RHCUR AS CURRENCY,
SUM(HSL) AS OPEN_AMOUNT,
SUM(CASE WHEN NETDT >= '20251231' THEN HSL ELSE 0 END) AS NOT_DUE,
SUM(CASE WHEN NETDT < '20251231' AND NETDT >= '20251101' THEN HSL ELSE 0 END) AS OVERDUE_1_60,
SUM(CASE WHEN NETDT < '20251101' THEN HSL ELSE 0 END) AS OVERDUE_OVER_60
FROM ACDOCA
WHERE RCLNT = '100' AND RLDNR = '0L' AND RBUKRS = '1010' AND KOART = 'D' AND POPER <> '000'
AND BUDAT <= '20251231' AND (AUGDT = '00000000' OR AUGDT > '20251231')
GROUP BY KUNNR, RHCUR ORDER BY OVERDUE_OVER_60 DESC LIMIT 20;
关键日期的未清项,按净到期日进行账龄分析。在关键日期之后才清账的项目,在该日期仍计为未清。
“2025 年按净销售额排名前 10 的客户是谁?”
HANA SQLsap_guidesap_field_valuessap_queryVBRK开票凭证抬头VBRP开票凭证行项目KNA1客户主数据
SELECT k.KUNAG, c.NAME1, k.WAERK, SUM(p.NETWR) AS NET_SALES
FROM VBRK k JOIN VBRP p ON p.MANDT = k.MANDT AND p.VBELN = k.VBELN
LEFT JOIN KNA1 c ON c.MANDT = k.MANDT AND c.KUNNR = k.KUNAG
WHERE k.MANDT = '100' AND k.FKDAT BETWEEN '20250101' AND '20251231'
AND k.FKSTO = '' AND k.VBTYP = 'M'
GROUP BY k.KUNAG, c.NAME1, k.WAERK ORDER BY NET_SALES DESC LIMIT 10;
共十行,包含客户编号、名称、货币和净销售额。客户排名依据的是开票凭证,而不是日记账:在 ACDOCA 中,客户位于应收账款行,而不在收入行上。Claude 会先读取 VBTYP 的取值,以区分发票、贷项凭证和取消凭证。
HANA SQL 还是 OData?
AnythingMCP 可以通过两种方式连接本地部署和 Private Cloud 上的 S/4HANA。选择其一,或同时运行两者。
| HANA SQL(本指南) | OData | |
|---|---|---|
| 读取范围 | 数据库用户有权读取的任何表或 CDS 视图 | SAP 用户有权调用的 OData 服务 |
| SAP 权限 | 不适用:边界由数据库授权决定 | 每次调用都由 SAP 检查 |
| 擅长 | 对数百万行数据汇总,财务和跨模块分析 | 已发布的 API、业务对象视图、SAP 自身的检查 |
| 前提条件 | 一个 HANA 数据库用户、到 SQL 端口的网络访问、允许此类访问的许可 | 一个 SAP 技术用户、已激活的 Gateway 服务 |
准备工作
- 一位 SAP Basis 管理员,能够在存放 ABAP schema(通常为
SAPHANADB或SAPABAP1)的租户数据库中创建用户。 - 连接信息: 主机、租户的 SQL 端口(第一个租户为
3<instance>15,其他租户为3<instance>41及以上)、租户名称、schema、三位数的 SAP 集团编号,以及文本所用的 SAP 语言(E英语,D德语)。 - 一个自托管的 AnythingMCP,能够访问该端口。HANA 的 SQL 端口通常只能在公司网络内或 SAP 私有云着陆区内访问。
- 确认许可。 第三方应用直接通过 SQL 访问 ABAP schema,受您的 SAP HANA 许可约束。随 S/4HANA 捆绑的运行时许可(runtime licence)通常不涵盖这种访问,完全使用许可(full-use licence)则涵盖。连接生产系统之前,请咨询您的 SAP 客户团队。在 SAP 的私有云产品中,数据库用户和网络路径需要向 SAP 申请。
设置步骤
第 1 步:创建只读数据库用户
在存放 ABAP schema 的租户中执行:
CREATE USER AMCP_READER PASSWORD "<strong password>" NO FORCE_FIRST_PASSWORD_CHANGE;
ALTER USER AMCP_READER DISABLE PASSWORD LIFETIME;
-- 数据字典工具
GRANT SELECT ON SAPHANADB.DD02L TO AMCP_READER;
GRANT SELECT ON SAPHANADB.DD02T TO AMCP_READER;
GRANT SELECT ON SAPHANADB.DD03L TO AMCP_READER;
GRANT SELECT ON SAPHANADB.DD03T TO AMCP_READER;
GRANT SELECT ON SAPHANADB.DD03ND TO AMCP_READER;
GRANT SELECT ON SAPHANADB.DD04T TO AMCP_READER;
GRANT SELECT ON SAPHANADB.DD07T TO AMCP_READER;
GRANT SELECT ON SAPHANADB.DD08L TO AMCP_READER;
GRANT SELECT ON SAPHANADB.DD05S TO AMCP_READER;
GRANT SELECT ON SAPHANADB.DDHEADANNO TO AMCP_READER;
GRANT SELECT ON SAPHANADB.DDFIELDANNO TO AMCP_READER;
GRANT SELECT ON SAPHANADB.ARS_W_API_STATE TO AMCP_READER;
-- 组织结构
GRANT SELECT ON SAPHANADB.T001 TO AMCP_READER;
GRANT SELECT ON SAPHANADB.T001K TO AMCP_READER;
GRANT SELECT ON SAPHANADB.T001W TO AMCP_READER;
GRANT SELECT ON SAPHANADB.TKA01 TO AMCP_READER;
GRANT SELECT ON SAPHANADB.TVKO TO AMCP_READER;
GRANT SELECT ON SAPHANADB.TVKOT TO AMCP_READER;
GRANT SELECT ON SAPHANADB.T024E TO AMCP_READER;
-- 然后是您的用例所需的业务表和 CDS 视图,例如
GRANT SELECT ON SAPHANADB.ACDOCA TO AMCP_READER;
对于大范围分析,GRANT SELECT ON SCHEMA SAPHANADB 更简单,但这样 schema 中的所有内容都可读,包括人事数据。SQL 不会应用 SAP 的应用层权限(公司代码、销售组织、人事检查):数据库用户能读取的内容,Claude 都能读取。
还可以选择在服务器端限制该用户的语句:
CREATE WORKLOAD CLASS "AMCP_READER_WC" SET 'STATEMENT TIMEOUT' = '60', 'STATEMENT MEMORY LIMIT' = '20';
CREATE WORKLOAD MAPPING "AMCP_READER_WM" WORKLOAD CLASS "AMCP_READER_WC" SET 'USER NAME' = 'AMCP_READER';
第 2 步:在网络内运行 AnythingMCP
在一台能访问 HANA SQL 端口的主机上:
mkdir anythingmcp && cd anythingmcp
curl -fsSLo docker-compose.yml \
https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/main/docker-compose.quickstart.yml
printf 'JWT_SECRET=%s\nENCRYPTION_KEY=%s\n' "$(openssl rand -hex 32)" "$(openssl rand -hex 32)" > .env
docker compose up -d # → http://localhost:3000
将 HANA 主机添加到 .env 中的 SSRF_ALLOWED_HOSTS:AnythingMCP 默认拒绝私有地址。
第 3 步:安装连接器
打开 Connectors → Marketplace,搜索 S/4HANA,然后安装 SAP S/4HANA (HANA SQL):

然后填写变量。构成连接地址的变量为必填项,填好后才能创建连接器:
| 变量 | 示例 |
|---|---|
SAP_HANA_HOST | hana.internal |
SAP_HANA_PORT | 30015 |
SAP_HANA_TENANT | S4P |
SAP_HANA_SCHEMA | SAPHANADB |
SAP_CLIENT | 100 |
SAP_LANGUAGE | E |
SAP_HANA_TLS | verify;自签名证书使用 no-verify;或 off |
SAP_HANA_USER / SAP_HANA_PASSWORD | AMCP_READER 及其密码 |

安装时会执行一次测试调用(sap_org_structure),告诉您凭据和授权是否有效。密码加密存储,从不向 Claude 展示。

第 4 步:将 MCP 服务器添加到 Claude

在 claude.ai 或 Claude Desktop 中:Customize → Connectors → + → Add custom connector,粘贴您的 MCP 服务器 URL(显示在 AnythingMCP 的 MCP Servers 下)并登录。对于 claude.ai,URL 必须是公网 HTTPS 地址,因为 Claude 从 Anthropic 的服务器发起连接;只需公开 MCP 端点,永远不必公开 HANA 端口。在 Claude Code 中,本地实例同样可用:
claude mcp add --transport http sap-hana <your MCP server URL> --header "X-API-Key: <key>"
第 5 步:提问
先从限定数据范围的问题开始,例如“这个系统中有哪些公司代码,分别使用什么货币?”。连接器会让 Claude 先阅读 sap_guide;之后它会自行通过数据字典工具逐步完成查询。
可用工具
| 工具 | 为 Claude 提供的内容 |
|---|---|
sap_guide | 按主题讲解面向 SQL 的 SAP 数据模型:基础(集团、日期、前导零、货币)、财务(通用日记账 ACDOCA)、销售、库存、采购、运营、常见陷阱和查询范例。不产生费用,也不接触数据。 |
sap_org_structure | 公司代码及其货币、科目表和会计年度变式;成本控制范围、工厂、销售组织和采购组织。 |
sap_search_tables | 按名称或描述查找表并给出行数,同时标记普通 SQL 会读错的 S/4HANA 兼容视图。 |
sap_describe_table | 每个字段的标签、键标识、类型、每个金额对应的货币或单位字段,以及检查表。 |
sap_find_fields | 哪些表包含某个业务字段,例如“净到期日”。 |
sap_field_values | 字段中各代码的含义,例如开票凭证类别。 |
sap_table_relations | 外键及其关联条件,以及文本表。 |
sap_search_cds_views | 按名称或标签查找 SAP 的 CDS 视图,并标记已发布和分析型视图。 |
sap_describe_cds_view | CDS 视图的列,包括标签、度量、货币和单位字段,以及关联。 |
sap_query | 一条只读 SELECT,最多 1,000 行,并有超时限制。 |

连接器强制执行的规则
使用 SAP 原生驱动
AnythingMCP 内置 hdb,即 SAP 的纯 JavaScript HANA 驱动(Apache-2.0)。它支持用户名和密码、TLS、多租户系统,以及连接器所需的全部功能。SAP 的原生驱动 @sap/hana-client 额外支持 Kerberos、安全用户存储(hdbuserstore)和连接池。它以 SAP Developer License 发布,该许可不允许我们再分发,因此它永远不会包含在镜像中:您需要自行将其安装到自己的部署中,可以扩展镜像,也可以作为卷挂载,然后在连接字符串中用 driver=hana-client 选择它,或用 HANA_DRIVER=hana-client 为所有 HANA 连接器启用。请确认您的 SAP 协议涵盖其在生产环境中的使用。在 arm64 主机上,请继续使用内置的 hdb 驱动,或自行构建基于 Debian 的镜像。详细步骤:AnythingMCP 文档中的 SAP HANA。
示例提示词
- “显示公司代码 1010 在 2025 年每个过账期间的收入。”
- “哪些客户有超过 30 天的未清应收账款,每个客户金额多少?”
- “根据开票凭证,列出今年净销售额排名前 10 的客户。”
- “哪些已发布的分析型 CDS 视图涵盖日记账分录?描述第一个视图的度量。”
- “开票凭证类别字段的各个取值分别是什么意思?”
- “上个月工厂 1010 按移动类型统计的货物移动。”
故障排除
- CDS 视图不返回任何行。
SAP_CLIENT缺失或错误;连接器需要它来设置CDS_CLIENT。 - 连接被拒绝,或被重定向到未知主机。 请使用租户自己的 SQL 端口,而不是系统数据库端口,后者可能重定向到连接器无法解析的内部主机名。
- “Insufficient privilege”。 该表未授权给数据库用户。请授予权限,或让 Claude 改用它有权读取的表或 CDS 视图。
- 证书错误。 自签名证书请使用
SAP_HANA_TLS=no-verify,或安装相应的 CA。 - 查询超时。 让 Claude 按公司代码、期间或工厂过滤,并在 SQL 中汇总;只有查询确实很大时,才调高
statementTimeout。
FAQ
Claude 能通过这个连接器修改 SAP 中的数据吗?
不能。HANA 会话是只读的,只执行单条 SELECT,写入和加锁读取都会被拒绝。创建数据库用户时只授予 SELECT 权限,这样 HANA 也会强制执行同样的规则。
它会遵循 SAP 权限吗? 不会。SQL 会绕过 SAP 的应用层权限,因此 Claude 能读取什么由数据库授权决定。如果需要 SAP 的权限检查,请改用 OData 方式,或只授予允许读取的表和视图。
我的 SAP 许可允许直接通过 SQL 访问 S/4HANA 吗? 这取决于您的 HANA 许可。随 S/4HANA 捆绑的运行时许可通常不涵盖第三方对 ABAP schema 的 SQL 访问,完全使用许可则涵盖。连接生产系统之前,请核对您的合同。
支持 S/4HANA Private Cloud(RISE)吗? 支持,前提是 SAP 提供数据库用户和通往 HANA SQL 端口的网络路径,并且 AnythingMCP 运行在能访问该端口的位置。这两项都需要向 SAP 申请。
可以用 AnythingMCP Cloud 代替自托管吗? 只有在 HANA SQL 端口可从互联网访问时才行,而这种情况很少见,也很少是明智之举。请在 SAP 旁边自托管 AnythingMCP。
它也能用于 ChatGPT 和 Copilot 吗? 可以。同一个 MCP 服务器可用于 ChatGPT(开发者模式,付费套餐)、GitHub Copilot、Cursor 和 Claude Code,工具和只读限制完全相同。
这需要 SAP BTP 或 SAP Joule 吗? 不需要。连接器直接与 HANA 数据库通信,因此既不需要 BTP,也不需要 Joule 或 SAP Gateway。如果您同时使用 Joule,两者也可以并行运行。
这是我可以自行运行的 SAP HANA MCP 服务器吗? 是的。AnythingMCP 开源(AGPL-3.0),通过 Docker Compose 在 SAP 旁边运行。sap-hana-mcp-server 仓库单独打包了这个连接器,SAP HANA MCP 服务器则从开发者角度对其进行了介绍。
下一步
- SAP HANA MCP 服务器:从开发者角度看同一个连接器
- OData 转 MCP:访问本地部署 S/4HANA 的另一种方式,带有 SAP 的权限检查
- 将 SAP 连接到 Claude:所有 SAP 连接器一览
- 数据库转 MCP:将 SAP HANA 作为普通数据库连接器,与 SQL Server、PostgreSQL 和 Oracle 并列
- GitHub 上的 SAP HANA 文档:连接字符串选项和原生驱动
这份指南对你有帮助吗?