SAP 集成开发经常卡在两个地方。一个是接口资料已经拿到,测试系统却还没准备好:账号申请中、网络尚未打通、测试数据不足,映射和异常处理只能等。另一个是系统已经报错,却需要在 API Hub、Road Map Explorer 和 SAP Notes 之间反复搜索,才能拼出判断所需的资料。

这篇文章介绍两个分别应对这些问题的开源项目:sap-bah-sandbox 把接口规格变成可调用的本地模拟服务;sap-mcp-servers 把 SAP 资料查询能力接入 AI 助手。它们可以串成“查明接口 → 取得规格 → 模拟验证 → 真实系统验收”的开发流程。

遇到的问题更适合的项目可以获得什么
测试后端没准备好,想先写调用和映射sap-bah-sandbox依据接口规格生成的 Mock 服务
很难稳定重现慢响应、异常返回sap-bah-sandbox可调延迟、错误率,以及请求记录
想知道 Hub 中的接口或规格是否变化sap-bah-sandbox目录版本记录与变更报告
不知道该选哪个 SAP APIsap-mcp-servers / API Hub带来源的搜索、元数据与规格
报错后需要找适用的 SAP Notesap-mcp-servers / Notes检索结果、正文、适用范围等资料
产品选型需要核对计划功能sap-mcp-servers / Roadmap路线图条目和计划信息

本文基于 Sandbox 提交 8861b7d 和 MCP Servers 提交 c509e06 。2026 年 10 月 28 日,我在 Windows、Node 24.18.0 下完成了三个 MCP 服务的构建、协议测试和真实查询;Sandbox 尚未在这台机器上运行,下面的 Sandbox 步骤是根据上游文档和代码核对的示例。

sap-bah-sandbox:后端没准备好,也能推进接口开发

问题一:集成开发被测试环境拖住

假设要做一个销售订单接口:调用方发出查询请求,CPI 接收响应,再把订单字段映射给下游应用。真实系统暂时不可用时,仍然有许多工作可以推进,例如 URL 拼接、请求体结构、响应解析、字段映射,以及空列表的处理。

Sandbox 接收 OpenAPI 3、Swagger 2 或 OData EDMX 规格,将它们挂载为 /mock/<slug>/… 下的 HTTP 接口。开发者可以生成模拟数据,也可以导入自己准备的 JSON 或 CSV 测试数据。这样,后端可用性不再是上述开发步骤的唯一前提。能力和格式说明见上游 Mock 文档。

这里的关键是测试数据要服务于问题。随机数据适合确认“调用能否跑通”;检查金额、日期、空字段和特殊字符时,应使用固定 fixture,使同一个输入始终对应可比较的输出。项目会保存生成的数据集,写操作可以继续修改该数据集。

示例:先做一个最小销售订单 Mock

从源码运行需要 Node.js 22.5 或更新版本,上游推荐 Node 24。以下使用 PowerShell,在自己选定的开发目录执行:

git clone https://github.com/bdbais/sap-bah-sandbox.git
cd sap-bah-sandbox
npm install
Copy-Item .env.example .env
npm run build

编辑当前目录的 .env ,本机试用可设置如下几项,其余保留模板配置:

HOST=127.0.0.1
PORT=8080
DATA_DIR=./data
AI_PROVIDER=none
AUTO_UPDATE=false

在同一目录执行 npm start ,再打开 http://127.0.0.1:8080 。服务的数据库和报告保存在 data/ 中。初次体验使用本机回环地址;如果要开放给其他机器,应按上游说明配置 ADMIN_KEY 和访问控制。

创建一个 sales-orders.yaml 。下面是用于演示的自定义接口,路径和模型都不是 SAP 的真实销售订单 API:

openapi: 3.0.3
info:
  title: Demo Sales Orders
  version: 1.0.0
paths:
  /orders:
    get:
      operationId: listOrders
      responses:
        '200':
          description: Order list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  required: [id, amount]
                  properties:
                    id:
                      type: string
                    amount:
                      type: number

在 Mocks 页面导入这个规格,创建并挂载 slug 为 orders-demo 的 Mock,选择 faker 数据策略,然后调用:

curl.exe http://127.0.0.1:8080/mock/orders-demo/orders

验证目标是响应能被解析为数组,每项含有 id 和 amount 。接着将调用方的测试地址指向这个 URL,检查映射后的结果;需要业务边界样本时,再改用 fixture。

如果已经取得真实 SAP API 的规格,可以用同一流程导入,并按该规格的真实路径调用。OData 场景还可以导入 $metadata 对应的 EDMX,测试受支持的查询参数。

云端 CPI 不能直接访问开发电脑的 127.0.0.1 。这时需要按上游可达性指南建立可访问的路径,例如适合环境的 Cloud Connector 或受保护的代理入口;修改 Receiver URL 前,先验证网络路径和认证。

问题二:正常请求能通,但异常处理没有机会验证

真实后端通常不会按测试计划稳定地“变慢一次”或“失败一次”。Sandbox 可以设置延迟和错误率,因此适合观察调用方超时后的行为、错误分支能否进入、重试次数是否符合预期。错误率是概率配置;要做精确断言,还应核对实际状态码和响应体。

它的 Network 页面记录请求和响应,可以帮助回答:“调用方最终发出的 URL、查询参数和 payload 是什么?”例如映射后字段为空,可以对照发送前内容与 Mock 收到的内容,缩小问题范围。项目会遮蔽部分敏感请求头,但请求体仍可能包含业务数据,测试时应优先用合成样本。

同样在项目根目录,可以运行自动生成的只读测试:

node dist/cli/test.js --mock orders-demo --read-only

测试器根据规格生成请求,并校验声明的状态码与响应结构。它能帮助发现接口契约不一致,却不能证明真实系统的业务规则正确。完整测试可能包含写操作,选择 --read-only 会跳过这些操作。机制见测试器说明。

问题三:依赖的接口变了,却到联调时才发现

Sandbox 还可以记录 Hub 中包和工件的版本变化,并生成报告。在项目根目录执行:

node dist/cli/sync.js --filter SuccessFactors

目录跟踪可匿名进行;自动下载具体规格需要相应的 Hub 凭据。取得规格后,工具还能比较部分结构变化。报告保存在 data/reports/ 下,便于结合开发任务判断哪些变动值得复查。

需要注意两个影响结果的条件:按关键字过滤的同步无法可靠判断整个目录中的删除;规格下载失败也不能解释为“接口没有变”。这些区别在目录跟踪文档中有说明。

模拟结果的适用边界

当前版本的 $expand 不会真正内联关联对象;无法解析的部分 $filter 表达式可能返回全部行。涉及关联展开和过滤正确性的测试,必须仔细检查结果,必要时移到真实环境验证。

模拟服务也不覆盖真实 SAP 的权限、业务校验、事务行为和完整性能特征。它最有价值的地方,是让协议和映射问题在真实联调前暴露,而后再把网络、认证和业务行为放回真实系统验收。

sap-mcp-servers:把 SAP 资料查询放进开发对话

问题一:AI 能解释概念,却拿不到需要登录的资料

SAP 开发里的很多问题需要具体证据:某个 API 支持哪些操作,某条 Note 适用哪个组件或版本,某个产品功能是否还在计划中。仅凭模型已有知识回答,容易把不同产品、版本和时间点混在一起。

sap-mcp-servers 提供三个服务,以及共用的 SAP 登录模块。接入支持 MCP 的客户端后,AI 助手可以调用搜索和获取工具,将返回的资料用于当前问题。具体工具说明分别见API Hub、Roadmap和Notes。

服务实际解决的问题典型工作方式
API Hub MCP找接口、核对规格、减少凭记忆编造字段搜索 → 查看元数据 → 获取所需规格
Roadmap MCP为选型和规划收集计划信息搜索产品 → 查看条目 → 核对计划时间和来源
Notes MCP为错误排查收集适用的修复资料搜索错误 → 获取正文 → 对照组件和版本

接入服务不会替账号增加权限。项目使用 SAP 登录和受认证保护的接口,首次登录或会话失效时可能需要浏览器交互。Notes 访问还取决于账号对支持资料的权限。

示例一:从“给我写代码”改为“先确认 API 契约”

接入 API Hub MCP 后,可以这样提出任务:

在 SAP API Hub 搜索销售订单相关 API。
先区分 S/4HANA Cloud 和其他产品的候选项,列出来源链接与适用产品。
选定候选后,读取它的操作和关键实体;需要时获取 OpenAPI 或 EDMX 规格。
根据实际规格给出一个最小查询示例,缺少的字段不要猜测。

这个流程把接口选择、规格读取和代码生成连在一起。API Hub 服务提供 search 、 fetch 、 resources 、 spec 等工具;完整规格通过显式的 spec 调用获取。工具查询资料,不会执行该资料所描述的真实业务接口。

示例二:OData 415 报错时,让搜索结果参与诊断

可以对 Notes MCP 这样提问:

搜索与 OData Gateway HTTP 415 相关的 SAP Notes 或 KBA。
列出标题、来源、组件和适用条件,然后读取最相关条目的正文。
将“文档明确说明”和“需要结合当前请求检查的假设”分开。
给出应核对的请求头、payload 格式和系统版本信息。

这样得到的输出应是一份待核验的排查依据。搜索命中并不代表某条 Note 一定适用于当前系统;还要对照请求内容、组件版本和 Note 的前提条件。

本次验证中,Notes 搜索 OData 返回了 29,568 条匹配记录。这个数字是查询当时的总命中数,并不代表已下载或阅读全部正文;实际诊断应使用更精确的错误和组件关键词。

示例三:产品选型时区分已具备功能与计划功能

Roadmap MCP 的提问可以写成:

查询 SAP Road Map Explorer 中与 Work Zone 有关的条目。
列出功能、计划时间、状态和原始链接。
将计划信息与已交付信息区分;不要把路线图日期当作交付承诺。

它适合把计划信息整理进选型讨论。最终设计仍要核对实际产品文档、当前租户能力和相关发布说明,避免把未来条目当成现成能力。

在 Codex 中接入三个服务

以下给出源码构建方式。使用 Node.js 22.12 或更新版本;本次验证采用 Node 24.18.0。先在自己的开发目录执行:

git clone https://github.com/marianfoo/sap-mcp-servers.git
cd sap-mcp-servers
npm ci
npm run build
npm run install:browsers

构建顺序由根脚本处理:先构建共用认证模块,再构建三个服务。Windows 下浏览器下载较慢时,可以给下载进程配置本机代理:

$env:HTTPS_PROXY = "http://127.0.0.1:7890"
$env:HTTP_PROXY = "http://127.0.0.1:7890"
npm run install:browsers

这个代理配置用于下载,并不表示 SAP 浏览器登录也自动使用相同代理。此次安装先跳过自动浏览器下载完成构建,再通过代理安装 Chromium,最后完成登录测试。

为运行配置单独创建一个目录,例如 C:/sap-tools/workspaces/sap-mcp-servers/ 。将账号放到其中的 .env ,只在本机填写真实值:

AUTH_METHOD=password
SAP_USERNAME=your-sap-account@example.com
SAP_PASSWORD="replace-locally"
HEADFUL=true
MFA_TIMEOUT=120000

HEADFUL=true 让登录浏览器可见,便于完成交互验证;账号和密码不要写进公共 MCP 示例。使用目录的 .gitignore 至少包含:

.env
*-token-cache.json
sso-storage-state.json
*.pfx
*.p12

下面这段 PowerShell 假设源码已放到 C:/sap-tools/repos/sap-mcp-servers/ ,而运行配置目录就是前述路径。按实际目录修改前两行;使用 Node 的绝对路径,避免客户端启动时找到旧版本:

$sourceDir = 'C:/sap-tools/repos/sap-mcp-servers'
$configDir = 'C:/sap-tools/workspaces/sap-mcp-servers'
$nodeExe = (Get-Command node.exe).Source

codex mcp add sap-api-hub-local `
  --env "ENV_FILE=$configDir/.env" `
  --env "API_HUB_TOKEN_CACHE_FILE=$configDir/api-hub-token-cache.json" `
  -- $nodeExe "$sourceDir/packages/api-hub/dist/mcp-server.js"

codex mcp add sap-roadmap-local `
  --env "ENV_FILE=$configDir/.env" `
  --env "ROADMAP_TOKEN_CACHE_FILE=$configDir/roadmap-token-cache.json" `
  -- $nodeExe "$sourceDir/packages/roadmap/dist/mcp-server.js"

codex mcp add sap-notes-local `
  --env "ENV_FILE=$configDir/.env" `
  --env "SAP_NOTES_TOKEN_CACHE_FILE=$configDir/notes-token-cache.json" `
  -- $nodeExe "$sourceDir/packages/notes/dist/mcp-server.js"

codex mcp list

Codex 将配置保存在用户的 ~/.codex/config.toml 。新增配置后,重新打开会话以加载服务,再使用前面的自然语言查询。配置方式参见Codex MCP 文档。

这次测试分了三层:配置被客户端识别;服务完成 MCP 初始化并返回工具列表;业务工具完成 SAP 登录并拿到实际数据。前两层成功不能替代第三层。

服务发现的工具数实际查询结果
API Hub6categories 返回 10 个分类
Roadmap5搜索 work zone 返回 5 条结果
Notes3搜索 OData 返回匹配结果及总数

Roadmap 首次查询曾报“找不到用户名字段”,重试后成功。现有证据只能说明首次认证流程没有完成,不能据此认定密码错误或账号无权限。另外,上游的一个冒烟测试在 Windows 因创建符号链接出现 EPERM ,随后直接对构建产物执行 MCP 握手和工具调用完成了验证;这两种测试覆盖的内容不同。

这些测试是以 MCP 客户端协议调用本地服务完成的。Codex 配置已登记,但“配置出现在列表中”与“新会话中的 AI 已使用它完成任务”仍是两个观察层次。

把两个项目用在同一个开发任务里

以销售订单查询集成为例,可以按下面的顺序推进:

  1. 用 API Hub MCP 查候选接口,确认产品和版本,并获取明确的接口规格。
  2. 将规格导入 Sandbox,先用固定样本验证查询构造、字段映射和响应解析。
  3. 在 Sandbox 中增加慢响应和异常返回场景,观察超时、重试和错误分支。
  4. 接入真实测试系统,验证认证、授权、业务规则与真实数据。
  5. 遇到错误时,用 Notes MCP 找文档证据,再结合真实请求和日志判断;涉及产品能力规划时查询 Roadmap。

两个项目之间没有在本文中配置自动传递规格的连接,上面的步骤需要显式导出、导入或另写自动化。其价值在于把工作拆成可以逐步验收的环节:资料查询帮助确定应该做什么,模拟服务帮助提前发现实现问题,真实系统最终确认实际行为。

如果当前瓶颈是“后端不可用,联调停住”,先试 Sandbox;如果瓶颈是“查资料慢,AI 回答缺少依据”,先接入 MCP Servers。只选择能解决当前问题的部分,通常比一次部署全部组件更容易看到效果。

参考与验证范围

两个项目均为独立开源项目。MCP 服务对 SAP 登录流程和受保护接口存在依赖,使用应符合账号权限和组织要求。此次依赖安装报告了 3 项漏洞提示,后续独立审计因网络失败未取得明细,未将其写成已修复。正式团队使用前,应结合自己的依赖审计、权限配置和实际测试决定版本。