摘要
将任意 OData V2 或 V4 服务(包括 SAP Gateway)转换为 Claude、ChatGPT 和 Copilot 可用的 MCP 工具。读取 $metadata 中的标签、键和单位,无需编码。
摘要: AnythingMCP 提供一种 OData 连接器类型。将它指向 OData V2 或 V4 服务,或指向 SAP Gateway,Claude、ChatGPT 和 Copilot 就能获得五个工具:查找服务、读取实体集及带业务标签的字段、查询数据行,以及按键获取单个实体。查询在发送前会先对照 $metadata 进行检查,服务器分页会被自动跟随,V2 和 V4 的响应都以普通数据行返回。您还可以将某个服务的 $metadata 导入为命名工具,每个实体集对应一个 list 工具和一个 get 工具。
| 概览 | |
|---|---|
| 协议 | OData V2 和 V4,根据 $metadata 自动识别 |
| SAP | Gateway 服务目录(V2 和 V4)、sap-client、sap-language、写入时使用 CSRF 令牌 |
| 内置工具 | 5 个,只读:列出服务、描述服务、描述实体、查询、获取实体 |
| 导入 | $metadata → 每个实体集生成 <set>_list 和 <set>_get 工具 |
| 认证 | 支持所有 REST 认证方式:Basic、OAuth 2.0、API 密钥、证书、登录令牌 |
| 测试 | services.odata.org 上的 Northwind V2 和 V4 以及 TripPin V4 |
| 托管 | 自托管(开源,AGPL-3.0)或 AnythingMCP Cloud |
为什么 OData 需要的不只是 REST 导入
OData 服务会自我描述。它的 $metadata 文档列出每个实体集、实体集的键、每个字段的类型;对于 SAP,还包括用户在屏幕上看到的标签、每个金额对应的货币或单位,以及哪些字段是维度、哪些是度量。通用的 REST 导入会丢弃其中大部分信息,模型只能去猜 NetAmount 的货币在 TransactionCurrency 中,或者某个分析型服务必须按参数过滤。
OData 连接器读取 $metadata 并将其交给模型。Claude 能看到 NetAmount 的标签是 Net Amount,其货币位于 TransactionCurrency;如果它拼错了字段名,连接器会直接回复“Unknown field … Did you mean …”,而不是把错误转发给服务器。
两种获取方式
- OData 连接器类型。 创建连接器时选择 OData。对于 SAP 系统,勾选 SAP Gateway (S/4HANA, ECC, BW):基础 URL 为主机地址,例如
https://s4.example.com:44300,服务来自 SAP 的目录。对于单个 OData 服务,不要勾选:基础 URL 为服务根地址,例如https://services.example.com/odata/v4/Sales。 - 带 OData 设置的 REST 连接器。 如果 REST 连接器的设置中包含
odata块,它会获得相同的内置工具;其自身的工具仍是普通的 REST 调用。SAP S/4HANA Cloud 适配器就是这样工作的。
两者都运行在 REST 引擎上,因此所有 REST 认证方式都适用,重试、出站 SSRF 防护和代理也同样适用。
内置工具
每个 OData 连接器都有五个工具,命名为 <prefix>_…。前缀为连接器名称加 _odata,也可以自行设置。
| 工具 | 功能 |
|---|---|
<prefix>_list_services | SAP:搜索 Gateway 服务目录(V2 和 V4),缓存一小时。其他情况:列出设置中配置的服务,或单个服务根地址。 |
<prefix>_describe_service | 列出实体集及其标签、键和字段数量,并标记为 analytical(由服务器汇总)、parameters(参数化视图)、requiredInFilter 或 readOnly。$metadata 缓存 24 小时。 |
<prefix>_describe_entity | 每个字段的标签、类型、键、对应的货币或单位字段、文本字段、是否可过滤和排序,以及其维度或度量角色;导航属性;针对分析型和参数化实体集的提示。 |
<prefix>_query | select、filter、orderby、top(最多 1,000)、skip、expand、parameters,以及 V4 的 apply 和 search。先检查字段名,强制执行必填过滤条件,仅在连接器自身的主机上跟随服务器分页,并将响应扁平化:普通数据行、ISO 日期、以字符串表示的小数、总数和 nextSkip。 |
<prefix>_get_entity | 按键获取单个实体,包括复合键,例如 {"SalesOrder": "1", "SalesOrderItem": "10"}。 |
内置工具只读,并对 MCP 客户端标记为只读。
设置步骤
第 1 步:运行 AnythingMCP
对于公开的 OData 服务,可以直接使用 AnythingMCP Cloud。对于 SAP Gateway 或您自己网络中的任何服务,请在能访问该服务的位置自托管 AnythingMCP:
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
将内部主机名添加到 SSRF_ALLOWED_HOSTS;AnythingMCP 默认拒绝私有地址。
第 2 步:创建 OData 连接器
新建一个连接器,选择 OData 并输入基础 URL。如果想在不注册任何账户的情况下试用,可以使用公开的 Northwind 服务:https://services.odata.org/V4/Northwind/Northwind.svc,不勾选 SAP Gateway,无需认证。对于 SAP,勾选 SAP Gateway,并输入三位数的集团编号和语言。
第 3 步:设置认证并限制服务
选择服务所要求的认证方式:使用技术用户的 Basic 认证、OAuth 2.0(client credentials 或 authorization code)、API 密钥、客户端证书或登录令牌。在连接器的 OData 设置中,于 Allowed services 下列出模型可以调用的服务路径(* 可作通配符);其他服务一律拒绝。
第 4 步:测试并导入工具
Test connection 会读取 SAP 目录或服务的 $metadata。如果希望为模型最常用的实体集创建命名工具,请打开 Import Tools → OData $metadata,填写服务路径(SAP)或留空(单个服务),然后选择实体集。详见下文。
第 5 步:连接 Claude、ChatGPT 或 Copilot
- Claude: Customize → Connectors → Add custom connector,粘贴您的 MCP 服务器 URL。详细步骤:如何向 Claude 添加自定义连接器。
- ChatGPT: 在 ChatGPT 的设置中,将同一个公网 HTTPS URL 添加为连接器(应用)。
- Claude Code、Cursor、VS Code / Copilot: 添加该 URL,并带上
X-API-Key请求头。
从 $metadata 导入工具
Import Tools → OData $metadata 会将实体集转换为命名工具:带 filter、select、orderby、top、skip 和 expand 参数的 <set>_list,以及带键参数的 <set>_get。文档使用连接器的凭据获取;您也可以直接粘贴 $metadata 文档,并将导入限制在部分实体集。重新导入某个服务时,会更新该服务的工具,并且只停用该服务中已消失的工具,绝不会影响内置工具或其他服务的工具。
在 OData 连接器上,导入的和手写的 HTTP 工具都会自动带上 SAP 集团和语言、V2 的 JSON 格式以及扁平化的响应。SAP 写入操作(POST、PUT、PATCH、DELETE)会先使用会话 Cookie 获取 CSRF 令牌。写入只会通过您自己导入或编写的工具进行。
SAP Gateway:S/4HANA、ECC 和 BW
- 一个技术用户,类型为 System,使用生产密码,位于您要读取的集团中。
- 一个角色,包含模型可调用服务的
S_SERVICE权限,以及仅限显示的业务权限。如需浏览目录,还需要 V2 目录服务/IWFND/CATALOGSERVICE和 V4 目录的权限。SAP 在每次调用时都会检查这些权限;它们才是真正的边界。 - 已激活的服务:在
/IWFND/MAINT_SERVICE(V2)和/IWFND/V4_ADMIN(V4)中激活。 - 网络: Gateway 端口通常只在内部开放。请在网络内自托管 AnythingMCP,或通过 VPN 访问。
SAP 的 API 政策要求第三方集成使用已发布的 API(SAP Business Accelerator Hub 上的 API_* 服务)或您自己构建的服务;请据此限制 Allowed services。
针对本地部署和 Private Cloud 上的 S/4HANA,有一个现成的适配器:SAP S/4HANA (OData)。它以 s4 前缀完成上述全部设置(s4_list_services、s4_describe_service、s4_describe_entity、s4_query、s4_get_entity),并为日记账分录行项目、开票凭证、销售订单、业务伙伴、物料库存和产品提供现成工具,另外还有 s4_guide,一份关于过滤、分析型服务和 KPI 的指南。它以 Basic 认证安装,您也可以将连接器切换为 OAuth 2.0。SAP S/4HANA Cloud 适配器通过其通信协议 API 提供相同的内置工具,名称为 s4_cloud_*。
如果您更希望直接读取 S/4HANA 的表,请参阅通过 HANA SQL 连接 SAP S/4HANA。
设置项
| 设置 | 含义 |
|---|---|
| SAP Gateway | 目录发现和 SAP 参数。设置了 SAP 集团时自动启用。 |
| SAP client | 三位数的集团编号,每次请求都以 sap-client 发送。 |
| Language | 以 sap-language 发送,例如 EN。 |
| Allowed services | 模型可调用的服务路径,* 可作通配符。 |
| Version | v2 或 v4,用于覆盖根据 $metadata 的自动识别。 |
| Max rows | 每次查询的行数上限,最多 1,000。 |
| Tool prefix | 内置工具名称的前缀。 |
每个设置项都可以使用连接器环境变量中的 {{VARIABLES}}。
示例提示词
- “目录中哪些服务与开票凭证有关?”
- “描述销售订单实体:哪些字段是金额,使用什么货币?”
- “根据开票凭证,统计 9 月份每个销售组织的净销售额。”
- “显示销售订单 1 及其所有行项目。”
- 在 Northwind 上:“单价最高的十种产品是哪些,分别由哪个供应商供货?”
FAQ
支持哪些 OData 版本?
V2 和 V4。版本根据 $metadata 自动识别;您可以在设置中覆盖。
需要先把 $metadata 转换为 OpenAPI 吗?
不需要。OData 连接器直接读取 $metadata,Import Tools → OData $metadata 会据此创建工具。
Claude 能通过 OData 修改数据吗? 五个内置工具不能,它们只读。写入需要您自己导入或编写的工具,而 MCP 服务器角色可以将这些工具排除在外;SAP 写入会自动获取 CSRF 令牌。
支持本地部署的 SAP S/4HANA 和 ECC 吗? 支持,通过 SAP Gateway 连接,前提是自托管的 AnythingMCP 能够访问它。对于 S/4HANA,SAP S/4HANA (OData) 适配器是最快的起步方式。
如何处理大量结果?
一次查询最多返回 1,000 行。连接器会在同一主机上跟随服务器分页,并返回 nextSkip,以便模型请求下一页。
也能用于 ChatGPT 和 Copilot 吗? 可以。同一个 MCP 服务器可用于 Claude、ChatGPT、GitHub Copilot、Cursor 和 Claude Code。
相关内容
- 将 SAP 连接到 Claude:所有 SAP 连接器一览
- 通过 HANA SQL 连接 SAP S/4HANA:数据库方式,以 SAP 数据字典作为工具
- OpenAPI 转 MCP:带 OpenAPI 或 Swagger 规范的 REST API
- SOAP 转 MCP:WSDL 服务
- AnythingMCP 文档中的 OData
这份指南对你有帮助吗?