Files
xiaoqu_mcp_service/xiaoqu-agent-service/doc/mcp-external-integration-spec.md
T

141 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 小趣 MCP 外部接入规范
> 版本:v1.0(2026-09-15)
> 适用对象:CRM 等外部系统的后端集成方
> 状态:当前生效。认证换发流程(第 3 节)为小趣自定义扩展,后续可能升级为 OAuth 2.1 / MCP 标准授权,届时本规范会发新版并保留兼容期。
## 1. 服务边界
小趣 MCP 只做三件事:**供数据、供身份、守权限**。
- 供数据:查询工具(QUERY)+ 增量同步工具(SYNC),保证准确、一致、可恢复
- 供身份:Token 签发 / 吊销 / 自检
- 守权限:服务 Token 按授权 scope 白名单限工具,个人 Token 实时 ACL 行过滤
到期规则计算、AI 决策、消息推送、经营事项流转**不属于** MCP 职责,由接入方或小趣 AI 系统自行实现,MCP 不提供也不预留相关字段。
## 2. 接入端点与协议
| 项 | 值 |
|---|---|
| MCP 端点(生产) | `https://agent.ququclean.com/mcp` |
| 传输协议 | MCP Streamable HTTP(JSON-RPC 2.0) |
| 协议版本头 | `MCP-Protocol-Version: 2025-06-18` |
| 响应格式 | SSE(`text/event-stream`),取 `data:` 行解析为 JSON-RPC 消息 |
| 会话 | `initialize` 响应头返回 `Mcp-Session-Id`,后续请求必须携带 |
### 2.1 标准握手序列
```text
POST /mcp initialize(JSON-RPC,带 id)
← 响应头取 Mcp-Session-Id,data: 行为 initialize 结果
POST /mcp notifications/initialized(无 id,带 Mcp-Session-Id)
← 202,无响应体
POST /mcp tools/list # 自动发现工具及输入 JSON Schema
POST /mcp tools/call # 按 Schema 调用具体工具
```
请求统一头:
```http
Authorization: Bearer <xqak-...>
Content-Type: application/json
Accept: application/json, text/event-stream
MCP-Protocol-Version: 2025-06-18
Mcp-Session-Id: <initialize 返回的会话 ID>
X-Mcp-Schema-Version: 2
```
注意:`notifications/initialized` 生效后再发 `tools/list`,否则偶发空响应,重试即可。
## 3. 认证与凭证管理(自定义扩展)
### 3.1 两类凭证
| 凭证 | 形态 | 用途 | 获取方式 |
|---|---|---|---|
| 服务密钥 `X-Open-Key` | `xqok-...` | 换取访问 Token,**不是** MCP Token | 管理员在管理后台「服务密钥」页创建,明文只展示一次 |
| 访问 Token | `xqak-...` | 放进 `Authorization: Bearer` 调 `/mcp` | 用服务密钥调 ensure 接口换取,长期有效 |
### 3.2 换取 Token
```http
POST https://agent.ququclean.com/api/open/token/ensure
X-Open-Key: <服务密钥>
Content-Type: application/json
{"scopeCode":"sync","principalType":"service","serviceName":"<你的系统名>"}
```
响应 `token` 字段即访问 Token。该接口幂等:同一 subject 重复调用返回同一 Token。
个人 Token(前台点查场景):同接口传 `{"mobile": "<人员手机号>"}`,幂等返回该人员的个人 Token(`user_delegated`),人员停用后 60 秒内自动失效。
### 3.3 凭证安全要求
- 服务密钥与 Token 只允许存接入方后端的密钥管理设施或环境变量,**禁止**下发浏览器/App、禁止写入日志、禁止提交代码库
- 密钥泄露:通知小趣管理员在管理后台执行「轮换」(旧密钥立即失效)或「吊销」
- 数据库只存密钥哈希,创建/轮换弹窗关闭后明文不可找回
## 4. 工具分类与调用约定
### 4.1 工具发现
`tools/list` 返回当前 Token 可见的全部工具及入参 JSON Schema。**可见性由 Token 绑定的 scope 白名单决定**——未授权的工具不出现在列表中,接入方应按 `tools/list` 结果动态适配,不要硬编码工具清单。
### 4.2 统一输出信封
所有工具返回 `structuredContent`,`X-Mcp-Schema-Version: 2` 时为新信封:
```json
{ "schema_version": 2, "request_id": "...", "data": { ... } }
```
- 不带该请求头返回 v1 老结构(兼容期内有效)
- `request_id` 必须记入接入方日志,双向排查用;Token 与手机号明文不落日志
### 4.3 通用入参约束
- 所有工具**禁止传 `tenant_id` / `scope`**,租户从 Token 推导,传了返回 `PERMISSION_DENIED`
- 分页类工具 `limit` 上限 200,超出截断并在响应带 notice
## 5. 错误码与重试规则
| 错误码 | 含义 | 接入方动作 |
|---|---|---|
| `UNAUTHENTICATED` | Token 吊销 / 人员停用 | 重新 ensure 取 Token;仍失败则告警人工介入 |
| `PERMISSION_DENIED` | 工具不在 Token scope 白名单,或传了 tenant_id | 检查绑定与入参,**不要**重试 |
| `RATE_LIMITED` | 触发限流 | 指数退避重试(1s/2s/4s…上限 60s) |
| `SYNC_CURSOR_EXPIRED` | 同步快照/游标过期或被篡改 | 清空本地镜像,`syncToken=null` 全量重建 |
| `INVALID_ARGUMENT` | 入参不符合 Schema | 修正后重发,不要原样重试 |
限流分档:SYNC 工具独立配额档,与 QUERY 互不占配额。
## 6. 增量同步协议(SYNC 工具)
工具:`users.changes.list` / `properties.changes.list` / `contracts.changes.list`。
入参仅三个:`syncToken`、`cursor`、`limit`。
协议语义:
- **快照**:每轮同步签发 `snapshot_id` + `data_cutoff_at`,同一快照内翻页结果稳定
- **游标**:页内 `(modify_time, id)` 复合游标;`has_more=true` 时带 `next_cursor` 翻页
- **续传**:仅末页(`has_more=false`)签发 `next_sync_token`;中断后从本地保存的 `sync_token + cursor` 继续,不重不漏
- **tombstone**:`deleted_at` 非空为删除标记,本地镜像应标记删除
- **版本字段**:`version` 由 `modify_time` 派生,仅用于调试核对,禁止用作并发控制
接入方必须持久化每页的 `sync_token + cursor`(断点恢复),实现 `SYNC_CURSOR_EXPIRED` 全量重建分支,并在扫描启动前用 `integration.context.get` 校验 `principal_type=tenant_service` 且 capability 含 SYNC,拿错个人 Token 时拒绝执行扫描。
## 7. 交付物与责任划分
| 小趣侧交付 | 接入方自负责 |
|---|---|
| 本规范(契约定义) | MCP 客户端实现(可用任意标准 MCP Client SDK) |
| 管理后台服务密钥创建/轮换/吊销 | 密钥与 Token 的安全存储 |
| 工具清单及入参 Schema(`tools/list` 自动发现) | 本地镜像 upsert / 逻辑删除 |
| 错误码语义与限流档位 | 定时任务调度、游标持久化、重试退避 |
| `request_id` 双侧排查支持 | 业务规则、AI 决策、推送 |
详细逐步接入示例(含报文样例与伪代码)见《CRM 接入手册》`doc/crm-integration-guide.md`。