MCP 协议中台
README.md
# 慧策 · MCP 协议中台
> **一句话**:一套 MCP 协议基础设施——让产线自助注册数据源和 Tool,下游 Agent 通过标准 MCP 协议发现和调用。平台是"协议管道",不承载任何业务逻辑。
---
## 目录
- [定位与边界](#定位与边界)
- [核心概念:MCP 是什么](#核心概念mcp-是什么)
- [架构总览](#架构总览)
- [核心设计](#核心设计)
- [技术栈](#技术栈)
- [项目结构](#项目结构)
- [快速开始](#快速开始)
- [产线接入](#产线接入)
- [文档索引](#文档索引)
- [项目路线图](#项目路线图)
---
## 定位与边界
### 为什么做 MCP 协议中台?
公司有多个产线(跨境 ERP、国内电商、仓储 WMS、财务结算……),每个产线都有数据查询需求。如果每接一个产线就 fork 一份 MCP Server 改 Tool 实现,会陷入"每接一个产线就改代码"的困境。
**核心思路**:做一个只负责 MCP 协议实现和工具调度框架的基础设施。平台定义协议契约,产线按契约自助接入。
### 平台做什么、不做什么
```
┌─────────── 本平台范围 ───────────┐
│ │
AI Agent ──MCP──→ │ MCP Protocol Tool Registry │ ←── API 契约 ←── 产线
│ Auth / Rate Cache / Degrade │
│ Adapter Framework │
│ Admin Console Observability │
│ │
└────────────┬─────────────────────┘
│ Data Source Adapter SPI
▼
┌──────────────────────────────────────┐
│ 产线数据源(产线自管) │
│ MySQL / Doris / StarRocks / HTTP API │
│ Redis / ES / ... │
└──────────────────────────────────────┘
```
| ✅ In Scope | ❌ Out of Scope |
|-------------|-----------------|
| MCP 协议完整实现(基于 Spring AI MCP Server 1.1.2) | 任何实例 Tool 的 SQL/API 逻辑(产线做) |
| Tool 注册中心(CRUD + 版本管理 + 热加载) | ETL 管道 / 宽表建设 / 数据清洗 |
| 数据源适配框架(MySQL/PG/Doris/HTTP/Redis) | 上游 API 对接(ERP、BI、第三方) |
| 中间件管道(鉴权/限流/缓存/降级/日志/监控) | 业务公式 / 算法 / 规则 |
| 管理控制台(数据源管理 + Tool 管理 + 监控大盘) | OAuth2.0 / RBAC / 多租户(Phase 2) |
| 产线 SDK(Java + Python) | 产线接入辅导 / Tool 开发 |
> **关键设计原则**:平台不懂业务。Tool 只是 MySQL 里的一条配置记录(名称 + JSON Schema + 数据源引用 + 查询模板)。产线决定 Tool 叫什么、SQL 怎么写、缓存 TTL 设多少。
---
## 核心概念:MCP 是什么
**MCP(Model Context Protocol)** 是 AI Agent 与外部工具/数据交互的**标准协议**,由 Anthropic 开放。类比 USB-C:在 MCP 之前,每个 AI 应用对接数据源都要写定制胶水代码;有了 MCP,Agent 通过统一的 `tools/list` → `tools/call` 协议发现和调用工具。
```mermaid
flowchart LR
A["🤖 AI Agent<br/>Claude Desktop / LangChain / OpenAI"] -->|"tools/list<br/>tools/call<br/>JSON-RPC 2.0"| B["🔌 MCP 协议中台<br/>Spring AI MCP Server"]
B -->|"Adapter SPI"| C["🗄️ MySQL"]
B -->|"Adapter SPI"| D["🗄️ Doris"]
B -->|"Adapter SPI"| E["🌐 HTTP API"]
B -->|"Adapter SPI"| F["📦 Redis"]
```
> **关键设计原则**:Agent 管"意图"(理解用户要什么),平台管"协议"(MCP 实现 + Tool 路由 + 中间件),产线管"数据"(注册数据源 + 写 SQL/配置)。
---
## 架构总览
### 分层架构
```mermaid
flowchart TB
subgraph Agent["AI Agent 层(外部)"]
Claude["Claude Desktop"]
LangChain["LangChain Client"]
OpenAI["OpenAI Agent SDK"]
end
subgraph Platform["MCP 协议中台(本平台)"]
direction TB
subgraph Protocol["MCP Protocol Layer"]
Handshake["initialize 握手<br/>协议版本协商 · 能力交换"]
JSONRPC["JSON-RPC 2.0 Router<br/>tools/list · tools/call · tools/schema<br/>resources/list · resources/read"]
Transport["Transport: HTTP SSE / Streamable HTTP"]
end
subgraph Middleware["Middleware Pipeline(Filter Chain)"]
direction LR
Auth["鉴权<br/>API Key + BCrypt"] --> RateLimit["限流<br/>Token Bucket"]
RateLimit --> Cache["缓存<br/>Caffeine L1 + Redis L2"]
Cache --> Degrade["降级<br/>4 级状态机"]
Degrade --> Log["日志·监控<br/>TraceId · Prometheus"]
end
subgraph Core["Tool Engine"]
Dispatcher["ToolDispatcher<br/>Tool 解析 · 路由"]
Registry["Tool Registry<br/>元数据管理 · 版本管理 · 热加载"]
Executor["Tool Executor<br/>参数校验 · 模板渲染<br/>结果映射 · 输出校验"]
end
subgraph Adapter["Data Source Adapter Framework"]
SPI["Adapter SPI<br/>接口契约 · 连接池 · 健康检查 · 查询护栏"]
Builtin["内置适配器<br/>MySQL · PostgreSQL · Doris · HTTP · Redis"]
end
subgraph Admin["Admin Console"]
ToolMgmt["Tool 管理"]
DSMgmt["数据源管理"]
Dashboard["监控大盘"]
Alarm["告警配置"]
end
end
subgraph Datasources["产线数据源(产线自管)"]
MySQL_DS["MySQL 产线 A"]
Doris_DS["Doris 产线 B"]
HTTP_API["HTTP API 产线 C"]
Redis_DS["Redis 产线 D"]
end
Agent -->|"MCP Protocol"| Handshake
Handshake --> JSONRPC
JSONRPC --> Auth
Middleware --> Dispatcher
Dispatcher --> Registry
Dispatcher --> Executor
Executor --> SPI
Admin --> Registry
Admin --> DSMgmt
SPI --> Builtin
Builtin --> Datasources
```
### 分层职责
| 层级 | 核心职责 | 边界约束 |
|------|---------|---------|
| **MCP Protocol 层** | `initialize` 握手、JSON-RPC 2.0 Router、SSE/Streamable HTTP Transport(基于 Spring AI MCP Server 1.1.2,不重复造轮子) | 协议层不关心 Tool 从哪来、数据源是什么 |
| **Middleware Pipeline** | 鉴权 → 限流 → 缓存 → 降级 → 日志监控,Filter Chain 模式,请求必经路径 | 全配置驱动,产线在 Tool 配置中勾选策略 |
| **Tool Engine** | ToolDispatcher 解析路由、Tool Registry 元数据管理、Tool Executor 参数校验+模板渲染+结果映射 | 通过 ToolDispatcher 解耦 Protocol 和 Registry |
| **Adapter Framework** | Adapter SPI 接口契约 + 5 种内置适配器 + 查询护栏(max_rows/timeout/DDL 黑名单) | 平台只做适配,不关心数据内容 |
| **Admin Console** | 数据源管理、Tool 注册管理、监控大盘、告警配置(Vue 3 + Arco Design) | 面向产线管理员自助操作 |
---
## 核心设计
### Tool = 元数据,不是代码
从平台视角看,Tool 只是一条 MySQL 记录。产线通过 API 或控制台注册 Tool:
```json
{
"id": "my_query_tool",
"name": "my_query_tool",
"description": "查询最近 N 条订单(给 LLM 看的描述)",
"parameters": {
"type": "object",
"properties": {
"limit": { "type": "integer", "default": 20, "maximum": 100 }
}
},
"datasource_id": "ds_my_line",
"query": {
"type": "SQL",
"template": "SELECT a, b, c FROM orders ORDER BY created_at DESC LIMIT {{.limit}}"
},
"cache": { "level": "BOTH", "l1_ttl_sec": 60, "l2_ttl_sec": 300 }
}
```
平台做的事:校验参数合法性 → 渲染模板 → 通过 Adapter 执行 → 映射结果 → 返回。产线决定一切业务逻辑。
### 数据模型(6 张核心表)
```mermaid
erDiagram
Datasource ||--o{ Tool : "绑定"
Tool ||--o{ ToolVersion : "版本"
Tool ||--o{ CachePolicy : "缓存策略"
Tool ||--o{ DegradePolicy : "降级策略"
Tool ||--o{ InvocationLog : "调用记录"
Datasource {
string id PK "ds_example"
string type "DORIS / MYSQL / PG / HTTP / REDIS"
json connection "主机·端口·库名·凭据引用"
json pool_config "连接池配置"
string status "ONLINE / OFFLINE / ERROR"
}
Tool {
string id PK "my_tool_001"
string name "对 Agent 可见的工具名"
string description "详细的工具描述给 LLM 看"
json parameters "JSON Schema — 输入参数定义"
string datasource_id FK "绑定数据源"
string query_template "SQL 或 HTTP URL 模板"
json result_mapping "字段映射"
json transform "字段级转换规则"
string status "DRAFT / ONLINE / OFFLINE"
}
InvocationLog {
bigint id PK
string tool_id FK
string trace_id "全链路追踪 ID"
int latency_ms "执行耗时"
boolean cache_hit "是否命中缓存"
int degrade_level "降级级别"
timestamp created_at "TTL 7 天"
}
```
### 中间件能力(平台"赠送"给产线的)
| 能力 | 说明 |
|------|------|
| **鉴权** | API Key + BCrypt,基于 `mcp-server-security` 0.0.5 + Spring Security |
| **限流** | Token Bucket,3 级:全局 / 产线 / Tool |
| **缓存** | Caffeine L1(本地 <1ms)+ Redis L2(分布式共享),TTL 产线可配 |
| **降级** | 4 级自动降级:过期缓存 → 仅本地缓存 → 静态默认值 → 503 拒绝 |
| **可观测性** | 自动埋点:调用量/成功率/P95/缓存命中率/降级次数,Prometheus + Grafana |
| **调用日志** | `InvocationLog` 表,产线可查询"Agent 调了我的 Tool 传了什么参数、返回了什么" |
### 三种接入方式
| 方式 | 适用场景 | 产线工作量 |
|------|---------|:---:|
| **SQL 模板** | 单表查询、简单 JOIN、聚合 | 写 1 条 SQL + 填表单 |
| **HTTP 模板** | 调用产线已有 REST API | 填 URL 模板 |
| **SDK 插件** | 多步聚合、复杂计算 | 写 50-200 行 Java/Python |
---
## 技术栈
| 层级 | 选型 | 版本 | 理由 |
|------|------|:---:|------|
| **MCP 协议实现** | Spring AI MCP Server | 1.1.2 | 公司内部 Demo 已验证,内置 JSON-RPC Router + Transport + `initialize` 握手。**不重复造协议轮子** |
| **鉴权** | `mcp-server-security` + Spring Security | 0.0.5 | 社区库,Demo 已验证。API Key + BCrypt |
| **基础框架** | Java 21 + Spring Boot | 3.4.7 | 公司 Java 技术栈,与内部 Demo 对齐版本 |
| **管理控制台前端** | Vue 3 + Vite + Arco Design | — | 轻量、公司前端组技术栈 |
| **元数据存储** | MySQL 8.0 | — | Tool 配置、数据源配置、调用日志 |
| **缓存** | Caffeine (L1) + Redis 6.2 (L2) | — | L1 本地 <1ms,L2 分布式共享 |
| **监控** | Micrometer + Prometheus + Grafana | — | Spring Boot 原生集成 |
| **配置中心** | Nacos 2.x | — | 公司已有,凭据 + 配置存储 |
| **部署** | Docker Compose(开发)+ K8s(生产) | — | 与公司基础设施对齐 |
> **基础框架选择**:Spring AI MCP Server 1.1.2 已完整实现 MCP 2024-11-05 协议。本平台不重复实现协议层,而是在 Spring AI 之上做三件事:(1) 动态 Tool 注册(替换 `@McpTool` 静态注解),(2) 数据源适配与模板执行,(3) 通用中间件管道。
---
## 项目结构
```
intent_plan/
├── docs/
│ └── superpowers/
│ └── specs/
│ ├── 2026-07-16-mcp-platform-plan.md # MCP 协议中台建设计划(主文档)
│ └── 2026-07-16-cross-border-mcp-boundary-design.md # 产线协作契约
├── mcp-server/ # MCP Server 核心(Spring Boot)
│ └── src/main/java/com/wangdian/mcp/
│ ├── protocol/ # MCP 协议层(Spring AI 集成)
│ ├── registry/ # Tool 注册中心(动态注册 + 版本管理)
│ ├── executor/ # Tool 执行器(校验 + 模板 + 映射)
│ ├── adapter/ # 数据源适配框架(SPI + 内置适配器)
│ ├── middleware/ # 中间件管道(鉴权/限流/缓存/降级)
│ ├── admin/ # 管理控制台 API(/admin/*)
│ └── sdk/ # 产线 SDK(Java)
├── mcp-server-admin/ # 管理控制台前端(Vue 3 + Arco Design)
├── mcp-sdk-python/ # 产线 SDK(Python)
├── docker-compose.yml # 本地开发环境
└── README.md
```
---
## 快速开始
> ⚠️ 项目开发中,以下为预期启动流程。
### 前置条件
- JDK 21 + Maven 3.9+
- Docker 20.10+ & Docker Compose 2.20+
- 公司内网访问(Nacos / MySQL / Redis)
### 本地开发
```bash
# 1. 克隆项目
git clone <repo-url> && cd intent_plan
# 2. 启动开发环境中间件
docker compose up -d mysql redis nacos-standalone
# 3. 初始化数据库
# 执行 docs/superpowers/specs/ 下的 DDL 脚本
# 4. 启动 MCP Server
cd mcp-server
mvn spring-boot:run
# 5. 验证 MCP 协议
curl -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}},"id":0}'
```
### 服务端口
| 服务 | 端口 | 说明 |
|------|:---:|------|
| MCP Server | 8080 | MCP JSON-RPC 端点 (`:8080/mcp`) |
| Admin Console | 8080 | 管理控制台 (`:8080/admin/*`) |
| MySQL | 3306 | 元数据存储 |
| Redis | 6379 | L2 缓存 |
| Nacos | 8848 | 配置中心 / 服务发现 |
---
## 产线接入
产线接入只需 3 步,无需平台开发介入:
### Step 1:注册数据源
```bash
curl -X POST http://mcp-platform:8080/api/v1/datasources \
-H "Content-Type: application/json" \
-H "X-API-Key: <your_api_key>" \
-d '{
"id": "ds_my_line",
"type": "MYSQL",
"connection": {
"host": "10.x.x.x", "port": 3306, "database": "my_db",
"credential_ref": "nacos:my-line/db-pwd"
},
"pool_config": { "min": 2, "max": 10, "timeout_sec": 30 }
}'
```
### Step 2:注册 Tool
```bash
curl -X POST http://mcp-platform:8080/api/v1/tools \
-H "Content-Type: application/json" \
-H "X-API-Key: <your_api_key>" \
-d '{
"id": "my_query",
"name": "my_query",
"description": "查询我的订单数据",
"parameters": { "type": "object", "properties": { "limit": { "type": "integer" } } },
"datasource_id": "ds_my_line",
"query": { "type": "SQL", "template": "SELECT * FROM orders LIMIT {{.limit}}" }
}'
```
### Step 3:Agent 调用
Tool 注册后 30s 内全实例生效。下游 Agent 通过标准 MCP 协议调用:
```
Agent → POST /mcp
{"jsonrpc":"2.0", "method":"tools/list", "id":1}
Agent ← {"jsonrpc":"2.0", "result":{"tools":[..., {"name":"my_query", ...}]}, "id":1}
Agent → POST /mcp
{"jsonrpc":"2.0", "method":"tools/call", "params":{"name":"my_query","arguments":{"limit":20}}, "id":2}
Agent ← {"jsonrpc":"2.0", "result":{"content":[{"type":"text","text":"[{\"col\":\"val\"}]"}]}, "id":2}
```
---
## 文档索引
| 文档 | 用途 | 读者 |
|------|------|------|
| [MCP 协议中台建设计划](docs/superpowers/specs/2026-07-16-mcp-platform-plan.md) | 平台架构、WBS 分解、里程碑、风险 | 全员 |
| [MCP 服务责任边界设计](docs/superpowers/specs/2026-07-16-cross-border-mcp-boundary-design.md) | 产线协作契约、接入协议 | 平台团队 + 产线团队 |
---
## 项目路线图
```mermaid
gantt
title MCP 协议中台路线图
dateFormat YYYY-MM-DD
axisFormat W%W
section M1 · 协议核心(W1)
Spring AI 集成 + 动态 Tool 注册 POC :m1, 2026-07-20, 5d
section M2 · 工具引擎(W2)
Tool Registry + Executor + Adapter :m2, after m1, 5d
section M3 · 生产就绪(W3)
Middleware Pipeline + 降级演练 :m3, after m2, 5d
section M4 · 管理控制台(W4-W5)
Admin Console + SDK :m4, after m3, 10d
section M5 · 上线(W6)
集成测试 + 压测 + 灰度 :m5, after m4, 5d
```
| 阶段 | 目标 | 时间 |
|------|------|:---:|
| **Phase 1 · MVP** | MCP 协议中台核心能力:动态 Tool 注册 + 5 种数据源适配器 + 中间件管道 + 管理控制台 + SDK | 6 周 |
| **Phase 2 · 增强** | 插件热加载 + OAuth2.0/RBAC/多租户 + 自定义 ClassLoader 隔离 + 更多适配器(ES/Mongo/GraphQL) | 3-6 月 |
| **Phase 3 · 商业化** | MCP Marketplace + 计费计量 + 多集群调度 + 数据脱敏镜像 | 6 月+ |
---
> **项目状态**:`设计阶段 · 待评审` | **团队**:2.5 人(TL + BE + FE 共享)| **周期**:6 周
>
> 有问题?先看 [MCP 协议中台建设计划](docs/superpowers/specs/2026-07-16-mcp-platform-plan.md)。
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues