内容
# ABAP 模型上下文协议服务器 SDK v2 (`mcp2`)
ABAP [模型上下文协议](https://modelcontextprotocol.io/) 服务器 SDK 的无状态重写,针对即将到来的 **`2026-07-28`** 协议版本,同时保持与旧版本(`2025-03-26` … `2025-11-25`)的向下兼容。
> MCP `2026-07-28` 草案同步请求/响应配置文件。SSE、订阅、流式响应、会话和服务器推送通知均不受支持。
> 旧版本以无状态方式提供,具有最新的旧数据结构。
这是一个 **服务器** 实现。它是 **无状态** 的——没有协议会话,没有 SSE——因此基于通知和订阅的功能由于设计原因不在范围内(参见 [docs/ProtocolSupport.md](docs/ProtocolSupport.md))。
> **状态:** `0.1.0` —第一个测试版([更新日志](CHANGELOG.md))。预发布:ABAP API 接口尚未冻结,在 `1.0.0` 之前可能会有破坏性更改。
> 适用于无状态 `2026-07-28` 协议版本的活跃 v2 实现。
> 协议核心、数据类、HTTP 运行时、配置/工厂、DDIC 表、演示服务器和请求/响应任务扩展均已实现,并由 abaplint 和外部 Jest 集成套件在 sibling `mcp2_tests` 仓库中覆盖。
>原始基于会话的 SDK 单独存在且不受影响;此包使用不同的 `mcp2` 对象前缀,以便两者可以在一个 ABAP 系统中共存。
## 与 V1 MCP SDK 的主要区别
- 目前没有 7.x 下移植版本 - 计划在规范发布后一个月内添加
- 没有会话等
- 没有默认身份验证对象和检查 --> 如果需要,您 **必须** 实现自己的身份验证检查,参见 [配置和安全](docs/ConfigurationAndSecurity.md)
- 由于频繁的安装问题,没有表维护
## 故意不支持的功能
- ABAP 云 - 随着 SAP 推动在 BTP 中使用他们的 MCP 战略和功能,我认为没有理由付出所需的努力
## 文档
**用户指南** — 使用 SDK 构建服务器:
- [快速入门](docs/GettingStarted.md) — 安装、ICF 设置、第一个服务器
- [学习路径](docs/LearningPath.md) — 从第一个工具到 MRTR 和任务的分阶段练习
- [演示服务器](docs/DemoServers.md) — 功能映射和旧版/现代演练
- [服务器身份和请求上下文](docs/ServerContext.md) — 元数据、功能、跟踪、缓存
- [工具](docs/Tools.md) — 参数、内容块、结构化输出、验证
- [资源](docs/Resources.md) — 资源、读取、模板
- [提示](docs/Prompts.md) — 提示模板和参数
- [补全](docs/Completions.md) — 参数自动补全
- [模式](docs/Schemas.md) — 模式构建器(通用/DDIC/诱导)+ 验证器
- [输入必填(MRTR)](docs/InputRequired.md) — 诱导、采样、URL 模式
- [任务](docs/Tasks.md) — 长时间运行的后台工作
- [配置和安全](docs/ConfigurationAndSecurity.md) — 表、 CORS、身份验证、错误映射
- [故障排除](docs/Troubleshooting.md) — 常见故障的症状优先索引
- [从 v1 迁移](docs/MigrationV1.md) — 更改内容、删除内容、建议顺序
**参考** — 设计和内部:
- [类参考](docs/Reference.md) — 每个公共类、用途、解释位置
- [架构](docs/Architecture.md) — 设计、包、时代、请求流
- [协议支持](docs/ProtocolSupport.md) — 版本、方法、排除项及原因
- [转换](docs/Conversion.md) — 每字段数据类转换约定
- [平台抽象](docs/PlatformAbstraction.md) — HTTP/DDIC 包装和 ABAP 云路线图
## 设计概览
- **仅无状态** — 每个请求都是自包含的;没有 `Mcp-Session-Id`,没有会话表。
- **一个服务器契约,两个协议时代** — 旧版 `initialize` 和现代每请求 `_meta` 协商,由同一个 `zif_mcp2_server` 提供服务。
- **类型化创作表面** — 常见的服务器创作路径不需要手写的 JSON:类型化请求获取器(`require_arg_string`、`get_arg_string_or`、`bind_arguments`)、类型化响应工厂(`zcl_mcp2_resp_call_tool=>text`、`=>error_text`、`=>structured_data`)和完全控制的构建器(`add_resource`、`add_resource_link`、`set_structured_data`)带有类型化内容注释(`zif_mcp2_content`)、流畅的模式构建器(`zcl_mcp2_schema_builder` 用于工具模式、`zcl_mcp2_elicit_schema` 用于平面诱导表单)和类型化输入请求构建器(`zcl_mcp2_input_elicitation`、`zcl_mcp2_input_sampling`)由 `zif_mcp2_input_request` 统一。UI 图标在规范允许的每个地方都是类型化的:服务器信息(`get_icons`)、工具、提示、资源、资源模板和资源链接(`zif_mcp2_content=>icons`)。预构建的 ajson 仍然是丰富提示内容和自定义扩展的逃生阀。
- **工具目录基类** — 从 `zcl_mcp2_tool_server_base` 继承,声明 `define_tools( )` 一次,并实现 `call_tool( )`。基类派生 `supports_tools`、`tools/list`、`get_tool_schema`、未知工具拒绝和默认模式验证从目录。广告模式违规作为 `isError` 工具结果返回在两个时代;结构不良的调用和未知工具仍然是 `-32602`。
- **时代感知能力检查** 在基类上 — `client_supports_elicitation`、`client_supports_elicit_url`、`client_supports_sampling`、`client_supports_tasks`(现代:声明的扩展;旧版:每请求 `params.task` 选择加入)、`era_is_modern`、`get_protocol_version`,以及 `can_request_input` / `input_required` 用于 MRTR,让作者安全地门控时代和客户端依赖功能,而不是击中框架 `-32021`/`-32600`。SEP-2577 在 `2026-07-28` 中废弃的功能中,根和日志记录未实现;采样被保留(作为 MRTR 输入构建器),因为它是 ABAP 中唯一无密钥的 LLM 访问路径。
- **请求上下文,无需 `_meta` 解析** — 客户端身份、协商协议、日志级别提示和 W3C 跟踪上下文可通过类型化的基类获取器获得。
- **`serverInfo` 在现代时代被写入两次 — 故意。** `2026-07-28` 草案于 2026-07-16 将 `serverInfo` 移出顶级结果并移入 `_meta["io.modelcontextprotocol/serverInfo"]`(`ResultMetaObject` 形状),因此 SDK 在 **每个** 现代结果中都发出它。它 *还* 在 `server/discover` 上写入被取代的顶级字段,因为每个已发布的 TypeScript v2 SDK 版本(通过 `2.0.0-beta.4`)都捆绑了一个需要它的 `DiscoverResultSchema` — 省略它,SDK 的自己的 `client.connect()` 版本协商探测会将服务器错误地分类为非现代,默默地将真正的客户端降级到旧时代。在发布 SDK 读取 `_meta` 之前([详细信息](docs/ProtocolSupport.md#caching--discovery)),写入两者会带来几字节并使 SDK 正确地对抗规范 *和* 可供今天存在的客户端使用。顶级写入计划在以后删除。旧版 `initialize` 不受影响:`serverInfo` 仍然是一个普通的顶级字段。
- **数据类中的转换** — 显式每字段 JSON↔ABAP;仅中央代码用于 JSON-RPC 信封和现代结果戳。
## 目标/工具
- ABAP **7.5x** 经典(第一个迭代)。abaplint `v752`。
- 计划在测试阶段后添加 ABAP 7.4x 下移植版本,不计划支持云就绪。
- 通过 [abapGit](https://github.com/abapGit/abapGit) 分发。
## 使用的 ABAP 开源项目
- [ajson](https://github.com/sbcgua/ajson) — JSON 库,作为 `zmcp2_ajson` 捆绑(MIT)。
- [abaplint](https://github.com/abaplint/abaplint) — linting 和基于转换器的单元测试。
- [abapGit](https://github.com/abapGit/abapGit) — 源代码控制。
更多精彩的 ABAP 项目,请访问 [dotabap.org](https://dotabap.org/)。
## 开发检查
- 静态检查:`npm install` 一次,然后运行 `npm run lint`(abaplint,配置在 [abaplint.json](abaplint.json) 中)。
- 行为:位于 sibling `mcp2_tests` 仓库中的 Jest 集成套件,在提供 SDK 及其测试服务器的 ABAP 系统上运行。它涵盖了参考 TypeScript SDK 和原始 HTTP 线检查的两个协议时代。
- ABAP 单元测试在 ABAP 系统中运行(SE80/ADT);基于转换器的本地运行仅覆盖子集(无数据库,捆绑的 ajson unicode 测试被排除)。
## 许可证
MIT。捆绑的依赖项保留其原始许可证;请参见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。