1. SAP 移动应用生成路径怎么选:MDK、OData 直连与 MCP Server 的真实差异
SAP 生态里想做一个原生移动 App,摆在面前的路线其实不止一条,但真正能落地的组合并不多。我先把结论放在前面:如果你要的是「自然语言描述需求 → 生成可运行的跨平台移动应用 → 部署到手机」,目前最顺的组合是 MDK(Mobile Development Kit)+ MCP Server + SAP Mobile Services,后端数据通过 OData 服务暴露出来。而如果你只是想让手机读几个 OData 接口,那直连也能跑,但企业环境下基本会被安全策略卡住。
先解释几个关键词,方便后面看配置不迷路。MDK 是 SAP 的元数据驱动移动开发框架,一套项目可以跑在 Android、iOS,也能当 Web 应用用,它把页面、动作、规则、离线定义都写在元数据里,运行时由移动客户端解释成原生界面。OData 是 SAP 后端暴露业务数据的标准协议,S/4HANA Cloud 上你只能消费已发布的 API,不能随便把内部表暴露出去。MCP Server 则是把 MDK 的创建、生成、部署能力包装成 AI Agent 可调用的工具,让自然语言真正驱动项目生成。
三条路径的差异,我用一张表说清楚:
| 路径 | 自然语言生成 | 原生体验 | 离线能力 | 企业安全 | 适合谁 |
|---|---|---|---|---|---|
| MDK + MCP Server | 强 | 强 | 强 | 强 | 想快速出可运行 App 的开发者 |
| OData 直连 | 无 | 取决于前端 | 需自己实现 | 弱 | 内部工具、原型验证 |
| BTP SDK 原生开发 | 辅助 | 最强 | 强 | 强 | 有专业移动团队的项目 |
我试过直接用手机请求 S/4HANA 的 OData URL,技术上能通,但生产环境不该这么干。原因很直接:手机里存技术用户密码等于把后端钥匙交出去,OAuth 和 SSO 没法统一处理,用户身份传播、设备撤销、日志审计全都缺位。正确链路应该是手机 → SAP Mobile Services → BTP Destination → S/4HANA Cloud,中间这层代理把认证、离线、推送、应用更新全兜住了。
那 MCP Server 到底解决什么问题?它把 MDK 项目生成从「手写元数据」变成「描述需求」。你告诉 AI Agent 要一个销售订单应用,它调用 mdk-create 根据 OData 元数据生成项目骨架,再调 mdk-gen 补页面和动作,最后 mdk-manage 负责构建、部署、生成二维码。整个过程里,OData 元数据是地基,没有它,生成出来的页面不知道字段从哪来。
所以选型逻辑可以简化成一句话:要自然语言生成 + 原生 + 离线,选 MDK 路线;只要读数据做展示,OData 直连够用但别上生产;要极致原生体验且有团队,BTP SDK 更合适。下面我重点讲 MDK 路线怎么配,因为这是大多数人真正想落地的方向。
2. TaoToken 前置准备:给 MCP Server 配一个稳定的模型入口
在讲 MDK 配置之前,得先解决一个现实问题:MCP Server 本身不产生智能,它需要背后有一个能理解自然语言、能调用工具的大模型。你可以用企业自选的模型,也可以用 TaoToken 这类聚合入口来统一管理模型调用。这里我以 TaoToken 为例,把前置准备讲清楚,因为后面 config.toml 和 settings.json 里都要填它的地址和 Key。
TaoToken 在这里扮演的角色是「模型网关」:你的 AI 编程助手(比如 Cline、Claude Code 这类支持 MCP 的客户端)通过它去调用模型,模型再通过 MCP 协议去调 MDK MCP Server 的工具。整条链路是:AI 助手 → TaoToken → 大模型 → MCP Server → MDK 项目。
第一步,拿到 API Key。访问 https://taotoken.net/api-keys 创建密钥,注意这个 Key 只在创建时完整显示一次,复制好放安全的地方。如果你还没账号,从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 进官网注册即可。
第二步,确认 Base URL。TaoToken 的 API 入口是 https://taotoken.net/api,注意这个地址不带任何查询参数,配置时直接填这个。很多客户端要求 Base URL 以 /v1 结尾或者不带,具体看客户端要求,但根地址就是它。
第三步,选模型。TaoToken 支持多种模型,你在配置里填 Model ID 就行。对于 MDK 项目生成这种任务,建议选长上下文、工具调用能力强的模型,因为 OData 元数据文件可能很大,模型要能读懂字段结构再生成页面。
这里有个容易踩的坑:MCP Server 的工具调用和普通对话不一样,它要求模型支持 function calling 或 tool use。如果你选的模型不支持工具调用,AI 助手会一直说「我无法调用工具」,而不是报错,排查起来很费时间。所以配之前先确认模型能力。
第四步,验证 Key 能用。可以用 curl 快速测一下:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer 你的_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "你的模型ID", "messages": [{"role": "user", "content": "ping"}] }'返回里有 choices 字段就说明通了。如果返回 401,检查 Key 有没有复制全、有没有多余空格。如果返回 model not found,检查 Model ID 拼写。
这一步做完,你手里应该有三样东西:Base URL(https://taotoken.net/api)、API Key、Model ID。这三件套后面在 config.toml 和 settings.json 里都要用到,缺一不可。我见过有人只填了 Key 没填 Model ID,客户端默认用一个不存在的模型,结果一直超时,还以为是网络问题。
另外提醒一句,TaoToken 的模型对话入口在 https://taotoken.net/models,你可以先在那里试试模型能不能正常对话、能不能调工具,再去配 MCP,这样能把「模型问题」和「MCP 配置问题」分开排查。
3. 可复制配置骨架:config.toml 与 settings.json 怎么写
这一节是重点,我给出两份可直接复制的配置骨架,一份是 MCP 客户端的 config.toml(以 Cline 这类支持 TOML 配置的客户端为例),一份是 settings.json(以 Claude Code 或类似客户端为例)。两份配置的核心都是三件套:Base URL、API Key、Model ID,再加上 MDK MCP Server 的启动命令。
先说 config.toml。这个文件通常放在你的 AI 助手配置目录下,不同客户端路径不一样,Cline 一般在 VS Code 的设置里,Claude Code 在用户目录的配置文件夹。内容长这样:
# AI 模型入口配置 [model] base_url = "https://taotoken.net/api" api_key = "sk-你的TaoToken密钥" model_id = "你的模型ID" provider = "openai-compatible" # MDK MCP Server 配置 [mcp_servers.mdk] command = "npx" args = ["-y", "@sap/mdk-mcp-server"] env = { SAP_MOBILE_SERVICES_HOST = "你的Mobile Services地址" } # 可选:文档检索 MCP [mcp_servers.mdk_docs] command = "npx" args = ["-y", "@sap/mdk-mcp-server", "--docs-only"]这里几个点要解释。base_url 填 TaoToken 的 API 根地址,不要带 /v1,因为不同客户端会自己拼路径,带了可能变成 /v1/v1。api_key 就是上一步拿到的 Key。model_id 填你选的模型。provider 写 openai-compatible,因为 TaoToken 的接口兼容 OpenAI 格式。
mcp_servers 段是告诉客户端去哪启动 MCP Server。command 用 npx,args 里 -y 表示自动确认安装,@sap/mdk-mcp-server 是包名。env 里可以传 SAP Mobile Services 的地址,这样 mdk-manage 部署时知道往哪推。
再说 settings.json,格式是 JSON,适合 Claude Code 这类客户端:
{ "model": { "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoToken密钥", "modelId": "你的模型ID" }, "mcpServers": { "mdk": { "command": "npx", "args": ["-y", "@sap/mdk-mcp-server"], "env": { "SAP_MOBILE_SERVICES_HOST": "你的Mobile Services地址" } } } }注意 JSON 里不能有注释,所以我把说明都放在正文里。baseUrl 和 apiKey 的键名不同客户端可能不一样,有的叫 base_url,有的叫 baseUrl,配之前看一眼客户端文档。Model ID 一定要填对,这是最容易出错的地方。
如果你用的是 Claude Code,配置路径通常在 ~/.claude/settings.json 或项目目录下的 .claude/settings.json。Claude Code 的接入文档在 https://taotoken.net/doc,里面有更细的客户端适配说明。Coding Plan 相关的长期编码配置可以参考 https://taotoken.net/coding-plan,如果你打算把 MCP 生成 MDK 项目当成日常开发流程,这个入口能帮你把模型调用成本管起来。
配完之后,重启客户端,让它重新加载配置。然后在对话里问一句「你有哪些 MCP 工具可用」,如果模型能列出 mdk-create、mdk-gen、mdk-manage、mdk-docs,说明 MCP Server 挂载成功。如果列不出来,先检查 npx 能不能跑,再检查网络能不能访问 npm 源。
这里有个细节:MDK MCP Server 依赖 Node.js 环境,npx 是 Node 自带的。如果你机器上没装 Node,先装一个 LTS 版本。装完在终端跑npx -y @sap/mdk-mcp-server --help,能出帮助信息就说明环境没问题。
4. 验证请求:一次 OData 服务连通性检查与 MDK 项目生成
配置写完不能直接信,得验证。验证分两层:先验证 OData 服务本身通不通,再验证 MCP Server 能不能根据 OData 元数据生成项目。这两层分开测,出问题好定位。
先说 OData 连通性。假设你已经在 S/4HANA Cloud 里建好了 Communication Arrangement,拿到了 OData 服务 URL,形如:
https://你的租户.s4hana.cloud.sap/sap/opu/odata/sap/API_SALES_ORDER_SRV先用 curl 测元数据能不能拉下来:
curl -u "通信用户名:通信密码" \ "https://你的租户.s4hana.cloud.sap/sap/opu/odata/sap/API_SALES_ORDER_SRV/\$metadata" \ -H "Accept: application/xml" \ -o metadata.xml如果返回 200 并且 metadata.xml 里有 EntityType、EntitySet 这些标签,说明服务通了。如果返回 401,检查通信用户密码。如果返回 403,检查 Communication Arrangement 里这个服务有没有被授权。如果返回 404,检查服务路径拼写,SAP 的 OData 路径大小写敏感。
拿到 metadata.xml 后,把它放到你的 MDK 项目工作目录,因为 MCP Server 生成页面时要读它。这一步很关键,很多人跳过元数据直接让 AI 生成,结果字段名全是猜的,生成出来的绑定对不上。
接下来验证 MCP 生成。在 AI 助手对话里输入类似这样的提示词:
使用 mdk-create 工具,基于当前目录下的 metadata.xml, 创建一个离线 MDK 项目,应用名为 SalesOrderApp, 消费 API_SALES_ORDER_SRV 服务, 首页用 ObjectTable 展示销售订单头, 支持按客户和状态搜索。如果模型正确调用 mdk-create,你会在工作目录看到新生成的项目文件夹,里面有 Pages、Actions、Rules、i18n 这些子目录。打开 Pages 下的页面定义,能看到 ObjectTable 的字段绑定指向 OData 的字段名,说明元数据被正确解析了。
再验证部署环节。输入:
使用 mdk-manage 工具,构建并部署这个项目到 SAP Mobile Services, 然后生成 onboarding 二维码。如果配置正确,mdk-manage 会先校验项目,再构建,再推送到 Mobile Services,最后返回一个二维码图片或链接。用手机上的 SAP Mobile Services Client 扫码,就能看到应用跑起来。
这里我要强调一个成功判据:不是「AI 说生成了」就算成功,而是你打开生成的项目文件,看到页面、动作、规则、i18n 文件都真实存在,字段绑定和 OData 元数据对得上,这才算通。我见过 AI 回复「已为你生成项目」但目录里空空如也的情况,那是模型没真正调工具,只是嘴上说说。
如果生成的项目里字段绑定是空的,八成是 metadata.xml 没被读到。检查文件路径是不是在工作目录,检查提示词里有没有明确说「基于 metadata.xml」。MCP Server 不会自动扫描整个磁盘找元数据,你得告诉它文件在哪。
5. 本篇常见错排查:401、local proxy failed、reading choices 与 OAuth
配置和验证过程中,报错基本集中在几类。我把真实遇到过的错误和排查路径列出来,你对着改就行。
第一类:401 Unauthorized。这个最直接,就是 Key 不对。可能原因有三个:Key 复制时带了空格或换行;Key 已经过期或被撤销;Base URL 填错导致请求发到了别的服务。排查方法是用第 2 节的 curl 命令单独测 Key,如果 curl 也 401,那就是 Key 本身的问题,去 https://taotoken.net/api-keys 重新生成一个。如果 curl 通了但客户端 401,那就是客户端配置里的 Key 字段名写错了,或者客户端把 Key 拼到了错误的 header 里。
第二类:local proxy failed。这个报错通常出现在客户端尝试通过本地代理转发请求时。原因可能是客户端配置了代理但代理没启动,或者代理端口被占用。排查方法是检查客户端设置里有没有 proxy 相关配置,如果有,先关掉试试直连。另外检查环境变量 HTTP_PROXY、HTTPS_PROXY 有没有被设置成无效值。这个错误和模型本身无关,纯粹是网络层问题。
第三类:reading choices 相关报错,比如cannot read property 'choices' of undefined或reading 'choices'。这个说明客户端收到了响应,但响应结构里没有 choices 字段。可能原因:Base URL 填成了网页地址而不是 API 地址,导致返回的是 HTML 而不是 JSON;Model ID 填错,服务返回了错误对象;请求体格式不对,服务没按预期返回。排查方法是看客户端日志里实际发出的请求 URL 和收到的原始响应,如果响应是 HTML,那就是 URL 错了,确认 base_url 是 https://taotoken.net/api 而不是官网首页。
第四类:OAuth 相关错误,比如OAuth token request failed或invalid_client。这个通常出现在 MDK 项目部署到 Mobile Services 或访问 S/4HANA OData 时。排查分两层:如果是访问 S/4HANA 报 OAuth 错,检查 Communication Arrangement 里的 OAuth 配置,确认 Communication User 有权限;如果是部署到 Mobile Services 报错,检查 Mobile Services 里的 Destination 配置,确认 OAuth 客户端 ID 和密钥填对了。OAuth 的坑在于参数名容易写错,比如 client_id 写成 clientId,SAP 的接口对参数名敏感。
第五类:MCP Server 启动失败,报command not found: npx或Cannot find module。这是 Node 环境问题。确认 Node.js 装了,node -v能出版本号;确认 npm 能用,npm -v能出版本号;确认 npx 在 PATH 里。如果公司网络限制 npm 源,配置一下 registry 或者用内网镜像。
第六类:模型不调工具,一直回复文字。这个不是报错,但很常见。原因是模型不支持 function calling,或者客户端没把工具定义传给模型。排查方法是换一个支持工具调用的模型,或者在客户端里确认 MCP 工具已经加载。如果工具列表是空的,说明 MCP Server 没挂上,回到第 3 节检查 config.toml 或 settings.json。
第七类:生成的项目字段绑定为空。这个前面提过,核心是元数据没被读到。检查 metadata.xml 路径,检查提示词有没有明确引用它。另外确认 OData 元数据里的字段名和你在提示词里描述的业务字段能对应上,如果元数据里叫 SalesOrder,你提示词里说 order number,模型可能对不上。
排查的通用思路是:先分层,再定位。模型层的问题用 curl 测;MCP 层的问题看工具列表;OData 层的问题用 curl 测元数据;部署层的问题看 Mobile Services 日志。一层一层排除,比盲目改配置快得多。
6. 语义一致 CTA:把模型入口和接入文档用起来
配置跑通之后,日常开发里你会反复用到几个入口。我把它们按场景分一下,方便你按需取用。
如果你在排查接入问题、需要确认 Base URL 和 Key 怎么填,直接看接入文档:https://taotoken.net/doc,里面有各客户端的配置示例。API Key 管理在 https://taotoken.net/api-keys,Key 丢了或要轮换就来这里。
如果你只是想先验证模型能不能正常对话、能不能调工具,用模型对话入口:https://taotoken.net/models,在这里试提示词比在客户端里试快,因为不用反复重启客户端。
如果你打算把 MCP 生成 MDK 项目当成长期开发流程,模型调用量会上去,这时候看 Coding Plan:https://taotoken.net/coding-plan,它适合长期编码和 Agent 场景,能把成本管住。
如果你用的是 Claude Code,它的接入配置和普通客户端略有差异,参考:https://taotoken.net/ClaudeCodeAnthropic,里面有针对 Claude Code 的 MCP 和模型配置说明。
控制台入口在 https://taotoken.net/console,可以看调用记录和用量。
最后说一个我踩过的坑:MCP Server 生成 MDK 项目时,如果 OData 元数据很大,模型上下文可能不够,生成到一半就断了。解决办法是先用 mdk-docs 工具检索相关组件定义,缩小范围,再让模型基于元数据生成。另外,生成出来的项目一定要人工审查权限、字段、离线策略,AI 能生成骨架,但业务逻辑和数据权限不能全交给它。离线过滤条件、冲突处理策略、批量大小这些,还是得开发人员根据实际业务定。