This is an automated email from the ASF dual-hosted git repository.
terrymanu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 72f436c6ea6 Remove obsolete documentation checks (#38743)
72f436c6ea6 is described below
commit 72f436c6ea6637fb9f8648265c62c745041b61a0
Author: Liang Zhang <[email protected]>
AuthorDate: Thu May 28 14:03:20 2026 +0800
Remove obsolete documentation checks (#38743)
* Remove obsolete documentation checks
Remove the standalone docs/mcp design documents and the bootstrap
documentation string test that depended on them. README content is not
treated
as a unit-test contract.
Keep the machine-consumed MCP Registry metadata validation in mcp/registry
by
checking environment variable shape for required, format, and secret fields.
* Remove obsolete documentation checks
Remove the standalone docs/mcp design documents and the bootstrap
documentation string test that depended on them. README content is not
treated
as a unit-test contract.
Keep the machine-consumed MCP Registry metadata validation in mcp/registry
by
checking environment variable shape for required, format, and secret fields.
* Remove obsolete documentation checks
Remove the standalone docs/mcp design documents and the bootstrap
documentation string test that depended on them. README content is not
treated
as a unit-test contract.
Keep the machine-consumed MCP Registry metadata validation in mcp/registry
by
checking environment variable shape for required, format, and secret fields.
---
docs/mcp/ShardingSphere-MCP-Detailed-Design.md | 699 -----------------
docs/mcp/ShardingSphere-MCP-PRD.md | 562 --------------
docs/mcp/ShardingSphere-MCP-Technical-Design.md | 854 ---------------------
.../bootstrap/MCPDocumentationContractTest.java | 120 ---
.../mcp/registry/MCPRegistryMetadataCommand.java | 13 +-
.../registry/MCPRegistryMetadataCommandTest.java | 37 +
6 files changed, 47 insertions(+), 2238 deletions(-)
diff --git a/docs/mcp/ShardingSphere-MCP-Detailed-Design.md
b/docs/mcp/ShardingSphere-MCP-Detailed-Design.md
deleted file mode 100644
index e660e464e53..00000000000
--- a/docs/mcp/ShardingSphere-MCP-Detailed-Design.md
+++ /dev/null
@@ -1,699 +0,0 @@
-# ShardingSphere MCP 详细设计说明书
-
-> 状态说明:本文档保留早期详细设计背景,不是当前 MCP public surface 契约。
-> 当前契约以 `shardingsphere://capabilities`、descriptor、`mcp/README.md` 和
`mcp/README_ZH.md` 为准。
-> 不要从本文档推导 `list_databases`、`describe_table` 等早期工具矩阵。
-> 当前可提交范围是 MCP V1 runtime readiness,不是完整 ShardingSphere governance
administration surface。
-
-## 1. 文档信息
-- 文档名称:ShardingSphere MCP 详细设计说明书
-- 文档版本:最终版
-- 文档类型:Detailed Design
-- 状态:可进入编码实现
-- 适用范围:ShardingSphere MCP V1
-
-## 2. 文档目标
-- 本文档用于将前面的 PRD 和技术设计方案落到实现级别。
- 目标是让 MCP 子系统能够直接进入开发,避免在实现过程中因为模块结构、协议契约、测试落位或构建链不明确而返工。
-- 本文档重点回答:
- - 代码模块如何组织
- - Maven / 模块 / JDK 21 子链路如何落地
- - MCP Streamable HTTP 如何实现
- - Session / transaction / savepoint 如何维护
- - capability / transaction matrix 如何建模
- - 配置如何组织
- - 单测、集成测试、E2E 如何落地
- - distribution 如何发布
-
-## 3. 已知输入与约束
-
-### 3.1 仓库现状
-- 当前仓库结构与基础约束如下:
- - 根工程模块链见 `pom.xml`(line 33)
- - 根工程 Java 基线为 8,`pom.xml`(line 55)
- - 根工程当前 Jackson 版本为 2.16.1,`pom.xml`(line 93)
- - 根 distribution 聚合结构见 `distribution/pom.xml`(line 30)
- - 根 test 聚合结构见 `test/pom.xml`(line 30)
- - `test/e2e` 聚合结构见 `test/e2e/pom.xml`(line 30)
-
-### 3.2 协议与运行时约束
-- 截至 2026-03-21,当前实现与协议基线如下:
- - MCP 当前标准 HTTP transport 为 Streamable HTTP
- - 当前协议版本基线为 `2025-11-25`
- - 仓库内实现采用 JDK 21 编译的自管 runtime
- - 远程 HTTP listener 由 `mcp/bootstrap` 局部引入的 embedded Tomcat 与 MCP Java SDK
servlet transport 承载
- - SDK 侧 JSON 绑定继续服从根工程 Jackson `2.16.1`
-- 来源:
- - 本仓库实现
- - MCP Transports 2025-11-25
-
-### 3.3 当前设计边界
-- 本说明书固定以下前提:
- - MCP 放在主仓库内
- - 代码模块位于根目录 `mcp/`
- - 发布模块位于根目录 `distribution/mcp`
- - E2E 模块位于 `test/e2e/mcp`
- - 不引入 Spring AI
- - 不推动全仓升级 JDK 21
- - 不实现分布式会话存储
- - 不实现事务态无损 failover
-
-## 4. 总体实现结论
-- V1 的最终实现结构如下:
-
-```text
-shardingsphere
-├── mcp
-│ ├── pom.xml
-│ ├── core
-│ └── bootstrap
-├── distribution
-│ └── mcp
-├── test
-│ └── e2e
-│ └── mcp
-└── pom.xml
-```
-
-- 三条子链路职责分别为:
- - `mcp`
- - 实现 MCP 运行时代码
- - `distribution/mcp`
- - 产出 `shardingsphere-mcp-distribution`
- - `test/e2e/mcp`
- - 承担 MCP 端到端验证
-- 这三条链路直接进入常规 Maven reactor 模块,不再通过独立 `mcp` profile 挂载。
-
-## 5. Maven 与模块落地设计
-
-### 5.1 artifact 命名
-- 建议固定为:
- - `shardingsphere-mcp`
- - `shardingsphere-mcp-core`
- - `shardingsphere-mcp-bootstrap`
- - `shardingsphere-mcp-distribution`
- - `shardingsphere-test-e2e-mcp`
-
-### 5.2 parent 关系
-- 建议:
- - `mcp/pom.xml`
- - `parent`:`org.apache.shardingsphere:shardingsphere`
- - `packaging`:`pom`
- - `modules`:
- - `features`
- - `core`
- - `bootstrap`
- - `distribution/mcp/pom.xml`
- - `parent`:`org.apache.shardingsphere:shardingsphere-distribution`
- - `packaging`:`pom`
- - `test/e2e/mcp/pom.xml`
- - `parent`:`org.apache.shardingsphere:shardingsphere-test-e2e`
- - `packaging`:`jar`
-- 这样可以同时保证:
- - 版本与主仓库统一
- - distribution 与 test 的聚合逻辑一致
- - 模块边界清晰
- - 测试夹具按模块本地收敛,避免额外 reactor 模块
-
-### 5.3 模块接入方式
-- 这是整个实现里最关键的结构性设计。
-
-#### 根 `pom.xml`
-- 在默认 `<modules>` 内引入 `<module>mcp</module>`
-
-#### `distribution/pom.xml`
-- 在默认 `<modules>` 内引入 `<module>mcp</module>`
-
-#### `test/e2e/pom.xml`
-- 在默认 `<modules>` 内引入 `<module>mcp</module>`
-
-#### 最终效果
-- 默认构建:包含 MCP
-- MCP 构建:直接走常规 Maven reactor
-- 这样可以保持:
- - `mcp`、`distribution/mcp`、`test/e2e/mcp` 与 JDBC、Proxy、agent 一致
- - 打包与 E2E 不依赖额外 profile
- - Java 21 设置仍局部收敛在 MCP 子模块
-
-### 5.4 JDK 21 隔离策略
-- 建议:
- - `mcp/pom.xml` 内局部声明 `maven.compiler.release=21`
- - 使用 Maven Toolchains
- - JDK 21 子链路 CI lane 固定 JDK 21
-- 禁止:
- - 将 Java 21 相关设置扩散到根工程统一配置
- - 将额外 HTTP 容器或 MCP SDK 依赖写入根工程统一依赖管理
- - 让 MCP Java SDK 类型进入 `mcp/core`
-
-## 6. 包结构设计
-
-### 6.1 `mcp/core`
-- 推荐根包:
- - `org.apache.shardingsphere.mcp`
-- 推荐子包:
- - `protocol`
- - `resource`
- - `tool`
- - `capability`
- - `session`
- - `metadata`
- - `execute`
- - `trace`
- - `config`
- - `common`
-- 说明:
- - `protocol`
- - 协议对象与 DTO
- - transport-neutral payload builder
- - `resource`
- - resource 映射、读取与 URI 解析
- - `tool`
- - tool catalog、参数归一化与 dispatcher
- - `capability`
- - capability matrix / assembler
- - `session`
- - session / tx / savepoint 管理
- - transport-independent session lifecycle cleanup
- - `metadata`
- - metadata discovery facade
- - JDBC metadata discovery and runtime configuration
- - `execute`
- - SQL tool facade
- - `DatabaseRuntime` assembly and JDBC-backed runtime context factory
- - `trace`
- - SQL execution trace facade
- - `config`
- - MCP 内部配置模型
- - `common`
- - 公共常量、枚举、异常
-
-### 6.2 `mcp/bootstrap`
-- 推荐子包:
- - `transport.http`
- - `transport.stdio`
- - `server`
- - `wiring`
- - `config`
- - `lifecycle`
-- 设计原则:
- - core 不依赖 bootstrap
- - bootstrap 依赖 core
- - transport 细节不进入 core
- - bootstrap 只保留 MCP Java SDK / Tomcat / servlet / stdio adapter
- - tool input schema 与 SDK `Tool` / `Resource` 注册留在 bootstrap
-
-## 7. 协议与 Transport 详细设计
-
-### 7.1 HTTP transport 固定为 Streamable HTTP
-- V1 的 HTTP transport 固定为:
- - MCP Streamable HTTP
- - 协议版本基线:`2025-11-25`
-- 这意味着不再使用模糊表述“HTTP 模式”,而是明确遵守当前 MCP 标准 transport。
-- transport implementation seam 上,routing、SDK session 与
- `DELETE` 基础语义优先复用官方 servlet provider;ShardingSphere 只补协议头、
- follow-up contract、managed session cleanup、本地运行边界策略、
- 内部 Origin 校验与必要兼容层。
-
-### 7.2 MCP endpoint
-- V1 使用单一 MCP endpoint,例如:
- - `/mcp`
-- 该 endpoint 必须支持:
- - `POST`
- - `GET`
- - `DELETE`
-
-#### `POST /mcp`
-- 用途:
- - 初始化 HTTP session
- - 处理 session 绑定后的 JSON-RPC follow-up 请求
-- 规则:
- - 缺少 `MCP-Session-Id` 时创建新会话
- - 初始化成功后返回 `MCP-Session-Id` 与协商后的 `MCP-Protocol-Version`
- - 带 `MCP-Session-Id` 的 follow-up `POST` 负责承载
`tools/list`、`tools/call`、`resources/list` 与 `resources/read`
- - follow-up `POST` 必须先完成 transport admission check,
- 再完成协议版本与 session 校验,最后进入 tool / resource dispatch
-
-#### `GET /mcp`
-- 用途:
- - 满足 Streamable HTTP 规范
- - 支持服务端到客户端的 SSE 流
-- V1 说明:
- - MCP 业务功能本身不依赖 server push
- - 但服务端仍提供 GET 能力,以满足 transport 规范与 future-proofing
-
-#### `DELETE /mcp`
-- 用途:
- - 客户端显式终止 MCP session
-- V1 设计选择:
- - 实现 DELETE
- - 不使用 405 作为默认行为
-- 原因:
- - 本设计是 stateful session 模型
- - 显式关闭会话有利于及时释放事务与会话资源
-
-### 7.3 会话头与版本头
-- V1 固定使用当前协议定义的头:
- - `MCP-Session-Id`
- - `MCP-Protocol-Version`
-- 规则:
- 1. 初始化成功后,服务端在 `InitializeResult` 对应 HTTP 响应头中返回 `MCP-Session-Id`
- 2. 后续 HTTP 请求必须带 `MCP-Session-Id`
- 3. 后续 HTTP 请求应带 `MCP-Protocol-Version`
- 4. 若请求缺少必须的 session id,返回 `400 Bad Request`
- 5. 若 session 已终止或不存在,返回 `404 Not Found`
-
-### 7.4 协议版本处理
-- V1 采用如下策略:
- - 服务端协议基线固定为 `2025-11-25`
- - 初始化阶段记录协商结果
- - 后续请求:
- - 若 header 存在,必须与会话协商版本一致
- - 若 header 缺失但 session 存在,服务端允许回退到会话协商版本并记录警告日志
- - 若既无 header 又无 session,上游请求视为不合法并返回 `400`
-- 这样既符合协议,也避免过度脆弱。
-
-### 7.5 本地模式运行边界
-- 根据 transport 规范,V1 要求:
- - 本地模式默认仅绑定 `127.0.0.1`
- - 若本地模式请求显式携带 `Origin`,服务端校验其 host 必须仍为 loopback / localhost
- - 当前内置 HTTP runtime 不提供授权
- - 远程模式仍应由外部网关、反向代理或网络边界提供保护
-- 上述 `Origin` 校验由 ShardingSphere 独立本地策略类在 servlet 前置阶段执行;
- delegate 不再重复执行同一规则。ShardingSphere 继续保留零损失兼容输出与
- session 语义 glue。
-- 以上约束用于限定本地运行边界,与 MCP session 语义分层处理。
-
-## 8. 会话、事务与 Savepoint 详细设计
-
-### 8.1 Session 状态
-- 定义 Session 状态:
- - `NEW`
- - `ACTIVE`
- - `IN_TRANSACTION`
- - `CLOSED`
- - `EXPIRED`
-
-### 8.2 Transaction 状态
-- 定义事务状态:
- - `NONE`
- - `ACTIVE`
- - `ROLLBACK_ONLY`
- - `FINISHED`
-
-### 8.3 Savepoint 前置条件
-- 只有同时满足以下条件,savepoint 才可用:
- - 当前 database capability `supportsSavepoint = true`
- - 当前事务状态为 `ACTIVE`
-- 否则:
- - 返回 `unsupported`
- - 或 `transaction_state_error`
-
-### 8.4 状态流转
-```mermaid
-stateDiagram-v2
- [*] --> NEW
- NEW --> ACTIVE: Initialize Success
- ACTIVE --> IN_TRANSACTION: BEGIN / START TRANSACTION
- IN_TRANSACTION --> ACTIVE: COMMIT / ROLLBACK
- ACTIVE --> CLOSED: DELETE / Session Close
- IN_TRANSACTION --> CLOSED: Disconnect with rollback
- ACTIVE --> EXPIRED: Idle timeout
- IN_TRANSACTION --> EXPIRED: Timeout with rollback
-```
-
-### 8.5 Timeout 设计
-- 分两类:
- - session idle timeout
- - transaction timeout
-- 规则:
- - session idle timeout 到期:
- - session 转为 `EXPIRED`
- - transaction timeout 到期:
- - 当前事务自动回滚
- - 会话转为 `ACTIVE` 或 `EXPIRED`
- - 后续针对旧事务上下文的操作返回 `transaction_state_error`
-
-### 8.6 故障语义
-- V1 采用:
- - sticky session
- - 本地内存 session store
-- 因此,节点故障语义必须明确:
- - 节点故障或重启时,本节点上的 session 丢失
- - 活动事务不做跨节点恢复
- - 未提交事务视为失败并回滚
- - 客户端需重新初始化 session
-- V1 不支持:
- - distributed session store
- - 无粘性路由事务恢复
- - savepoint 栈的跨节点恢复
-
-## 9. capability / transaction matrix 详细设计
-
-### 9.1 数据来源
-
-#### capability 来源
-- 由三层叠加得到:
- 1. 静态矩阵
- 2. 运行时 metadata
- 3. 部署时覆盖
-
-### 9.2 transaction matrix 存储方式
-- V1 推荐:
- - Java 强类型注册表
-- 不优先用 YAML / JSON 作为首版事实源。
-- 理由:
- - 更稳定
- - 更容易测试
- - 不容易被错误配置污染
- - 更适合作为 capability 默认事实源
-
-### 9.3 transaction matrix 字段
-- 至少包含:
- - `databaseType`
- - `supportsTransactionControl`
- - `supportsSavepoint`
- - `supportedObjectTypes`
- - `supportedStatementClasses`
- - `supportsExplainAnalyze`
-
-### 9.4 capability 组装顺序
-- 固定组装顺序:
- 1. 读取静态矩阵
- 2. 读取运行时 metadata
- 3. 应用部署时覆盖项
- 4. 生成数据库级 capability
-
-## 10. SQL tool 详细设计
-
-> 本节保留早期 `execute_query` 术语。
-> 当前 MCP public surface 将读查询与变更执行拆分为 `database_gateway_execute_query` 和
`database_gateway_execute_update`。
-
-### 10.1 职责
-- 当前 SQL tool facade 负责:
- - 单语句校验
- - statement class 归类
- - request-level schema semantics 解释
- - capability 校验
- - session / transaction 校验
- - 调用 ShardingSphere parse / route / execute
- - 统一结果映射
- - 统一错误映射
- - SQL execution trace 输出
-
-### 10.2 执行阶段
-- 内部固定为 7 个阶段:
- 1. request validation
- 2. statement classification
- 3. session validation
- 4. capability validation
- 5. kernel execution
- 6. result / error mapping
-
-### 10.2A `database` / `schema` 边界
-- `database` 是当前 SQL tools 的唯一强执行边界。
-- `schema` 是可选 namespace hint,用于表达未限定对象名的目标命名空间意图。
-- 当数据库级 capability `schema_execution_semantics = fixed_to_database` 时,
- request-level `schema` 不被承诺为独立执行命名空间切换器。
-- 当数据库级 capability `schema_execution_semantics = best_effort` 时,
- runtime 可以尝试应用 request-level `schema`,但不对外宣传 strict guarantee。
-- SQL 自身显式限定名优先于 request-level `schema`。
-
-### 10.3 Statement Class
-- 统一按以下维度治理:
- - `select`
- - `dml`
- - `ddl`
- - `dcl`
- - `transaction_control`
- - `savepoint`
- - `explain_analyze`
-- `WITH` 只表示 CTE 写法,不单独形成产品 statement class。
-- `statement class` 用于 capability、SQL execution trace 和执行分支。
-- `statement type` 用于表达更具体的用户可读动作,如 `SELECT`、`UPDATE`、`MERGE`。
-
-### 10.4 统一结果
-- 仅允许三类:
- - `result_set`
- - `update_count`
- - `statement_ack`
-- 每个成功结果都携带:
- - `statement_class`
- - `statement_type`
- - `status`
- - `truncated`
-- `result_kind` 只表达返回形状,不表达副作用等级。
-- data-modifying CTE 可被表达为 `statement_class = dml` 且 `result_kind =
result_set`。
-
-### 10.5 错误映射
-- 底层异常不得直接透传。
-- 统一映射为:
- - `invalid_request`
- - `not_found`
- - `unsupported`
- - `conflict`
- - `unavailable`
- - `transaction_state_error`
- - `query_failed`
-
-## 11. 配置设计
-
-### 11.1 配置文件
-- distribution 建议提供:
- - `conf/mcp-http.yaml`
- - `conf/mcp-stdio.yaml`
- - `conf/logback.xml`
-
-### 11.2 `mcp-http.yaml` 分层
-- 建议包含以下一级段:
- - `transport`
- - `runtimeDatabases`
-
-### 11.3 配置职责
-
-#### `transport`
-- `type`
-- `http.bindHost`
-- `http.port`
-- `http.endpointPath`
-- `type` 是唯一 transport 选择器,取值为 `STREAMABLE_HTTP` 或 `STDIO`
-- `http` 子配置仅在 `type: STREAMABLE_HTTP` 时有效;`type: STDIO` 时不携带 HTTP listener 字段
-- HTTP listener 字段可省略,默认值为 `127.0.0.1`、`18088` 与 `/mcp`
-- HTTP transport 固定使用 MCP `2025-11-25` 协议基线,不作为外部配置项暴露
-- distribution 提供 HTTP 与 STDIO 两份显式配置模板;STDIO 仍主要用于本地测试与进程内联调,不作为额外交互式文本 Shell
-
-#### `runtimeDatabases`
-- canonical logical database mapping
- - `databaseType`
- - `jdbcUrl`
- - `username`
- - `password`
- - `driverClassName`
-- schema 采用 strict mapping
- - unknown key 直接报错
- - `runtime.*` alias 不再作为专门迁移分支保留
- - per-database capability booleans 不再接受为 operator-facing 配置
-- distribution 默认配置提供一段 demo JDBC runtime,确保发行包第一次启动即可验证非空 metadata
与真实执行链路;真实部署需替换为目标环境配置
-
-## 12. 运行边界与 SQL Execution Trace 详细设计
-
-### 12.1 运行边界
-- V1 内置 runtime 聚焦 session 协商、会话状态维护与运行边界校验。
-- follow-up production runtime 路径要求通过 `runtimeDatabases` 显式装配真实 metadata
与执行适配,不再允许空 runtime 作为成功启动兜底。
-- HTTP 端点如需对外暴露,应放在受信网络、上游网关、反向代理或其他网络边界之后。
-
-### 12.2 SQL execution trace 模型
-- V1 只生成当前 SQL 执行路径的本地 trace 摘要,不承诺持久化合规日志或全量 MCP 活动记录。
-- 统一输出:
- - sessionId
- - database
- - statementClass
- - statementDigest
- - successOrFailure
- - errorCode
- - transactionMarker
- - timestamp
-
-## 13. 测试设计
-
-### 13.1 测试分层
-- V1 测试分 4 层:
- 1. 单元测试
- 2. 模块集成测试
- 3. 协议联调测试
- 4. E2E 测试
-
-### 13.2 单元测试重点
-- 重点覆盖:
- - capability assembler
- - transaction matrix registry
- - session manager
- - SQL tool facade
- - error mapper
-
-### 13.3 模块集成测试重点
-- 重点覆盖:
- - `/mcp` endpoint 行为
- - `MCP-Protocol-Version`
- - `MCP-Session-Id`
- - `transaction/savepoint` 状态流转
- - `DELETE /mcp`
-
-### 13.4 E2E 模块落位
-- 建议新增:
- - `test/e2e/mcp`
-- `artifactId`:
- - `shardingsphere-test-e2e-mcp`
-- `parent`:
- - `shardingsphere-test-e2e`
-- 不放在:
- - `test/e2e/operation/mcp`
-- 原因:
- - MCP 是新的接入面,不是 operation 子类型
- - `test/e2e/pom.xml` 的顶层聚合更适合把 MCP 作为一级测试模块承载
-
-### 13.5 E2E 模块接入约束
-- 和代码、distribution 一样,`test/e2e/mcp` 直接进入默认 `test/e2e` 模块链。
-- 也就是说:
- - `test/e2e/pom.xml` 默认 `<modules>` 直接加入 `<module>mcp</module>`
- - JDK 21 要求通过 MCP 子模块局部配置和 JDK 21 子链路 CI 兜底
-- 这样 E2E 与代码、distribution 的聚合方式保持一致,不再依赖额外 profile。
-
-### 13.6 E2E 依赖
-- `test/e2e/mcp` 直接依赖建议包括:
- - `shardingsphere-mcp-core`
- - `shardingsphere-mcp-bootstrap`
- - `shardingsphere-test-e2e-env`
- - `shardingsphere-test-e2e-fixture`
-- 必要时补充:
- - HTTP 客户端依赖
- - 数据库驱动依赖
-
-### 13.7 E2E 最小覆盖矩阵
-- A. 事务 + savepoint 组
- - MySQL
- - PostgreSQL
- - openGauss
-- B. 事务但不支持 savepoint 组
- - Doris
- - Presto
-- C. 不支持事务控制组
- - Hive
- - ClickHouse
-- D. optional object 组
- - 一个支持 index
- - 一个不支持 index
-- E. capability 组
- - capability 与矩阵一致
-
-### 13.8 历史 E2E 最小冒烟场景(非当前门禁)
-
-> 本节保留早期 tool matrix。
-> 当前 submit-ready E2E 门禁以
`tools/list`、`resources/read`、`database_gateway_search_metadata`、SQL tool
pair、workflow tools、HTTP 和 STDIO runtime 为准。
-- 至少固定以下 12 个场景:
- 1. 服务级 capability
- 2. 数据库级 capability
- 3. `list_databases`
- 4. `list_schemas`
- 5. `list_tables / search_metadata`
- 6. `describe_table`
- 7. `execute_query(SELECT)`
- 8. `execute_query(DML)`
- 9. `BEGIN / COMMIT / ROLLBACK`
- 10. `SAVEPOINT` 成功场景
- 11. `SAVEPOINT unsupported` 场景
- 12. `DELETE close / invalid session` 场景
-
-## 14. distribution 详细设计
-
-### 14.1 `distribution/mcp` 依赖关系
-- `distribution/mcp` 直接依赖:
- - `shardingsphere-mcp-bootstrap`
-- 运行时依赖分类建议参考 `distribution/proxy` 与 `distribution/jdbc`:
- - mode repositories
- - parser / runtime dialect support
- - JDBC drivers
- - logging
-
-### 14.2 目录结构
-- 建议产出:
-
-```text
-apache-shardingsphere-mcp-<version>/
-├── bin/
-├── conf/
-├── lib/
-├── logs/
-└── LICENSE / NOTICE / README.md
-```
-
-### 14.3 启动脚本
-- 建议至少提供:
- - `bin/start.sh`
-
-### 14.4 容器化
-- 当前 V1 建议提供:
- - Dockerfile
- - 配置挂载约定
-- 健康检查可作为后续运行时增强项追加,不阻塞当前打包与 smoke。
-
-## 15. 实施顺序
-- 建议实现顺序固定如下:
- 1. Maven / 模块 / toolchain 结构
- 2. `mcp/core` 公共模型与 transaction matrix
- 3. `mcp/core` 的 capability / error / session
- 4. `mcp/bootstrap` 的 HTTP / STDIO transport
- 5. `/mcp` 的 Streamable HTTP endpoint
- 6. SQL tool pair 与 metadata discovery
- 7. `distribution/mcp`
- 8. 单元测试
- 9. 模块集成测试
- 10. `test/e2e/mcp`
-
-## 16. 开工前检查清单
-- 开始写代码前必须全部满足:
- - `mcp` 与 `distribution/mcp` 的模块接入方式已定
- - `test/e2e/mcp` 的模块落位已定
- - JDK 21 Toolchains 已定
- - Streamable HTTP 版本已固定为 `2025-11-25`
- - `MCP-Session-Id / MCP-Protocol-Version` 行为已定
- - `DELETE /mcp` 会话关闭行为已定
- - SDK provider 与 ShardingSphere glue 的职责边界已定
- - transaction matrix 存储方式已定
- - capability / SQL tool 输入输出边界已定
-
-### 16.1 AI-Friendly 增量开工前重新取证
-
-AI-Friendly 轻量体验增量进入实现前,应先从当前代码重新确认以下事实。
-这些是实现取证点,不是需要反复向需求方澄清的问题。
-
-- 当前 MCP public surface:以 descriptor、capabilities 和 README 为准核对
tool、resource、prompt、completion 与 navigation。
-- `execute_update` preview 返回结构:先检查现有 handler 和测试,再决定补充字段或统一命名。
-- workflow preview guidance:确认 `apply_workflow` 是否能与 SQL preview 复用同一套轻量
`next_actions` 词汇。
-- 错误恢复现状:检查 missing database、missing execution mode、wrong SQL tool、unknown
tool/resource 和旧 `plan_id`。
-- descriptor lint 落点:优先复用 descriptor loader 或 support 层测试,不新增复杂 lint 框架。
-- capabilities contract test:只验证 section 和 shape,不锁定大段运行时 snapshot。
-- 历史文档状态:只标注会误导当前实现契约的旧设计说明,不批量重写历史文档。
-
-### 16.2 AI-Friendly 增量不重新打开的决策
-
-除非需求方明确改变范围,以下决策不重新打开。
-
-- 不切换或创建 git 分支。
-- 不引入 heavy planner、vector memory、跨会话长期记忆或完整 auth platform。
-- 保持 resource-first 作为当前 MCP surface 的主要发现路径。
-- 先完成 P0/P1 的模型困惑和操作风险收敛,再处理 P2 便利性增强。
-- `mcp/README.md` 与 `mcp/README_ZH.md` 的当前 public surface 说明同步。
-- 真实 LLM E2E 保持 opt-in,不进入默认 CI 门禁。
-
-## 17. 最终结论
-- 这份详细设计说明书的作用,是把前面的 PRD 与技术方案真正推进到“可以开工写代码”的状态。
-- 现在已经明确并固定了:
- - 仓库结构
- - Maven / 模块结构
- - JDK 21 隔离策略
- - Streamable HTTP 协议基线
- - session / transaction / savepoint 模型
- - capability / matrix 设计
- - configuration 结构
- - testing / E2E 落地方式
- - distribution 落地方式
diff --git a/docs/mcp/ShardingSphere-MCP-PRD.md
b/docs/mcp/ShardingSphere-MCP-PRD.md
deleted file mode 100644
index 8fd1eda91bf..00000000000
--- a/docs/mcp/ShardingSphere-MCP-PRD.md
+++ /dev/null
@@ -1,562 +0,0 @@
-# ShardingSphere MCP PRD
-
-> 状态说明:本文档保留早期 PRD 背景,不是当前 MCP public surface 契约。
-> 当前契约以 `shardingsphere://capabilities`、descriptor、`mcp/README.md` 和
`mcp/README_ZH.md` 为准。
-> 不要从本文档推导 `list_*`、`describe_*` 等早期工具矩阵。
-> 当前可提交范围是 MCP V1 runtime readiness:metadata discovery、safe SQL、encrypt/mask
workflow、HTTP/STDIO runtime、distribution 与 E2E infrastructure。
-
-## 文档信息
-- 产品名称:ShardingSphere MCP
-- 文档版本:定稿候选版
-- 文档类型:PRD
-- 当前阶段:需求确认版
-
-## 1. 产品概述
-- ShardingSphere MCP 是面向大模型、Agent 和 AI 平台的统一数据库 MCP 入口。
-- 它对上提供统一的数据库访问与 SQL 执行公共面。
-- 它对下屏蔽多种数据库在对象暴露、SQL 执行、结果模型、错误语义和治理边界上的差异。
-
-### 一句话定义
-- 上层只需接入一个 ShardingSphere MCP 服务,即可用一致方式访问多种数据库的结构信息、可用对象范围和 SQL 执行能力。
-
-## 2. 背景与问题
-- 当前数据库接入主要存在以下问题:
-- 不同数据库 MCP 的资源命名、工具定义、返回结构和能力边界不一致。
-- 上层 Agent 需要分别适配多种数据库,接入成本高。
-- 企业希望统一数据库访问的对象暴露、SQL execution trace、超时和结果限制。
-- 即使同样是列库、查结构、执行 SQL,不同数据库的行为、错误和结果表达也不一致。
-- ShardingSphere 具备统一接入多种数据库的能力,因此适合作为统一 MCP 出口。
-
-## 3. 产品目标
-- 统一不同数据库的 MCP 接入方式。
-- 统一数据库对象发现与元数据读取能力。
-- 统一 SQL 执行工具和执行结果模型。
-- 统一错误语义、运行边界和事务语义。
-- 统一能力声明表达。
-- 降低 Agent 对多种数据库 MCP 的适配成本。
-- 让结构变化和 DCL 变化能在分钟级反映到 MCP 出口。
-
-## 4. 非目标
-- 不负责自然语言理解、SQL 自动生成和问答体验。
-- 不抹平所有数据库专有对象和专有语义。
-- 不暴露 ShardingSphere 专有扩展面作为核心公共面。
-- 不兼容第三方数据库 MCP Server 的命名和行为细节。
-- 不支持 `USE`、`SET`、`COPY`、`LOAD`、`CALL`。
-- 不支持各数据库专有高风险元命令。
-
-## 5. 版本范围
-
-### V1 正式支持数据库
-- MySQL
-- PostgreSQL
-- openGauss
-- SQL Server
-- MariaDB
-- Oracle
-- ClickHouse
-- Doris
-- Hive
-- Presto
-- Firebird
-- H2
-
-### V1 不纳入正式验收范围
-- 其他类 SQL 或测试型方言
-
-## 6. 目标用户
-- 大模型 Agent 开发者
-- IDE / CLI 智能助手接入方
-- 企业内部 AI 平台
-- 数据分析 Agent
-- 数据问答 Agent
-- 运维排障 Agent
-- 需要统一接入多种数据库的平台团队
-
-## 7. 典型使用场景
-- Agent 统一发现多个数据库中的可访问对象。
-- Agent 统一读取表结构、字段、视图等元数据。
-- Agent 在不同数据库下使用同一套工具执行 SQL。
-- 平台统一承接 SQL execution trace、超时和结果限制要求。
-- 数据库结构变化后,Agent 在分钟级看到 MCP 资源更新。
-- MCP 会话内通过事务控制语句管理事务边界。
-
-## 8. 产品原则
-- 只做公共面,不做扩展面。
-- 先统一高频对象和高频工具,再扩展长尾能力。
-- 统一调用语义优先于统一底层实现方式。
-- 能统一的能力必须稳定一致,不能统一的能力必须明确标识。
-- 安全保守优先于能力激进。
-- 非 loopback HTTP 暴露必须具备最小接入门槛;
- 当前内置 HTTP runtime 不提供授权,必须由可信网络、网关或反向代理提供接入控制。
-- 所有 V1 公共对象必须有正式承载路径。
-- 所有 V1 正式支持数据库必须满足统一契约。
-- 对原生支持事务控制的数据库,V1 必须统一支持事务控制语义。
-- 对原生支持 `savepoint` 的数据库,V1 必须统一支持 `savepoint` 语义。
-- 对原生不支持事务控制或 `savepoint` 的数据库,必须通过 `capability` 明确声明不支持,并对相关语句统一返回
`unsupported`。
-- V1 不在 MCP runtime 内实现用户身份、角色和细粒度权限语义。
-
-## 9. 统一对象模型
-
-### 9.1 V1 核心统一对象
-- `database`
-- `schema`
-- `table`
-- `view`
-- `column`
-- `capability`
-
-### 9.2 V1 可选公共对象
-- `index`
-
-#### 说明
-- `index` 不是所有正式支持数据库的统一强制基线对象。
-- `index` 是否支持由数据库级 `capability` 的 `supported_object_types` 明确声明。
-
-### 9.3 V1 不统一对象
-- `materialized view`
-- `sequence`
-- `function / procedure`
-- `trigger`
-- `event`
-- `synonym`
-- 数据库专有对象
-
-## 10. 对象语义定义
-- `database`:MCP 对外暴露的一级访问目标,也是每次 SQL 执行必须显式指定的目标。
-- `schema`:`database` 内部命名空间;在当前 SQL tools 中只作为可选 namespace hint,不是第二个强执行边界。
-- `table / view`:通过 `(database, schema, name)` 唯一确定。
-- `column`:从属于某个表或视图。
-- `index`:从属于某个表,仅在当前 `database` 支持时暴露。
-- `capability`:描述服务级或数据库级能力边界的声明对象。
-
-### 统一约束
-- 每次 SQL 执行必须命中一个且仅一个 `database`。
-- V1 不支持跨 `database` SQL 执行。
-- 对没有独立 `schema` 概念的数据库,系统仍需暴露统一 `schema` 语义。
-- 对这类数据库,默认 `schema` 名称与 `database` 名称保持一致。
-- 对这类数据库,公共 `schema` 名称首先服务 MCP 统一 contract;
- 是否可作为独立执行命名空间切换由数据库级 capability 的 `schema_execution_semantics` 决定。
-- 本文中的 `database` 指 ShardingSphere MCP 对外暴露的逻辑数据库标识,不等同于底层物理数据库实例、存储单元或原生
`catalog`。
-
-## 11. V1 公共 Resources
-
-### 正式资源清单
-- `shardingsphere://capabilities`
-- `shardingsphere://databases`
-- `shardingsphere://databases/{database}`
-- `shardingsphere://databases/{database}/capabilities`
-- `shardingsphere://databases/{database}/schemas`
-- `shardingsphere://databases/{database}/schemas/{schema}`
-- `shardingsphere://databases/{database}/schemas/{schema}/tables`
-- `shardingsphere://databases/{database}/schemas/{schema}/views`
-- `shardingsphere://databases/{database}/schemas/{schema}/tables/{table}`
--
`shardingsphere://databases/{database}/schemas/{schema}/tables/{table}/columns`
--
`shardingsphere://databases/{database}/schemas/{schema}/tables/{table}/columns/{column}`
-- `shardingsphere://databases/{database}/schemas/{schema}/views/{view}`
-- `shardingsphere://databases/{database}/schemas/{schema}/views/{view}/columns`
--
`shardingsphere://databases/{database}/schemas/{schema}/views/{view}/columns/{column}`
--
`shardingsphere://databases/{database}/schemas/{schema}/tables/{table}/indexes`
--
`shardingsphere://databases/{database}/schemas/{schema}/tables/{table}/indexes/{index}`
-
-### 资源原则
-- 资源只表达稳定、可读取、可理解的数据库结构和治理信息。
-- 凡列为 V1 公共对象者,必须在 `resources` 和 / 或 `tools` 中有正式承载路径。
-- 当当前 `database` 的 `supported_object_types` 不包含 `index` 时,`index` 相关
`resources` 统一返回 `unsupported`。
-
-## 12. 历史 V1 公共 Tools 设想(非当前契约)
-
-> 本节记录早期 PRD 工具拆分设想。当前 public tools 以 `mcp/README.md`、`mcp/README_ZH.md` 和
descriptors 中的 `database_gateway_*` 工具为准。
-
-### 正式工具清单
-- `list_databases`
-- `list_schemas`
-- `list_tables`
-- `list_views`
-- `list_columns`
-- `list_indexes`
-- `search_metadata`
-- `describe_table`
-- `describe_view`
-- `get_capabilities`
-- `execute_query`
-
-### 工具定义
-- `list_databases`
-- `list_schemas(database)`
-- `list_tables(database, schema, search?)`
-- `list_views(database, schema, search?)`
-- `list_columns(database, schema, object_type, object_name, search?)`
-- `list_indexes(database, schema, table, search?)`
-- `search_metadata(database?, schema?, query, object_types?)`
-- `describe_table(database, schema, table)`
-- `describe_view(database, schema, view)`
-- `get_capabilities(database?)`
-- `execute_query(database, schema?, sql, max_rows?, timeout_ms?)`
-
-### 补充定义
-- `object_type` 取值为 `table` 或 `view`。
-- `execute_query` 每次只允许执行单条 SQL,多语句统一返回 `invalid_request`。
-- `database` 是 `execute_query` 的唯一强边界。
-- `schema` 是可选 namespace hint,用于表达未限定对象名的目标命名空间意图。
-- SQL 已显式包含限定名时,SQL 自身限定关系优先于 request-level `schema`。
-
-#### `search_metadata` 返回项至少应包含
-- `database`
-- `schema`
-- `object_type`
-- `object_name`
-- `parent_object_type`
-- `parent_object_name`
-
-#### 额外约束
-- 对 `table / view`,父对象字段可为空。
-- 对 `column / index`,父对象字段必填。
-- `get_capabilities()` 返回服务级 `capability`。
-- `get_capabilities(database)` 返回数据库级 `capability`。
-- 当当前 `database` 不支持 `index` 时,`list_indexes` 统一返回 `unsupported`。
-
-## 13. 搜索、过滤与收窄
-
-### V1 必须支持
-- 列表查询支持关键字搜索。
-- 大结果通过 `truncated`、`total_count`、`returned_count` 和收窄提示表达。
-- 元数据搜索支持按对象类型过滤。
-- item-list 响应保留 application-level `has_more` 和 `continuation_mode` 字段;当响应支持
ShardingSphere application-level pagination 时才返回 `next_page_token`。
-- 上述 structured payload 字段不是 MCP list 方法的 `cursor` 或 `nextCursor`。
-- 不允许客户端通过完整枚举完成大型数据库结构发现。
-
-### `search_metadata.object_types` 正式支持
-- `database`
-- `schema`
-- `table`
-- `view`
-- `column`
-- `index`
-
-### 补充规则
-- `search_metadata` 在 `database` 省略时,表示在当前 runtime 暴露的所有 `database` 范围内搜索元数据。
-- 该行为不等同于跨 `database` SQL 执行。
-- 当 `schema` 被指定时,`database` 必须同时指定,否则返回 `invalid_request`。
-
-## 14. 历史 SQL 执行能力(非当前契约)
-
-> 本节使用早期 `execute_query` 术语。当前 public tools 使用
`database_gateway_execute_query` 与 `database_gateway_execute_update`。
-
-- SQL 执行通过早期 `execute_query` 设想统一暴露。
-- 每次 SQL 必须显式指定 `database`。
-- V1 不支持跨 `database` SQL 执行。
-- `schema` 不构成第二个强执行边界。
-- 同一 `database` 内的跨 `schema` SQL 可在数据库能力允许时支持。
-- 不支持时必须明确返回 `unsupported`。
-- 事务一旦开始,当前事务绑定单一 `database`。
-- 事务存续期间若 SQL tool 指定其他 `database`,统一返回 `conflict`。
-
-## 15. V1 允许的 SQL 类型
-
-### 允许
-- `SELECT`
-- `WITH ... SELECT`
-- `INSERT`
-- `UPDATE`
-- `DELETE`
-- `MERGE`
-- `TRUNCATE`
-- `CREATE`
-- `ALTER`
-- `DROP`
-- `GRANT`
-- `REVOKE`
-- `EXPLAIN ANALYZE`
-- `BEGIN`
-- `START TRANSACTION`
-- `COMMIT`
-- `ROLLBACK`
-- `SAVEPOINT`
-- `ROLLBACK TO SAVEPOINT`
-- `RELEASE SAVEPOINT`
-
-### 不允许
-- `USE`
-- `SET`
-- `COPY`
-- `LOAD`
-- `CALL`
-- 各数据库专有高风险元命令
-
-### 补充说明
-- 允许的 SQL 类型表示 V1 协议允许承载的语句范围,不代表所有正式支持数据库都必须支持该范围内的每一种语句。
-- 是否支持以数据库级 `capability` 为准,不支持时统一返回 `unsupported`。
-
-#### V1 对事务语义的一致性承诺分为两层
-- 事务控制语义:`BEGIN`、`START TRANSACTION`、`COMMIT`、`ROLLBACK`
-- `savepoint` 语义:`SAVEPOINT`、`ROLLBACK TO SAVEPOINT`、`RELEASE SAVEPOINT`
-- 对原生支持事务控制的 `database`,统一承诺事务控制语义。
-- 对原生支持 `savepoint` 的 `database`,统一承诺 `savepoint` 语义。
-- 对不支持事务控制或 `savepoint` 的 `database`,相关语句统一返回 `unsupported`。
-- DDL、DCL、`EXPLAIN ANALYZE` 在事务中的行为遵循数据库原生语义,并由 `capability` 显式声明。
-
-## 16. MCP 会话与事务语义
-- 每个 MCP 会话对应一个逻辑会话上下文。
-- V1 内置运行时直接使用 `session_id` 作为 SQL execution trace 标签。
-- 会话期间该 `session_id` 保持不变。
-- 会话不支持恢复;会话结束即逻辑上下文结束。
-- 默认执行模式为 `autocommit = true`。
-- 对原生支持事务控制的 `database`,显式执行 `BEGIN` 或 `START TRANSACTION` 后进入事务态。
-- 对原生支持 `savepoint` 的 `database`,支持 `SAVEPOINT`、`ROLLBACK TO
SAVEPOINT`、`RELEASE SAVEPOINT`。
-- 当前事务上下文仅在当前 MCP 会话内有效。
-- 事务存续期间绑定单一 `database`,不允许切换目标数据库。
-- MCP 会话结束时,未提交事务统一自动回滚。
-- V1 不支持通过 `USE` 或 `SET` 修改会话上下文。
-- 对原生不支持事务控制或 `savepoint` 的 `database`,相关事务语句统一返回 `unsupported`。
-
-## 17. 统一执行结果模型
-
-### `result_set`
-- 用于返回结果集的语句,至少包含:
-- `result_kind`
-- `statement_class`
-- `statement_type`
-- `status`
-- `columns`
-- `rows`
-- `truncated`
-
-### `update_count`
-- 用于返回更新计数的语句,至少包含:
-- `result_kind`
-- `statement_class`
-- `statement_type`
-- `status`
-- `affected_rows`
-- `truncated`
-
-### `statement_ack`
-- 用于 DDL、DCL、事务控制和其他非结果集语句,至少包含:
-- `result_kind`
-- `statement_class`
-- `statement_type`
-- `status`
-- `message`
-- `truncated`
-
-### 补充约束
-- `statement_class` 表达治理语义和副作用级别。
-- `statement_type` 表达用户可读的主要语句类型。
-- `result_kind` 表达返回形状,不能反向替代 `statement_class`。
-- `INSERT`、`UPDATE`、`DELETE`、`MERGE` 默认返回 `update_count`;
- 但 data-modifying CTE 等场景允许 `statement_class = dml` 且返回 `result_set`。
-- `CREATE`、`ALTER`、`DROP`、`TRUNCATE`、`GRANT`、`REVOKE`、事务控制语句默认返回
`statement_ack`。
-- `EXPLAIN ANALYZE` 的返回形态由数据库级 `capability` 决定。
-- 一次 SQL tool call 只返回一个结果对象。
-- V1 不支持多结果集返回。
-
-## 18. 统一结果数据类型约束
-- `columns` 至少包含字段名、统一逻辑类型、底层原生类型、是否可空。
-- `rows` 必须与 `columns` 顺序对齐。
-- `null` 值必须一致表达。
-- 日期、时间、时间戳必须使用统一可解析格式返回。
-- 高精度 `decimal / numeric` 建议按字符串返回,避免精度丢失。
-- `JSON`、数组、二进制等复杂类型必须使用统一可识别表达方式。
-- 结果被截断时必须显式返回 `truncated=true`。
-
-## 19. 能力声明
-
-### 19.1 服务级 capability
-- 服务级 `capability` 只表达协议公共能力,至少包含:
-- `supported_resources`
-- `supported_tools`
-- `supported_statement_classes`
-
-### 19.2 数据库级 capability
-- 数据库级 `capability` 表达某个 `database` 的具体行为边界,至少包含:
-- `supported_object_types`
-- `supported_statement_classes`
-- `supports_transaction_control`
-- `supports_savepoint`
-- `supported_transaction_statements`
-- `default_autocommit`
-- `max_rows_default`
-- `max_timeout_ms_default`
-- `default_schema_semantics`
-- `schema_execution_semantics`
-- `supports_cross_schema_sql`
-- `supports_explain_analyze`
-- `ddl_transaction_behavior`
-- `dcl_transaction_behavior`
-- `explain_analyze_result_behavior`
-- `explain_analyze_transaction_behavior`
-
-### 19.3 枚举约束
-- `ddl_transaction_behavior = uniform | native | unsupported`
-- `dcl_transaction_behavior = uniform | native | unsupported`
-- `explain_analyze_result_behavior = result_set | statement_ack | unsupported`
-- `explain_analyze_transaction_behavior = uniform | native | unsupported`
-
-### 19.4 说明
-- `default_autocommit` 指 ShardingSphere MCP 会话默认行为,不等同于底层数据库原生默认 `autocommit`。
-- `default_schema_semantics` 解决 metadata/discovery 侧的统一 schema 语义。
-- `schema_execution_semantics` 解决 SQL tool request-level `schema` 在执行时如何解释。
-- 对原生支持事务控制的 `database`,`supports_transaction_control = true`。
-- 对原生不支持事务控制的 `database`,`supports_transaction_control = false`。
-- 对原生支持 `savepoint` 的 `database`,`supports_savepoint = true`。
-- 对原生不支持 `savepoint` 的 `database`,`supports_savepoint = false`。
-- `index` 是否支持由 `supported_object_types` 明确声明。
-- DDL、DCL、`EXPLAIN ANALYZE` 的事务边界行为必须由数据库级 `capability` 明确声明。
-
-## 20. 运行边界与 SQL Execution Trace
-
-### V1 当前实现
-- 内置 runtime 不拦截调用请求。
-- HTTP 端点如需对外暴露,应放在受信网络、上游网关、反向代理或其他网络边界之后。
-- SQL 执行路径生成本地 trace 摘要;V1 不承诺持久化合规日志或全量 MCP 活动记录。
-
-### V1 不纳入正式验收
-- 内置对象级可见性裁剪
-- 内置语句类别拦截
-- 列级可见性裁剪
-- 字段脱敏
-- 行级数据过滤
-
-## 22. 元数据变化感知与同步 SLA
-
-### V1 正式承诺
-- 结构变化和 DCL 变化必须在 1 分钟内反映到 MCP 公共面。
-- 由 ShardingSphere 负责感知变化并同步 MCP 出口。
-
-### 覆盖变化包括
-- `schema` 新增、删除、重命名
-- `table / view` 新增、删除、重命名
-- `column` 新增、删除、重命名、类型变化
-- `index` 新增、删除
-
-### 补充规则
-- 若结构变更通过当前 MCP 会话执行成功,当前会话中应尽快可见。
-- 全局视角仍以 1 分钟内同步为准。
-
-## 23. SQL Execution Trace 基线
-
-### SQL execution trace 记录至少应包含
-- `session_id`
-- `database`
-- `statement_class`
-- `statement_digest`
-- `success_or_failure`
-- `error_code`
-- `transaction_marker`
-- `timestamp`
-
-### 补充说明
-- `operation_class` 统一表示 `resource_read`、`metadata_tool`、`query_execution`。
-- 对 SQL,`operation_digest` 表示语句摘要。
-- 对 `resources / tools`,`operation_digest` 表示资源路径或工具调用摘要。
-- `transaction_marker` 至少能标识 `BEGIN`、`COMMIT`、`ROLLBACK`、`SAVEPOINT`。
-
-## 24. 错误模型
-
-### 统一错误码
-- `invalid_request`
-- `not_found`
-- `unsupported`
-- `conflict`
-- `unavailable`
-- `transaction_state_error`
-- `query_failed`
-
-### 补充规则
-- 在无活动事务时执行 `COMMIT`、`ROLLBACK` 或引用不存在的保存点,返回 `transaction_state_error`。
-- 当前 `database` 不支持事务控制时执行事务控制语句,返回 `unsupported`。
-- 当前 `database` 不支持 `savepoint` 时执行 `savepoint` 语句,返回 `unsupported`。
-
-## 25. 历史 V1 最低统一能力基线(非当前提交门禁)
-
-> 本节是早期统一数据库入口目标,不是当前 submit-ready MCP V1 的完成门禁。
-> 当前提交门禁以 runtime readiness、distribution、E2E 与当前 descriptor public surface 为准。
-- V1 正式支持数据库必须统一满足以下最低能力基线:
-- 统一支持核心对象模型:`database / schema / table / view / column / capability`
-- 统一支持公共 `tools`:`list_databases / list_schemas / list_tables / list_views /
list_columns / search_metadata / describe_table / describe_view /
get_capabilities / execute_query`
-- 统一支持 `result_set / update_count / statement_ack` 三类结果模型
-- 统一支持结构变化在 1 分钟内同步到 MCP 出口
-- 对原生支持事务控制的 `database`,统一支持 `BEGIN / START TRANSACTION / COMMIT / ROLLBACK`
-- 对原生支持 `savepoint` 的 `database`,统一支持 `SAVEPOINT / ROLLBACK TO SAVEPOINT /
RELEASE SAVEPOINT`
-- 对不支持事务控制或 `savepoint` 的 `database`,相关 `capability` 必须明确声明,相关语句统一返回
`unsupported`
-- `index` 不属于 V1 强制统一基线对象,是否支持由 `supported_object_types` 声明
-- 数据库级 `capability` 必须显式声明 `supported_statement_classes`
-
-## 26. V1 事务能力矩阵
-- MySQL:`supports_transaction_control=true`,`supports_savepoint=true`
-- PostgreSQL:`true`,`true`
-- openGauss:`true`,`true`
-- SQL Server:`true`,`true`
-- MariaDB:`true`,`true`
-- Oracle:`true`,`true`
-- ClickHouse:`false`,`false`
-- Doris:`true`,`false`
-- Hive:`false`,`false`
-- Presto:`true`,`false`
-- Firebird:`true`,`true`
-- H2:`true`,`true`
-
-### 说明
-- 上述矩阵必须与数据库级 `capability` 的真实返回保持一致。
-- 若后续版本、部署模式或产品范围变化导致某 `database` 的事务能力变化,必须同步更新 `capability` 与验收口径。
-
-## 27. 成功指标
-- 支持数据库的正式接入数量
-- 上层 Agent 的单次接入成功率
-- 多数据库统一工具适用率
-- 元数据同步在 1 分钟内达标比例
-- SQL 执行成功率
-- 事务控制成功率
-- `savepoint` 成功率
-- 运行边界控制效果
-- 上层平台对多数据库 MCP 适配代码的减少比例
-
-## 28. 主要风险
-- 不同数据库对象语义差异过大,导致公共面过度抽象。
-- 支持矩阵扩大后,不同数据库在 `schema` 语义、对象模型、结果类型和执行能力上的差异显著增加。
-- ClickHouse、Doris、Hive、Presto 等数据库会成为统一契约的一致性风险重点区域。
-- 结果模型不稳定会导致上层仍需写数据库分支。
-- 元数据同步不稳定会直接影响 MCP 可信度。
-- 事务语义、`savepoint` 语义、写操作边界和多数据库一致性控制不清会带来安全风险。
-
-## 29. 标准 Demo
-
-### 说明原则
-- 服务级 `capability` 只表达协议公共能力。
-- 数据库级 `capability` 决定具体 `database` 的事务、高级语句、对象类型和边界行为。
-- DDL、DCL、`EXPLAIN ANALYZE` 在事务中的行为以数据库级 `capability` 为准。
-- `index` 相关能力仅在 `supported_object_types` 包含 `index` 时暴露。
-
-## 30. 历史压缩版需求清单(非当前提交门禁)
-
-> 本清单保留早期目标,不表示当前提交必须完成完整统一治理能力。
-1. 必须提供统一数据库访问与 SQL 执行公共面。
-2. 必须统一 `database / schema / table / view / column / capability` 对象语义。
-3. `index` 必须作为数据库级可选公共对象,通过 `capability` 明确声明。
-4. 必须支持对象发现的搜索、过滤和大结果收窄提示。
-5. 必须提供正式公共工具 `execute_query`。
-6. 必须支持通用 SQL 执行,但 V1 不包含 `USE`、`SET`、`COPY`、`LOAD`、`CALL` 和各数据库专有高风险元命令。
-7. 必须定义 MCP 会话语义、SQL execution trace 标签和事务语义。
-8. 必须区分事务控制语义与 `savepoint` 语义。
-9. 必须提供统一执行结果模型。
-10. 必须补充服务级 `capability` 与数据库级 `capability` 的正式内容模型。
-11. 必须保证结构变化在 1 分钟内同步到 MCP 出口。
-12. 必须提供统一错误模型,覆盖冲突、事务和执行失败。
-13. HTTP 端点如需对外暴露,必须放在受信网络、上游网关、反向代理或其他网络边界之后。
-14. 必须明确 DDL、DCL、`EXPLAIN ANALYZE` 在事务中的行为遵循数据库原生语义,并通过 `capability` 声明。
-15. 必须提供正式支持数据库的事务能力矩阵,并保证与 `capability` 一致。
-
-## 31. 压缩版验收清单
-1. Agent 只接入一个 ShardingSphere MCP 服务即可访问和执行多种数据库上的统一 SQL 公共能力。
-2. V1 正式支持数据库都满足统一对象模型、统一 `tools`、统一结果模型和统一错误语义。
-3. `search_metadata` 支持 `database / schema / table / view / column / index`。
-4. 对原生支持事务控制的 `database`,事务控制语义稳定一致。
-5. 对原生支持 `savepoint` 的 `database`,`savepoint` 语义稳定一致。
-6. 对不支持事务控制或 `savepoint` 的 `database`,相关语句统一返回 `unsupported`。
-7. `index` 仅在 `supported_object_types` 包含该对象时暴露。
-8. 通过 MCP 执行成功的结构变更,在当前会话中可快速可见,并在 1 分钟内全局可见。
-9. `USE`、`SET`、`COPY`、`LOAD`、`CALL` 在 V1 中被统一拒绝,并返回一致错误语义。
-10. DDL、DCL、`EXPLAIN ANALYZE` 在事务中的行为差异已通过数据库级 `capability` 明确声明。
-11. MCP 会话结束后上下文不恢复,未提交事务自动回滚。
-12. 事务能力矩阵与实际 `capability` 返回一致。
-13. 上层不再需要为不同数据库单独适配对象发现、执行工具和返回结构。
diff --git a/docs/mcp/ShardingSphere-MCP-Technical-Design.md
b/docs/mcp/ShardingSphere-MCP-Technical-Design.md
deleted file mode 100644
index 6c0bc30cb9c..00000000000
--- a/docs/mcp/ShardingSphere-MCP-Technical-Design.md
+++ /dev/null
@@ -1,854 +0,0 @@
-# ShardingSphere MCP 技术设计方案
-
-> 状态说明:本文档保留早期技术设计背景,不是当前 MCP public surface 契约。
-> 当前契约以 `shardingsphere://capabilities`、descriptor、`mcp/README.md` 和
`mcp/README_ZH.md` 为准。
-> 不要从本文档推导早期工具矩阵或额外兼容层。
-> 当前可提交范围是 MCP V1 runtime readiness,不是完整 ShardingSphere governance
administration surface。
-
-## 1. 文档信息
-- 文档名称:ShardingSphere MCP 技术设计方案
-- 文档版本:最终版
-- 文档类型:Technical Design
-- 状态:可进入正式架构评审
-- 目标范围:ShardingSphere MCP V1
-
-## 2. 方案摘要
-- ShardingSphere MCP 作为 ShardingSphere 主仓库内的新接入面落地,但采用“独立代码模块 + 根 distribution
发布模块”的组织方式。
-- 代码模块:
- - `mcp/core`
- - `mcp/bootstrap`
-- 发布模块:
- - `distribution/mcp`
- - `artifactId`:`shardingsphere-mcp-distribution`
-- 协议层与运行层采用仓库内自管 MCP 领域模型与 bootstrap 适配层,HTTP 服务承载采用:
- - `mcp/bootstrap` 中局部引入的 MCP Java SDK
- - embedded Tomcat 11
-- 本地调试采用:
- - STDIO
-- 同时通过 JDK 21 子链路 + 常规 reactor 模块接入 + JDK 21 子链路 CI + 独立 distribution
与当前主仓库主线共存。
-
-## 3. 背景
-- 根据前期 PRD,ShardingSphere MCP 要解决的不是“把 MCP 跑起来”,而是形成正式的数据库统一 AI/Agent 接入面,覆盖:
- - 统一 metadata 发现
- - 统一 capability 声明
- - 统一 SQL 执行入口的早期设想;当前 public tools 使用 `database_gateway_execute_query` 与
`database_gateway_execute_update`
- - 统一错误模型
- - 统一事务与 `savepoint` 能力边界
- - 统一 SQL execution trace 与治理可见性
-- 当前仓库和生态事实如下:
- - 根工程模块结构见 `pom.xml`(line 33)
- - 根工程 Java 基线为 8,`pom.xml`(line 55)
- - 根工程 Jackson 版本为 2.16.1,`pom.xml`(line 93)
- - 根 distribution 聚合当前管理:
- - `src`
- - `agent`
- - `jdbc`
- - `proxy`
- - `proxy-native`
- - 见 `distribution/pom.xml`(line 30)
- - MCP 子链路当前实现固定在 Java 21
-- 因此,技术方案必须同时满足:
- - MCP 进入主仓库
- - 不破坏根工程 Java 8 默认构建
- - 保持与现有 distribution 结构一致
- - 覆盖当前 descriptor public surface 中的 capability、SQL execution 与 transaction
semantics
-
-## 4. 目标
-- 本方案目标如下:
- - 将 MCP 作为 ShardingSphere 的正式接入子系统落地。
-- `mcp/core` 继续使用仓库内自管 runtime 与领域模型,`mcp/bootstrap` 局部引入 MCP Java SDK。
- - 在不推动全仓升级到 JDK 21 的前提下,引入 MCP 子链路的 Java 21 能力。
- - 形成独立部署、独立运行、独立发布的 MCP 服务。
- - 支撑 PRD 中定义的:
- - `capability`
- - `database_gateway_execute_query`
- - `database_gateway_execute_update`
- - `transaction matrix`
- - `SQL execution trace`
- - 统一错误模型
-
-## 5. 非目标
-- 本方案不包括以下内容:
- - 不展开类图、接口签名、方法级实现细节。
- - 不推动整个主仓库统一升级到 JDK 21。
- - 不引入 Spring AI 或 Spring Boot 作为主实现框架。
- - 不把 MCP 嵌入 proxy 或 jdbc。
- - 不在 V1 实现分布式会话存储。
- - 不在 V1 承诺事务态无损 failover。
- - 不在本阶段定义全部配置文件字段细节。
-
-## 6. 关键约束
-
-### 6.1 仓库约束
-- 根工程当前默认模块链固定,`pom.xml`(line 33)
-- 根工程 Java 基线是 8,`pom.xml`(line 55)
-- 根工程当前 Jakarta BOM 为 8.0.0,`pom.xml`(line 102)
-- 根 distribution 当前是默认构建链的一部分,`pom.xml`(line 49)
-
-### 6.2 运行时约束
-- 截至 2026-03-21:
- - MCP 子链路实现固定为 Java 21
- - Streamable HTTP 与 STDIO 双 transport 由仓库内 runtime 提供
-
-### 6.3 HTTP Runtime 约束
-- HTTP listener 由 `mcp/bootstrap` 局部引入的 embedded Tomcat 承载
-- MCP Java SDK 只允许出现在 `mcp/bootstrap`
-- 不引入 Spring runtime
-- HTTP transport mechanics 优先复用官方
- `HttpServletStreamableServerTransportProvider`
-- ShardingSphere 自定义代码只保留协议版本 contract、initialize 响应头、
- managed session cleanup 与必要兼容层
-
-### 6.4 合规约束
-- 官方 Java SDK 使用 MIT 许可
-- MIT/X11 属于 ASF Category A,可纳入 Apache 产品分发
-- 来源:ASF 3rd Party License Policy
-
-## 7. 关键设计决策
-
-### 7.1 MCP 进入主仓库并沿用常规模块接入
-- 最终决策:
- - `mcp` 放在主仓库根目录下
- - 作为独立代码子项目存在
- - 直接进入根 `pom.xml` 默认 `<modules>`
- - 不再通过独立 `mcp` profile 启用
-- 原因:
- - 保持统一版本、统一仓库、统一演进
- - 与 JDBC、Proxy、agent 保持一致的模块管理方式
- - 打包、测试和发布链路不再依赖额外 profile
-
-### 7.2 `distribution/mcp` 放在根 distribution 下
-- 最终决策:
- - 发布模块位于 `distribution/mcp`
- - `artifactId` 为 `shardingsphere-mcp-distribution`
-- 原因:
- - 与现有 distribution 结构一致
- - 更符合仓库发布与 release 组织方式
- - 与 `distribution/proxy`、`distribution/jdbc` 的模式一致
-
-### 7.3 `mcp` 和 `distribution/mcp` 直接进入默认 modules
-- 最终决策:
- - 根 `pom.xml` 直接加入 `mcp`
- - `distribution/pom.xml` 直接加入 `distribution/mcp`
- - `test/e2e/pom.xml` 直接加入 `test/e2e/mcp`
- - JDK 21 子链路 CI 继续保留独立 lane
-- 原因:
- - 这样可以让 MCP 与 JDBC、Proxy、agent 保持一致的模块接入方式
- - 打包、测试和发布链路不再依赖额外 profile
- - Java 21 约束仍局部收敛在 MCP 子模块
-
-### 7.4 不使用 Spring AI
-- 最终决策:
- - MCP 不采用 Spring AI 作为核心实现方案
-- 原因:
- - Spring AI 提供的是 Boot 集成增强
- - 本项目主复杂度不在 starter / 注解层
- - 主仓库当前不是 Spring 工程
- - 引入 Spring AI 会扩大技术栈侵入与长期维护成本
-
-### 7.5 Runtime 默认选型
-- 最终决策:
- - `mcp/core` 继续使用仓库内自管 protocol DTO 与领域模型
- - `mcp/bootstrap` 使用 MCP Java SDK 的 Jackson 2 适配与 Streamable HTTP transport
-- 不采用:
- - 让 `mcp/core` 直接依赖 SDK 类型
- - Spring AI / Spring Boot runtime
-- 原因:
- - 用最小边界复用官方协议实现
- - 保持 ShardingSphere 领域模型与外部 SDK 解耦
- - 通过根工程 Jackson 版本管理保证 2.16.1 一致性
-
-### 7.6 JSON 处理策略
-- 最终决策:
- - transport JSON 编解码通过 MCP Java SDK 的 Jackson 2 适配完成
- - Jackson 版本继续受根工程 `2.16.1` 约束
- - 业务对象继续使用仓库内 DTO
-- 原因:
- - 降低协议序列化样板代码
- - 避免引入与主仓库不一致的 Jackson 版本
-
-### 7.7 HTTP 服务承载
-- 最终决策:
- - 使用 embedded Tomcat 11 承载 MCP Java SDK 的 Streamable HTTP servlet
- - 当前内置 HTTP runtime 不提供授权,远程暴露由外部网关、反向代理或网络边界负责
- - `Origin` 边界保持独立本地策略类,并由 servlet 前置校验
-- 原因:
- - 只在 bootstrap 层引入最小 servlet 容器
- - 与官方 Streamable HTTP servlet transport 对齐
- - 仍然不把运行时依赖扩散到主仓库其他模块
- - 不在开源默认配置中扩展授权平台,避免引入与 MCP transport 无关的过度设计
-
-### 7.8 HTTP 会话与事务状态
-- 最终决策:
- - STDIO 为天然会话态
- - HTTP 也维护逻辑 MCP 会话
- - V1 采用:
- - sticky session
- - 本地内存会话状态
- - V1 不做:
- - distributed session store
- - 事务态无损故障切换
-- 原因:
- - PRD 已定义事务与 `savepoint` 语义
- - HTTP 不能被实现为完全无状态请求模型
-
-## 8. 仓库组织与模块设计
-
-### 8.1 推荐目录结构
-```text
-shardingsphere
-├── mcp
-│ ├── pom.xml
-│ ├── core
-│ ├── jdbc
-│ └── bootstrap
-├── distribution
-│ └── mcp
-└── pom.xml
-```
-
-### 8.2 模块职责
-
-#### `mcp/core`
-- MCP 公共对象模型
-- capability 组装
-- metadata discovery facade
-- SQL tool facade
-- session / transaction facade
-- session lifecycle registry
-- resource URI resolver
-- tool catalog 与参数归一化
-- 通用 payload / error payload builder
-- error model
-- SQL execution trace facade
-- 对 ShardingSphere 内核能力的统一门面
-- runtime service 聚合
-- JDBC runtime 配置模型
-- JDBC metadata 发现
-- `DatabaseRuntime` 装配
-- JDBC-backed runtime context factory
-
-#### `mcp/bootstrap`
-- MCP server 启动入口
-- HTTP / STDIO transport 装配
-- 配置加载
-- MCP Java SDK `Tool` / `ResourceTemplate` schema 适配
-- tools / resources 注册
-- servlet / stdio 生命周期接线
-
-#### `distribution/mcp`
-- `shardingsphere-mcp-distribution`
-- 二进制包
-- Docker 镜像
-- 启动脚本
-- 配置模板
-- 发布资产
-
-### 8.3 Parent 与版本对齐
-- 推荐:
- - `mcp/pom.xml` 继承根 `shardingsphere` parent,保持版本一致
- - `distribution/mcp/pom.xml` 继承 `shardingsphere-distribution` parent,保持发布结构一致
-- 这样既能保证版本统一,也能保证模块分层清晰。
-
-### 8.4 依赖方向
-- 允许:
- - `mcp/core` 依赖 `infra`
- - `mcp/core` 依赖 `database`
- - `mcp/core` 依赖 `parser`
- - `mcp/core` 依赖 `mode`
- - `mcp/core` 依赖 `kernel`
- - 必要时依赖少量 `features`
- - `mcp/bootstrap` 依赖 `mcp/core`
-- 禁止:
- - `kernel -> mcp`
- - `proxy -> mcp`
- - `jdbc -> mcp`
-
-### 8.5 MCP 与 Proxy/JDBC 的关系
-- MCP 与 Proxy/JDBC 的关系是:
- - 产品层:都属于 ShardingSphere 接入面
- - 实现层:都消费 ShardingSphere 内核
- - 运行层:彼此独立部署、独立治理、独立发布
-- MCP 不是 Proxy façade,也不是 JDBC wrapper。
-
-## 9. 构建与发布模型
-
-### 9.1 Operator Rollout Notes
-
-#### 9.1.1 Distribution Layout
-- `distribution/mcp` 在 `package` 阶段输出:
- - `apache-shardingsphere-mcp-<version>/bin`
- - `apache-shardingsphere-mcp-<version>/conf`
- - `apache-shardingsphere-mcp-<version>/lib`
- - `apache-shardingsphere-mcp-<version>/logs`
-- `bin/start.sh` 仅面向发布目录启动,避免把源码树调试逻辑混入发布入口
-
-#### 9.1.2 Runtime Assets
-- 默认配置模板:
- - `distribution/mcp/src/main/resources/conf/mcp-http.yaml`
- - `distribution/mcp/src/main/resources/conf/mcp-stdio.yaml`
-- 默认容器入口:
- - `distribution/mcp/Dockerfile`
-- 默认本地启动脚本:
- - `distribution/mcp/src/main/bin/start.sh`
-
-#### 9.1.3 Validation Flow
-- 运维侧推荐的最小验证顺序:
- 1. `./mvnw -pl mcp -am test -DskipITs -Dspotless.skip=true`
- 2. `./mvnw -pl distribution/mcp -am -DskipTests package`
- 3. `./mvnw -pl test/e2e/mcp -am test -Dsurefire.failIfNoSpecifiedTests=false`
- 4. `sh
distribution/mcp/target/apache-shardingsphere-mcp-<version>/bin/start.sh`
-- 验证重点:
- - `/mcp` Streamable HTTP 会话初始化与关闭
- - STDIO 本地调试入口
- - metadata discovery
- - SQL tool pair
- - SQL execution trace 与变化可见性
-
-#### 9.1.4 Rollback Guidance
-- 如需回滚:
- - 停止 MCP 独立进程或容器
- - 回退 `mcp`、`distribution/mcp` 与 `test/e2e/mcp` 子链路代码
- - 同时回退根 `pom.xml`、`distribution/pom.xml` 与 `test/e2e/pom.xml` 中对 MCP 模块的聚合变更
-- 本方案不修改 Proxy/JDBC 运行链,因此回滚边界限定在 MCP 子链路及其 reactor 聚合改动。
-
-### 9.2 总体策略
-- 采用“与 JDBC、Proxy、agent 一致的常规模块接入 + JDK 21 子链路 CI”的方案:
- - 根工程默认构建链直接包含 `mcp`
- - 根 distribution 默认构建链直接包含 `distribution/mcp`
- - 根 `test/e2e` 默认构建链直接包含 `test/e2e/mcp`
- - MCP 继续保留 JDK 21 子链路 CI lane,但不依赖独立 Maven profile
-
-### 9.3 模块接入方式
-
-#### 根 `pom.xml`
-- 直接在 `<modules>` 中加入:
- - `<module>mcp</module>`
-
-#### `distribution/pom.xml`
-- 直接在 `<modules>` 中加入:
- - `<module>mcp</module>`
-
-#### `test/e2e/pom.xml`
-- 直接在 `<modules>` 中加入:
- - `<module>mcp</module>`
-
-### 9.4 构建链
-
-#### 默认构建链
-- 默认 reactor 直接包含 `mcp`、`distribution/mcp` 与 `test/e2e/mcp`
-- 需要为 MCP 子模块提供 JDK 21 编译环境
-- Java 21 相关依赖与编译参数局部收敛在 MCP 子链路
-
-#### MCP 构建链
-- 固定 JDK 21
-- 构建:
- - `mcp/core`
- - `mcp/bootstrap`
- - `test/e2e/mcp`
- - `distribution/mcp`
-
-### 9.5 JDK 21 隔离策略
-- 推荐:
- - Maven Toolchains
- - `mcp/pom.xml` 明确 `maven.compiler.release=21`
- - JDK 21 子链路 CI lane 固定 JDK 21
-
-### 9.6 依赖管理隔离
-- 必须遵守:
- - 不把额外 MCP SDK 或 HTTP 容器依赖引入根工程 `dependencyManagement`
- - MCP 子链路内部独立管理依赖版本
- - MCP Java SDK transitive Jackson 版本必须服从根工程 Jackson `2.16.1`
-
-### 9.7 为什么 `distribution/mcp` 仍需局部隔离
-- 因为 `distribution/mcp` 依赖的是 Java 21 的 `mcp/bootstrap`。
-- 现在 `distribution/mcp` 已进入默认构建链,因此必须把 Java 21 约束局部收敛在 MCP 子链路内部,而不是重新引入独立
profile。
-
-## 10. 技术选型明细
-
-### 10.1 协议与 JSON
-- 默认采用:
- - `mcp/core` 仓库内 protocol DTO
- - `mcp/bootstrap` 中的 MCP Java SDK transport facade
- - `mcp-json-jackson2` 与仓库统一 Jackson 2.16.1
-- 不采用:
- - 让 SDK 类型进入 `mcp/core`
- - 外部 JSON bridge
-
-### 10.2 HTTP Runtime
-- 采用:
- - embedded Tomcat 11
- - MCP Java SDK `HttpServletStreamableServerTransportProvider`
-- 约束:
- - 运行时实现只出现在:
- - `mcp/bootstrap`
- - `distribution/mcp`
- - 不进入根工程统一依赖管理
- - routing、SDK session 与 `DELETE` 基础语义优先交给官方 provider
- - provider 继续执行严格 `Accept` 校验;missing/blank `Accept` 的零损失兼容由本地 shim 承接
- - initialize `MCP-Protocol-Version` 响应头、follow-up protocol contract、
- managed session cleanup 和零损失兼容 shim 继续由 ShardingSphere 保留
-
-### 10.3 本地调试
-- 采用:
- - STDIO
-
-### 10.4 联调工具
-- 推荐:
- - 本地 STDIO 集成测试路径
- - HTTP 冒烟联调
- - capability / transaction 专项联调
-
-## 11. 总体架构
-
-```mermaid
-flowchart TB
- A["Agent / IDE / AI Platform"] --> B["MCP Transport Layer"]
- B --> C["MCP Protocol Layer"]
- C --> D["MCP Domain Facade"]
- D --> E["ShardingSphere Integration Layer"]
- E --> F["Metadata / Governance / Execution"]
- F --> G["Underlying Databases"]
-
- H["Trace / Metrics / Logging"] --> C
- H --> D
-```
-
-### 11.1 分层职责
-
-#### MCP Transport Layer
-- 承载 HTTP 与 STDIO
-- 管理会话、连接、请求 / 响应生命周期
-- 不承载业务能力判断
-
-#### MCP Protocol Layer
-- 处理 MCP 概念:
- - resources
- - tools
- - capability
- - errors
-- 将协议对象转换为领域命令
-
-#### MCP Domain Facade
-- 是 MCP 子系统的核心语义层
-- 统一提供:
- - metadata discovery
- - capability
- - SQL tool pair
- - transaction / savepoint handling
-
-#### ShardingSphere Integration Layer
-- 适配 metadata、parser、mode、kernel 与相关治理模块能力
-- 屏蔽内核模块差异
-- 不向内核泄露 MCP 概念
-
-## 12. Capability 设计
-
-### 12.1 基本原则
-- capability = 客观能力边界
-
-### 12.2 服务级 Capability
-- 服务级 capability 只描述协议公共能力,例如:
- - supported resources
- - supported tools
- - supported statement classes
-- 服务级 capability 不携带单个 `database` 的事务与对象支持差异。
-
-### 12.3 数据库级 Capability
-- 数据库级 capability 至少覆盖:
- - `supported_object_types`
- - `supported_statement_classes`
- - `supports_transaction_control`
- - `supports_savepoint`
- - `supported_transaction_statements`
- - `default_autocommit`
- - `default_schema_semantics`
- - `schema_execution_semantics`
- - `supports_cross_schema_sql`
- - `supports_explain_analyze`
- - `ddl_transaction_behavior`
- - `dcl_transaction_behavior`
- - `explain_analyze_result_behavior`
- - `explain_analyze_transaction_behavior`
-
-### 12.4 Optional Object Types
-- V1 强制统一对象基线:
- - `database`
- - `schema`
- - `table`
- - `view`
- - `column`
- - `capability`
-- V1 可选对象:
- - `index`
-- 规则:
- - `index` 由数据库级 capability 的 `supported_object_types` 声明
- - 不支持时 direct API 返回 `unsupported`
-
-## 13. SQL 执行入口设计
-
-> 本节标题和部分正文保留早期 `execute_query` 术语。
-> 当前 MCP public surface 将读查询与变更执行拆分为 `database_gateway_execute_query` 和
`database_gateway_execute_update`。
-
-### 13.1 设计原则
-- 早期 `execute_query` 设计已收敛为当前 descriptor 中的 SQL tool pair。
-- 它不是 SQL 透传接口,而是统一执行与治理入口。
-- `database` 是唯一强执行边界。
-- `schema` 是可选 namespace hint,不是第二个强路由键。
-- `schema_execution_semantics` 用于向调用方显式声明 request-level `schema` 的执行语义。
-
-### 13.2 高层处理阶段
-- 统一划分为 5 个阶段:
- 1. 请求合法性校验
- 2. MCP 会话与事务状态校验
- 3. capability 校验
- 4. ShardingSphere parse / route / execute 适配
- 5. 统一结果与错误映射
-
-### 13.3 Statement Class 统一分类
-- `select`
-- `dml`
-- `ddl`
-- `dcl`
-- `transaction_control`
-- `savepoint`
-- `explain_analyze`
-- `WITH` 只是语法前导,不是独立 statement class。
-- `statement_class` 表达治理语义和副作用级别。
-- `statement_type` 表达用户可读的主要语句类型。
-
-### 13.4 统一结果模型
-- `result_set`
-- `update_count`
-- `statement_ack`
-- 每个成功结果都包含:
- - `statement_class`
- - `statement_type`
- - `status`
- - `truncated`
-- `statement_class = dml` 允许与 `result_set` 组合,
- 用于表达 data-modifying CTE。
-
-### 13.5 统一错误模型
-- `invalid_request`
-- `not_found`
-- `unsupported`
-- `conflict`
-- `unavailable`
-- `transaction_state_error`
-- `query_failed`
-
-## 14. 会话、事务与 Savepoint 设计
-
-### 14.1 会话模型
-- 每个 MCP 会话绑定:
- - 当前 database 上下文
- - 当前事务状态
- - `savepoint` 状态
- - SQL execution trace 使用的 session_id
-
-### 14.2 HTTP 会话策略
-- 由于 PRD 已定义事务与 `savepoint` 语义,HTTP 路径必须维护逻辑 MCP 会话。
-- 因此 V1 不采用完全无状态 HTTP 模型。
-
-### 14.3 V1 集群策略
-- 采用:
- - sticky session
- - 本地内存会话状态
-- 不纳入:
- - distributed session store
- - 任意节点无粘性事务恢复
- - 事务态无损 failover
-
-### 14.4 故障语义
-- 节点故障、重启或会话丢失时:
- - 该节点上的未提交事务视为失败
- - 相关 MCP 会话失效
- - 客户端需要重新建立会话并重新开始事务
-- 这属于 V1 的明确运行约束,而不是实现细节遗漏。
-
-### 14.5 事务能力矩阵
-- 事务能力必须显式维护为矩阵。
-- 矩阵至少包含:
- - `database_type`
- - `min_supported_version`
- - `supports_transaction_control`
- - `supports_savepoint`
- - `default_autocommit`
- - `supported_transaction_statements`
- - `supported_object_types`
- - `supported_statement_classes`
- - `supports_explain_analyze`
- - `ddl_transaction_behavior`
- - `dcl_transaction_behavior`
- - `explain_analyze_result_behavior`
- - `explain_analyze_transaction_behavior`
-- 矩阵角色:
- - capability 的默认事实源
- - 验收标准的技术来源
- - 支持矩阵维护的统一资产
-
-## 15. 运行边界与 SQL Execution Trace 设计
-
-### 15.1 运行边界
-- V1 内置 runtime 聚焦 session 协商、会话状态维护与运行边界校验。
-- follow-up production runtime 路径通过 `runtimeDatabases` 显式装配真实 metadata
与执行适配,不再允许默认空 `MetadataCatalog` / 空 `DatabaseRuntime` 作为成功启动路径。
-- HTTP 服务如需对外暴露,应放在受信网络、上游网关、反向代理或其他网络边界之后。
-
-### 15.2 SQL execution trace 基线
-- V1 只生成 SQL 执行路径的本地 trace 摘要,不承诺持久化合规日志或全量 MCP 活动记录。
-- 统一输出:
- - session_id
- - database
- - statement_class
- - statement_digest
- - success_or_failure
- - error_code
- - transaction_marker
- - timestamp
-
-## 16. 运行与部署模型
-
-### 16.1 生产主模型
-- 远程 HTTP MCP 服务
-- 特点:
- - 独立进程
- - 独立容器
- - 独立配置目录
- - 独立日志与 SQL execution trace
- - 独立版本发布
-
-### 16.2 调试模型
-- 本地 STDIO 模式
-- 特点:
- - 适合 IDE / 本地 Agent 的进程内联调
- - 不作为生产主模型
- - distribution 提供独立 STDIO 配置模板,但定位保持为本地集成辅助入口,而不是额外的交互式文本 Shell
-
-### 16.2.1 默认发行包启动面
-- distribution 默认启动使用 HTTP 配置,STDIO 通过 `conf/mcp-stdio.yaml` 或
`SHARDINGSPHERE_MCP_TRANSPORT=stdio` 显式选择。
-- 默认 `conf/mcp-http.yaml` 内置一段 demo JDBC runtime,用于首次启动时验证非空 metadata 和真实 SQL
tool 行为。
-- `conf/mcp-http.yaml` 采用 strict
schema:`transport.type`、`transport.http.bindHost`、`transport.http.port`、
- `transport.http.endpointPath` 以及每个 runtime database 的全部字段都必须使用受支持字段名。
-- 真实部署需要替换 `runtimeDatabases` 段为目标逻辑库与 JDBC 连接属性;schema 范围与默认 schema 由 JDBC
metadata 自动发现。
- 如需额外 JDBC 驱动,可放入发行包根目录下的 `plugins/`。
-
-### 16.3 推荐集群拓扑
-- MCP 服务集群
-- 前置 L7 网关
-- sticky session 打开
-- 每个实例维护本地会话状态
-- metadata 来源共享
-- 外部接入边界由前置网关或网络边界承担
-
-### 16.4 为什么不嵌入 Proxy
-- 因为:
- - proxy 是数据库协议代理
- - mcp 是 AI / Agent 控制与执行公共面
-- 把两者放在同一运行时,会让:
- - 运维边界不清
- - 治理边界不清
- - 版本与资源隔离变差
-
-## 17. 交互流程
-
-### 17.1 Capability 发现
-```mermaid
-sequenceDiagram
- participant C as Client
- participant M as MCP Server
- participant S as Service Capability
- participant D as Database Capability
-
- C->>M: 读取服务级 capability
- M->>S: 组装协议公共能力
- S-->>M: supported resources/tools/classes
- M-->>C: 服务级 capability
-
- C->>M: get_capabilities(database)
- M->>D: 组装数据库级 capability
- D-->>M: database capability
- M-->>C: 数据库级 capability
-```
-
-### 17.2 Metadata 发现
-```mermaid
-sequenceDiagram
- participant C as Client
- participant M as MCP Server
- participant F as Metadata Facade
- participant S as ShardingSphere Metadata
-
- C->>M: resources/read or database_gateway_search_metadata
- M->>F: metadata discovery
- F->>S: metadata 查询
- S-->>F: 可访问对象
- F-->>M: 统一对象结果
- M-->>C: MCP tool response
-```
-
-### 17.3 SQL 执行
-```mermaid
-sequenceDiagram
- participant C as Client
- participant M as MCP Server
- participant E as ExecuteQuery Facade
- participant S as ShardingSphere Core
-
- C->>M: database_gateway_execute_query or database_gateway_execute_update
- M->>E: 执行统一 SQL 请求
- E->>S: parse / route / execute
- S-->>E: raw result
- E-->>M: result_set / update_count / statement_ack
- M-->>C: MCP response
-```
-
-## 18. Distribution 与运维模型
-
-### 18.1 发布模块
-- 发布模块位于:
- - `distribution/mcp`
- - `artifactId`:`shardingsphere-mcp-distribution`
-
-### 18.2 发行物结构
-- 建议产出:
-
-```text
-apache-shardingsphere-mcp-<version>/
-├── bin/
-├── conf/
-├── lib/
-├── logs/
-└── LICENSE / NOTICE / README.md
-```
-
-### 18.3 配置分层
-- 当前 V1 打包模板直接暴露三类配置:
- - 服务配置
- - transport 配置
-- 更细粒度的暴露/治理配置保留为后续演进项,不在当前 `mcp-http.yaml` 模板中展开。
-
-### 18.4 容器化要求
-- V1 应提供:
- - 独立 Dockerfile
- - 独立镜像
- - 独立启动参数
- - 独立配置挂载约定
-
-### 18.5 可观测性
-- 当前 V1 打包运行时默认具备:
- - 服务日志目录
- - `conf/logback.xml` 日志配置
- - SQL execution trace 相关代码路径
-- `readiness / liveness` 属于后续运行时增强项,当前 standalone runtime 未直接提供。
- - capability 快照
- - tool 调用统计
- - 会话统计
-
-## 19. 第三方依赖与合规
-
-### 19.1 依赖策略
-- V1 默认采用:
- - `mcp/core`
- - `mcp/bootstrap`
-- `mcp/bootstrap` 局部采用:
- - MCP Java SDK
- - embedded Tomcat
-- 不采用:
- - SDK 类型扩散到 `mcp/core`
- - Spring runtime
-
-### 19.2 依赖管理边界
-- 以下依赖仅允许出现在 MCP 子链路:
- - MCP Java SDK
- - embedded Tomcat runtime 代码
- - MCP 子链路局部测试依赖
-- 不得:
- - 进入根工程统一依赖管理
- - 覆盖根工程现有依赖版本
- - 反向传播到 `kernel / proxy / jdbc`
-
-### 19.3 合规要求
-- 由于官方 Java SDK 采用 MIT 许可,需完成:
- - LICENSE / NOTICE 核对
- - 第三方依赖许可证审查
- - 发布前依赖清单确认
-
-## 20. 风险与缓解
-
-### 20.1 JDK 双基线风险
-- 风险:
- - 主仓库常规构建环境与 MCP 的 Java 21 需求并存
- - MCP Java 21
-- 缓解:
- - `mcp`、`distribution/mcp` 与 `test/e2e/mcp` 直接进入默认 reactor
- - MCP 子模块局部声明 Java 21
- - JDK 21 子链路 CI 固定 JDK 21
-
-### 20.2 依赖冲突风险
-- 风险:
- - MCP 子链路局部运行时依赖
- - JDK 21 runtime 边界
-- 缓解:
- - MCP 子链路内部独立管理
- - 不引额外根 BOM
- - 不让依赖外溢到主仓库主线
-
-### 20.3 数据库能力差异风险
-- 风险:
- - transaction
- - savepoint
- - index
- - explain analyze
-- 缓解:
- - 事务能力矩阵显式维护
- - capability 显式声明
- - optional object 明确控制
-
-### 20.4 集群事务会话风险
-- 风险:
- - HTTP 集群下事务上下文丢失
- - 节点故障导致会话失效
-- 缓解:
- - sticky session
- - 本地内存会话态
- - distributed session store 不纳入 V1
- - 明确 failover 语义,不承诺无损恢复
-
-## 21. 实施计划
-- 阶段 1:结构落位
- - 建立 `mcp` 子项目
- - 建立 `core / bootstrap`
- - 在根 distribution 下建立 `distribution/mcp`
- - 建立 MCP 专用 JDK 21 构建链
-- 阶段 2:协议公共面
- - 完成 resources / tools 框架
- - 完成 capability 组装链
- - 完成统一 error model
-- 阶段 3:执行与治理
- - 完成 SQL tool pair
- - 完成事务能力矩阵
- - 完成 SQL execution trace 治理可见性链路
-- 阶段 4:部署与联调
- - 完成 HTTP 服务化部署
- - 完成 STDIO 本地调试
- - 完成 capability / transaction 验证
-
-## 22. 验收标准
-- 技术验收建议至少覆盖:
- - MCP 是否作为独立代码模块存在
- - `distribution/mcp` 是否作为根 distribution 正式发布模块存在
- - 是否未反向污染主仓库 Java 8 主线
- - 是否使用官方 SDK 而非自研协议实现
- - capability 是否实现分层清晰
- - 当前 SQL tool pair 是否覆盖查询与变更执行入口
- - 事务能力矩阵是否显式维护
- - HTTP 会话与事务语义是否闭合
- - distribution 是否形成独立运维单元
-
-## 23. 最终结论
-- 最终方案可以压缩成四句话:
- - MCP 进入 ShardingSphere 主仓库,但代码模块与发布模块分层组织。
- - 代码模块位于 `mcp/core` 与 `mcp/bootstrap`,发布模块位于根
`distribution/mcp`,`artifactId` 为 `shardingsphere-mcp-distribution`。
- - `mcp/core` 继续自管领域模型,`mcp/bootstrap` 局部使用 MCP Java SDK 与 embedded Tomcat 承载
Streamable HTTP,STDIO 用于本地调试。
- - MCP 子链路通过 JDK 21、常规 reactor 模块接入、JDK 21 子链路 CI 和独立 distribution 与主仓库主线共存。
diff --git
a/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/MCPDocumentationContractTest.java
b/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/MCPDocumentationContractTest.java
deleted file mode 100644
index 1bab8ecde80..00000000000
---
a/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/MCPDocumentationContractTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.mcp.bootstrap;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.jupiter.api.Test;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.List;
-import java.util.Map;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-class MCPDocumentationContractTest {
-
- private static final ObjectMapper JSON_MAPPER = new ObjectMapper();
-
- @Test
- void assertHttpDockerAndConfigurationDocs() throws IOException {
- String actualEnglish =
Files.readString(resolveMCPDirectory().resolve("README.md"));
- String actualChinese =
Files.readString(resolveMCPDirectory().resolve("README_ZH.md"));
- assertDocumentationIncludesRuntimeSafety(actualEnglish);
- assertDocumentationIncludesRuntimeSafety(actualChinese);
- assertDocumentationOmitsBuiltInAuthorization(actualEnglish);
- assertDocumentationOmitsBuiltInAuthorization(actualChinese);
- }
-
- @Test
- void assertDocumentationOmitsRemovedPayloadFields() throws IOException {
- String actual =
Files.readString(resolveMCPDirectory().resolve("README.md")) +
Files.readString(resolveMCPDirectory().resolve("README_ZH.md"));
- for (String each : List.of("pending_questions", "resource_uri",
"parent_uri", "next_resource_uris", "read_resources_first", "empty_reason",
"not_found_reason")) {
- assertFalse(actual.contains(each));
- }
- }
-
- @Test
- void assertDesignDocumentationOmitsBuiltInAuthorization() throws
IOException {
- Path docsDirectory = resolveRepositoryDirectory().resolve("docs/mcp");
- String actual =
Files.readString(docsDirectory.resolve("ShardingSphere-MCP-PRD.md"))
- +
Files.readString(docsDirectory.resolve("ShardingSphere-MCP-Detailed-Design.md"))
- +
Files.readString(docsDirectory.resolve("ShardingSphere-MCP-Technical-Design.md"));
- assertDocumentationOmitsBuiltInAuthorization(actual);
- }
-
- @Test
- void assertRegistryMetadataIncludesConfigVariable() throws IOException {
- Map<String, Object> actual =
JSON_MAPPER.readValue(resolveMCPDirectory().resolve("server.json").toFile(),
new TypeReference<>() {
- });
- List<?> packages = (List<?>) actual.get("packages");
- assertFalse(packages.isEmpty());
- for (Object each : packages) {
- Map<?, ?> actualConfigVariable = findEnvironmentVariable((Map<?,
?>) each, "SHARDINGSPHERE_MCP_CONFIG");
- assertFalse((Boolean) actualConfigVariable.get("isRequired"));
- assertFalse((Boolean) actualConfigVariable.get("isSecret"));
- assertThat(actualConfigVariable.get("format"), is("string"));
- }
- }
-
- private Map<?, ?> findEnvironmentVariable(final Map<?, ?> packageMetadata,
final String name) {
- return ((List<?>) packageMetadata.get("environmentVariables")).stream()
- .map(each -> (Map<?, ?>) each)
- .filter(each -> name.equals(each.get("name")))
- .findFirst()
- .orElseThrow();
- }
-
- private void assertDocumentationIncludesRuntimeSafety(final String
content) {
- assertTrue(content.contains("transport.type"));
- assertTrue(content.contains("STREAMABLE_HTTP"));
- assertTrue(content.contains("STDIO"));
- assertTrue(content.contains("transport.http.bindHost"));
- assertTrue(content.contains("transport.http.endpointPath"));
- assertTrue(content.contains("Origin"));
- assertTrue(content.contains("MCP form elicitation"));
- assertTrue(content.contains("URL mode"));
- assertTrue(content.contains("secret manager"));
- assertTrue(content.contains("SHARDINGSPHERE_MCP_CONFIG"));
- assertTrue(content.contains("configuration_required"));
- }
-
- private void assertDocumentationOmitsBuiltInAuthorization(final String
content) {
- for (String each : List.of("accessToken", "oauthIntrospection",
"authorizationServers", "scopesSupported", "protectedResource",
- "WWW-Authenticate", "Authorization: Bearer <token>",
"invalid_token", "insufficient_scope", "Bearer", "http.enabled",
"stdio.enabled")) {
- assertFalse(content.contains(each));
- }
- }
-
- private Path resolveMCPDirectory() {
- return resolveRepositoryDirectory().resolve("mcp");
- }
-
- private Path resolveRepositoryDirectory() {
- Path result = Path.of("").toAbsolutePath();
- while (null != result &&
!Files.exists(result.resolve("mcp/README.md"))) {
- result = result.getParent();
- }
- return result;
- }
-}
diff --git
a/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
b/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
index cfc45375cba..1e70519566b 100644
---
a/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
+++
b/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
@@ -237,11 +237,18 @@ public final class MCPRegistryMetadataCommand {
private static void validateEnvironmentVariable(final Map<String, Object>
packageMetadata, final String name) {
Object envVars = packageMetadata.get("environmentVariables");
ShardingSpherePreconditions.checkState(envVars instanceof List<?>, ()
-> new IllegalArgumentException("MCP Registry package must define " + name +
"."));
-
ShardingSpherePreconditions.checkState(containsEnvironmentVariable((List<?>)
envVars, name), () -> new IllegalArgumentException("MCP Registry package must
define " + name + "."));
+ Map<?, ?> envVar = findEnvironmentVariable((List<?>) envVars, name);
+
ShardingSpherePreconditions.checkState(Boolean.FALSE.equals(envVar.get("isRequired")),
+ () -> new IllegalArgumentException(String.format("MCP Registry
metadata for %s must declare isRequired as false.", name)));
+
ShardingSpherePreconditions.checkState(Boolean.FALSE.equals(envVar.get("isSecret")),
+ () -> new IllegalArgumentException(String.format("MCP Registry
metadata for %s must declare isSecret as false.", name)));
+
ShardingSpherePreconditions.checkState("string".equals(envVar.get("format")),
+ () -> new IllegalArgumentException(String.format("MCP Registry
metadata for %s format must be string.", name)));
}
- private static boolean containsEnvironmentVariable(final List<?> envVars,
final String name) {
- return envVars.stream().filter(each -> each instanceof Map<?,
?>).map(each -> (Map<?, ?>) each).anyMatch(each ->
name.equals(each.get("name")));
+ private static Map<?, ?> findEnvironmentVariable(final List<?> envVars,
final String name) {
+ return envVars.stream().filter(each -> each instanceof Map<?,
?>).map(each -> (Map<?, ?>) each).filter(each ->
name.equals(each.get("name"))).findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("MCP Registry
package must define " + name + "."));
}
private record CommandOptions(Path path, String version, String
identifier, String dockerfilePath, boolean validateOnly, boolean allowSnapshot)
{
diff --git
a/mcp/registry/src/test/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommandTest.java
b/mcp/registry/src/test/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommandTest.java
index 9accd3549b1..8dfa2107fd3 100644
---
a/mcp/registry/src/test/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommandTest.java
+++
b/mcp/registry/src/test/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommandTest.java
@@ -121,6 +121,27 @@ class MCPRegistryMetadataCommandTest {
assertThat(actual.getMessage(), is("--version and --identifier are
required unless --validate-only is set."));
}
+ @Test
+ void assertExecuteRejectsRequiredEnvironmentVariable() throws IOException {
+ Map<String, Object> server = createServerMetadata();
+ getConfigEnvironmentVariable(server).put("isRequired", true);
+ assertEnvironmentVariableRejected(server, "MCP Registry metadata for
SHARDINGSPHERE_MCP_CONFIG must declare isRequired as false.");
+ }
+
+ @Test
+ void assertExecuteRejectsNonStringEnvironmentVariableFormat() throws
IOException {
+ Map<String, Object> server = createServerMetadata();
+ getConfigEnvironmentVariable(server).put("format", "path");
+ assertEnvironmentVariableRejected(server, "MCP Registry metadata for
SHARDINGSPHERE_MCP_CONFIG format must be string.");
+ }
+
+ @Test
+ void assertExecuteRejectsSecretEnvironmentVariable() throws IOException {
+ Map<String, Object> server = createServerMetadata();
+ getConfigEnvironmentVariable(server).put("isSecret", true);
+ assertEnvironmentVariableRejected(server, "MCP Registry metadata for
SHARDINGSPHERE_MCP_CONFIG must declare isSecret as false.");
+ }
+
@Test
void assertExecuteValidatesSourceMetadata() {
Path serverPath = resolveMCPDirectory().resolve("server.json");
@@ -221,6 +242,13 @@ class MCPRegistryMetadataCommandTest {
assertThat(actual.getMessage(), is(expectedMessage));
}
+ private void assertEnvironmentVariableRejected(final Map<String, Object>
server, final String expectedMessage) throws IOException {
+ Path serverPath = createServerJson(server);
+ IllegalArgumentException actual =
assertThrows(IllegalArgumentException.class,
+ () -> MCPRegistryMetadataCommand.execute("--path",
serverPath.toString(), "--validate-only", "--allow-snapshot"));
+ assertThat(actual.getMessage(), is(expectedMessage));
+ }
+
private Map<String, Object> readServerJson(final Path serverPath) throws
IOException {
return JSON_MAPPER.readValue(serverPath.toFile(), new
TypeReference<>() {
});
@@ -273,6 +301,15 @@ class MCPRegistryMetadataCommandTest {
return (List<Map<String, Object>>) server.get("packages");
}
+ @SuppressWarnings("unchecked")
+ private List<Map<String, Object>> getEnvironmentVariables(final
Map<String, Object> server, final int packageIndex) {
+ return (List<Map<String, Object>>)
getPackages(server).get(packageIndex).get("environmentVariables");
+ }
+
+ private Map<String, Object> getConfigEnvironmentVariable(final Map<String,
Object> server) {
+ return getEnvironmentVariables(server, 0).stream().filter(each ->
"SHARDINGSPHERE_MCP_CONFIG".equals(each.get("name"))).findFirst().orElseThrow();
+ }
+
private List<Object> getPackageValues(final Map<String, Object> server,
final String key) {
return getPackages(server).stream().map(each ->
each.get(key)).toList();
}