1. 为什么 ABAP 开发者需要 Agentic AI 和 ADT MCP Server
ABAP 开发有一个天然痛点:开发对象不在本地文件系统里,而是存放在后端 ABAP Repository 中。语法检查、激活、传输请求、Where Used List、DDIC 元数据、RAP 行为定义、Service Binding、OData 暴露,这些操作都依赖后端系统上下文。一个只会读本地文件的 AI Agent,写出来的 ABAP 代码看起来像那么回事,但它不知道对象是否存在、包是否允许 ABAP for Cloud Development、依赖 API 是否 released、传输请求是否可用。
ADT MCP Server 补上了这个断点。MCP(Model Context Protocol)给 AI 应用连接外部工具和系统提供了一套开放协议,而 ADT MCP Server 把 ABAP 后端系统中原本只对 ADT 开放的能力,以标准工具的形式暴露给 Agent。Agent 不再只是猜代码,而是可以基于真实系统上下文执行动作:读取对象、创建开发对象、创建传输、生成 RAP 应用骨架,再根据系统返回结果继续调整。
这就是目标驱动开发的核心差异。你给 Agent 的不是一句“帮我写个类”,而是一个相对完整的目标,比如“基于采购申请审批表设计一个 RAP 服务,支持草稿、校验金额、暴露 OData V4,并生成基本 ABAP Unit 测试”。Agent 把目标拆成多步,识别已有表结构或 CDS View,判断是否需要新建 root view entity,生成 behavior definition,创建 behavior implementation,处理 validation 和 determination,创建 service definition 与 service binding,跑语法检查,处理激活错误,必要时回滚或改写代码。
这套流程要跑通,前提是 Agent 能稳定调用模型能力。TaoToken 在这里扮演的角色是统一 Key 和 API 通道:你不需要为每个 Agent 工具单独申请和管理不同厂商的 Key,而是通过一个统一的 API 入口,让 Claude Code、Cline、CC Switch 等工具共享同一套模型访问配置。下面从零开始,把 ADT MCP Server 和 TaoToken 串起来。
2. TaoToken 前置准备:统一 Key 与 API 通道
TaoToken 是一个面向 AI 编程工具和 Agent 场景的 API 聚合服务,核心价值是统一 Key 管理。你可以把它理解成一个模型访问的“总闸”:所有支持自定义 API Base URL 的工具,都可以指向同一个入口,用同一个 Key 调用不同模型。
对于 ABAP + ADT MCP Server 这个场景,TaoToken 解决的是三个实际问题。第一,Claude Code 和 Cline 可能同时需要接入,如果各自配置不同厂商的 Key,管理成本高且容易混乱。第二,ADT MCP Server 本身不绑定模型,它只负责把 ABAP 系统能力暴露成 MCP 工具,模型调用需要外部提供。第三,目标驱动开发中 Agent 会频繁调用模型进行推理和决策,稳定的 API 通道比单次调用质量更重要。
你需要先拿到 TaoToken 的 API Key。访问控制台地址https://taotoken.net/api-keys,登录后创建一个新的 Key。建议按用途命名,比如abap-agent-dev,方便后续在多个工具中区分。创建完成后复制 Key,格式通常以sk-开头。
TaoToken 的 API 入口是https://taotoken.net/api,这个地址在后续所有配置中作为base_url或ANTHROPIC_BASE_URL使用。注意 API 地址不带 UTM 参数,保持干净。
如果你还没有账号,可以先通过官网了解服务范围:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。注册流程不复杂,重点是拿到 Key 之后立刻进入配置环节。
注意:API Key 不要硬编码在会提交到 Git 的文件里。建议用环境变量或本地配置文件,并在
.gitignore中排除。
3. 可复制配置:config.toml 与 settings.json 骨架
ADT MCP Server 的接入涉及两个配置文件:MCP 客户端侧的config.toml(或等价的 MCP 配置文件)和 Claude Code 侧的settings.json。不同工具的配置文件路径和字段名略有差异,但核心逻辑一致:告诉 MCP 客户端去哪里启动 ADT MCP Server,告诉模型客户端去哪里调用 TaoToken。
先看 MCP 配置文件。以常见的config.toml为例,你需要声明一个 MCP Server 条目,指定启动命令和参数。ADT MCP Server 通常以本地进程方式运行,通过 stdio 与 MCP 客户端通信。
# config.toml - MCP Server 配置骨架 [mcp_servers.adt] command = "npx" args = ["-y", "@sap/adt-mcp-server@latest"] env = { ADT_HOST = "https://your-abap-dev-system:44300", ADT_CLIENT = "100", ADT_USER = "YOUR_ABAP_USER", ADT_PASSWORD = "YOUR_ABAP_PASSWORD" } [mcp_servers.adt.tools] # 按需开启工具权限,初期建议只读 allow_read = true allow_create = false allow_activate = false allow_transport = false上面这段配置的关键点:ADT_HOST指向你的 ABAP 开发系统,ADT_CLIENT是客户端编号,ADT_USER和ADT_PASSWORD是 ABAP 系统用户凭据。工具权限部分建议初期只开allow_read,等只读场景稳定后再逐步放开写操作。
接下来是 Claude Code 的settings.json。这个文件通常位于~/.claude/settings.json或项目根目录的.claude/settings.json。核心是配置模型 API 通道指向 TaoToken。
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-your-taotoken-key", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" }, "mcpServers": { "adt": { "command": "npx", "args": ["-y", "@sap/adt-mcp-server@latest"], "env": { "ADT_HOST": "https://your-abap-dev-system:44300", "ADT_CLIENT": "100", "ADT_USER": "YOUR_ABAP_USER", "ADT_PASSWORD": "YOUR_ABAP_PASSWORD" } } } }如果你用的是 Cline(VS Code 插件),配置入口在 Cline 的设置面板中。找到 “API Provider” 选择 “Anthropic”,然后在 “Base URL” 填入https://taotoken.net/api,“API Key” 填入 TaoToken Key。Cline 的 MCP 配置在cline_mcp_settings.json中,结构与上面的mcpServers字段一致。
CC Switch 是另一个常用工具,用于在多个 Claude Code 配置之间切换。它的配置文件通常是一个 JSON 数组,每个条目代表一套环境。你可以把 TaoToken 配置作为一个独立 profile:
[ { "name": "taotoken-abap", "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-your-taotoken-key", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } } ]配置完成后,重启 Claude Code 或 Cline,让 MCP Server 和 API 通道生效。你可以在 Claude Code 中输入/mcp查看 ADT MCP Server 是否已连接,工具列表是否可见。
4. 端到端验证:从目标描述到 RAP 对象生成
配置就绪后,做一次完整的端到端验证。目标不是生成一个能上生产的应用,而是确认 Agent 能通过 ADT MCP Server 读取系统上下文、调用工具、生成 RAP 骨架,并根据反馈调整。
第一步,在 Claude Code 中输入一个明确的目标描述。注意目标要包含系统约束,而不是模糊的“帮我写个 RAP 服务”。
基于表 ZAGENT_ORDER 创建一个只读 RAP 查询服务。 要求: 1. 使用 ABAP for Cloud Development 语言版本 2. 创建 CDS root view entity ZI_AgentOrder 3. 创建 projection view ZC_AgentOrder 4. 创建 service definition ZUI_AgentOrder 5. 创建 service binding ZUI_AgentOrder_O4,类型 OData V4 6. 所有对象放在包 ZAI_DEMO 下 7. 生成后执行语法检查,报告激活状态第二步,观察 Agent 的工具调用轨迹。正常情况下,它会先调用 ADT MCP Server 的读取工具,查询ZAGENT_ORDER表是否存在、字段结构是什么、包ZAI_DEMO是否允许 ABAP for Cloud Development。然后它会生成 CDS 源码,调用创建工具写入系统,再调用激活工具尝试激活。
如果表不存在,Agent 应该报告错误并询问你是否需要先创建表。如果包语言版本不匹配,Agent 应该提示约束冲突。这些反馈正是 ADT MCP Server 的价值:Agent 不是凭空生成,而是基于真实系统状态决策。
第三步,检查生成结果。在 ADT 或 Eclipse 中打开包ZAI_DEMO,确认以下对象已创建:
| 对象类型 | 对象名称 | 预期状态 |
|---|---|---|
| CDS View Entity | ZI_AgentOrder | 已激活 |
| CDS Projection View | ZC_AgentOrder | 已激活 |
| Service Definition | ZUI_AgentOrder | 已激活 |
| Service Binding | ZUI_AgentOrder_O4 | 已激活,OData V4 |
如果某个对象激活失败,Agent 应该读取错误消息并尝试修复。比如 CDS 中使用了未释放的 annotation,Agent 会替换为 released 写法。如果 Agent 没有自动修复,你可以把错误消息贴回去,让它继续处理。
第四步,验证 OData 服务是否可访问。在 Service Binding 中点击 “Preview” 或 “Publish”,确认服务能返回 metadata。这一步不需要 Agent 参与,但它是端到端闭环的最后一环。
整个验证过程的核心不是“一次成功”,而是确认 Agent 能在系统约束下工作。它可能第一次激活失败,可能生成的 annotation 需要调整,但只要它能读取错误、调用工具、继续修正,目标驱动开发的循环就成立了。
5. 本篇常见错排查
ADT MCP Server 连接失败,提示证书错误。ABAP 开发系统通常使用自签名证书,MCP Server 默认会校验 TLS。你可以在 MCP Server 的环境变量中增加NODE_TLS_REJECT_UNAUTHORIZED=0临时绕过,但生产环境建议导入系统证书到信任链。更稳妥的方式是在config.toml的env中增加ADT_SSL_VERIFY=false,具体字段名以 ADT MCP Server 文档为准。
Claude Code 报 401 或 API Key 无效。检查ANTHROPIC_API_KEY是否以sk-开头,是否有多余空格。确认ANTHROPIC_BASE_URL填的是https://taotoken.net/api,不要加尾部斜杠。如果用的是 CC Switch,确认当前激活的 profile 是 TaoToken 那个。
MCP 工具列表为空。在 Claude Code 中输入/mcp,如果 ADT Server 显示 connected 但工具为空,通常是 ADT MCP Server 启动参数不对。检查npx是否能正常拉取包,可以手动在终端运行npx -y @sap/adt-mcp-server@latest --help看是否有输出。如果包名或版本有变化,以官方文档为准。
Agent 创建对象时提示权限不足。ABAP 用户需要有对应包的开发权限和传输请求权限。检查用户角色是否包含S_DEVELOP,包ZAI_DEMO是否允许当前用户创建对象。如果系统开启了 ABAP for Cloud Development 限制,确认包的语言版本设置正确。
激活 CDS 时提示 “Annotation not released”。这是 ABAP Cloud 环境常见问题。Agent 生成的 CDS 可能使用了未释放的 annotation 或关联。解决办法是让 Agent 读取错误消息,替换为 released 的等价写法。你也可以在目标描述中提前说明“只使用 released API 和 annotation”。
Service Binding 激活后无法 Preview。检查 Service Binding 的类型是否选对(OData V4 vs OData V2),以及是否已 Publish。有些系统需要手动在/IWFND/MAINT_SERVICE中注册服务。如果 Agent 生成的 Binding 缺少@ObjectModel相关 annotation,也可能导致服务无法正确暴露。
Agent 反复生成相同错误代码。这种情况通常是上下文丢失。Claude Code 的会话有 token 限制,长对话中早期系统信息可能被截断。建议把关键约束(包名、语言版本、released API 要求)写在一个单独的文件中,让 Agent 每次先读取该文件。或者在目标描述中重复关键约束。
6. 把统一 Key 和 MCP 工具链接入日常开发流
跑通一次验证之后,下一步是把它变成日常开发流的一部分。我的做法是在项目根目录放一个abap-agent-context.md,里面写清楚当前系统的约束:ABAP 版本、包语言版本、可用 released API 列表、命名规范、传输请求编号。每次让 Agent 执行任务前,先让它读取这个文件。这样即使会话重置,Agent 也能快速恢复上下文。
对于长期编码和 Agent 场景,Coding Plan 提供了更稳定的调用额度,适合把 ADT MCP Server 接入到日常 RAP 开发中。你可以在https://taotoken.net/api/coding-plan查看具体方案。如果只是验证模型对话能力,模型对话入口在https://taotoken.net/api/model-chat。接入文档在https://taotoken.net/api/doc,里面有各工具的详细配置示例。
实际使用中,我建议把 Agent 的任务分成三类:只读分析、骨架生成、代码审查。只读分析风险最低,让 Agent 读取对象、解释依赖、总结调用关系。骨架生成适合 RAP 这种结构化场景,Agent 按顺序创建 CDS、Behavior、Service。代码审查让 Agent 检查已有代码是否符合 Clean Core 约束,比如是否调用了 unreleased API、是否有嵌套 SELECT。
这三类任务中,只读分析和骨架生成可以较高频使用,代码审查需要人工确认。写操作始终限制在开发系统,生产系统只读。传输请求的创建和释放保持人工审批,不让 Agent 自动完成。
最后一点:Agent 生成的代码必须经过 review。ABAP 世界里,能激活只是最低标准。事务边界、授权检查、性能、测试覆盖,这些仍然需要开发者判断。Agent 把样板代码和对象创建的时间省下来,你把精力放在业务建模和架构边界上。这才是目标驱动开发的合理分工。