陀螺匠 MCP 技术方案
通过MCP协议连接AI与企业业务系统,实现多向协作,让AI成为真正懂业务、能交付结果的"内部管理专家"
一、整体架构设计
1.1 架构分层
┌─────────────────────────────────────────────────────────┐
│ 客户端层 │
│ 网页 / 飞书 / APP / 企业微信 │
└─────────────────────┬───────────────────────────────────┘
│ HTTP 请求
┌─────────────────────▼───────────────────────────────────┐
│ 业务后端层 │
│ - 接收用户消息 │
│ - 从登录态获取 admin_id、website_id │
│ - 组装可用 Skill 列表(工具描述) │
│ - 转发给 Claude API │
│ - 接收 AI 工具调用指令,执行对应 Skill │
└──────────┬──────────────────────────┬────────────────────┘
│ Claude API │ 执行 Skill
┌──────────▼──────────┐ ┌──────────▼────────────────────┐
│ Claude AI │ │ Skill 层 │
│ - 理解用户意图 │ │ - getArticleList 文章列表 │
│ - 决策调用哪个Skill │◄──┤ - getLeadRanking 留电排行 │
│ - 多步骤自主编排 │ │ - sendFeishu 飞书通知 │
│ - 整理数据格式输出 │ │ - publishArticle 发布文章 │
└─────────────────────┘ │ - hospital-list 医院列表 │
│ - generate-article 生成文章 │
│ - 其他业务Skill... │
└──────────┬─────────────────────┘
│ HTTP 接口调用
┌──────────▼─────────────────────┐
│ 业务接口层 │
│ - /api/article/list │
│ - /api/lead/ranking │
│ - 飞书 Webhook │
│ - 其他业务接口... │
└────────────────────────────────┘
1.2 核心概念
| 概念 | 说明 |
|---|---|
| MCP | Model Context Protocol,AI与工具之间的标准通信协议 |
| Skill | 对业务接口的封装,等同于MCP Tool,是AI可调用的最小执行单元 |
| Claude API | AI决策引擎,负责理解意图、编排步骤、整理结果 |
| admin_id | 操作者身份标识,用于权限校验和租户隔离 |
| website_id | 站点标识,用于多站点数据隔离 |
二、双向协作机制
2.1 AI → 业务系统(AI主动获取数据)
用户发起自然语言需求
↓
AI分析意图,自主决策调用哪些Skill
↓
Skill调用对应业务接口
↓
数据返回给AI处理、整理、输出
适用场景:查询报表、生成排行、发布内容、多步骤自动化任务
2.2 业务系统 → AI(业务主动发起调用)
业务事件触发(定时任务 / 用户操作 / 审批节点)
↓
业务后端主动调用 Claude API
↓
AI执行指定Skill流程
↓
结果写回业务系统 或 推送飞书通知
适用场景:定时生成报表、批量内容生成、自动审批分析、事件驱动通知
三、Skill 设计规范
Skill = 描述(告诉AI何时用、用什么参数)+ 执行(调哪个接口、怎么处理返回)
Skill 标准结构
Skill文件
├── 触发描述 用自然语言描述该Skill的功能和触发时机
├── 入参定义 需要哪些参数(从上下文获取 or AI从对话中提取)
├── 接口调用 实际HTTP请求逻辑
└── 返回处理 结果格式化后返回给AI继续处理
现有 Skill 清单
| Skill名称 | 功能说明 | 对应接口 |
|---|---|---|
| web-list | 获取站点列表 | webList |
| hospital-list | 获取医院列表 | getHospital |
| doctor-list | 获取医生列表 | getDoctor |
| project-list | 获取项目列表 | getProject |
| section-list | 获取栏目列表 | getList |
| work-flow-list | 获取工作流列表 | workFlowList |
| generate-article | 生成文章内容 | 内部AI生成 |
| generate-flow-task | 工作流生成发文任务 | generateFlowTask |
| publish-article | 发布文章到站点 | publishArticle |
| title-prompt-list | 获取标题提示词列表 | titlePromptList |
四、完整执行流程详解
场景:客户说"看看上个月发布的文章的留电排行"
Step 1:用户发起请求
客户在网页/飞书输入:
"看看上个月发布的文章的留电排行"
Step 2:前端发送到后端
前端
↓
POST /api/chat
{
"message": "看看上个月发布的文章的留电排行",
"session_id": "abc123"
}
Step 3:后端组装上下文,发给 Claude API
后端从当前登录态取出用户信息,组装完整请求:
json
{
"model": "claude-sonnet-4-6",
"system": "你是企业内部管理专家。当前操作者 admin_id=1023,website_id=5",
"messages": [
{
"role": "user",
"content": "看看上个月发布的文章的留电排行"
}
],
"tools": [
{
"name": "getArticleList",
"description": "获取指定时间段内发布的文章列表,支持按站点、栏目、时间筛选,返回文章ID、标题、发布时间",
"input_schema": {
"website_id": "string",
"start_date": "string",
"end_date": "string"
}
},
{
"name": "getLeadRanking",
"description": "根据文章ID列表,获取每篇文章的留电数量,按留电数从高到低返回排行",
"input_schema": {
"website_id": "string",
"article_ids": "array",
"start_date": "string",
"end_date": "string"
}
},
{
"name": "sendFeishu",
"description": "将内容发送到飞书群或指定成员",
"input_schema": {
"content": "string",
"target": "string"
}
}
]
}
关键说明:
admin_id和website_id后端自动从登录态注入,用户无需填写tools列表告诉 Claude 当前有哪些能力可以调用- Claude 本身没有记忆,每次必须携带完整上下文
Step 4:Claude 分析意图,规划执行链
Claude 收到请求后,自主分析推理:
意图拆解:
"上个月" → 计算日期范围:2026-05-01 ~ 2026-05-31
"发布的文章" → 需要先查文章列表,得到文章ID
"留电排行" → 拿到文章ID后,再查每篇文章的留电数据
执行规划:
第一步:调 getArticleList,获取上月发布的所有文章ID
第二步:调 getLeadRanking,查这些文章的留电排行
(用户没说发飞书,所以不调 sendFeishu,直接回复用户)
Claude 返回第一个工具调用指令:
json
{
"type": "tool_use",
"id": "tool_001",
"name": "getArticleList",
"input": {
"website_id": "5",
"start_date": "2026-05-01",
"end_date": "2026-05-31"
}
}
Step 5:后端执行 getArticleList Skill
后端收到工具调用指令
↓
执行 getArticleList Skill
↓
Skill 内部发起 HTTP 请求:
GET /api/article/list
?website_id=5
&start_date=2026-05-01
&end_date=2026-05-31
↓
业务接口返回数据:
{
"total": 42,
"list": [
{ "id": 1011, "title": "北京协和医院隆鼻项目介绍", "publish_time": "2026-05-03" },
{ "id": 1025, "title": "双眼皮手术恢复期注意事项", "publish_time": "2026-05-07" },
{ "id": 1033, "title": "玻尿酸填充和自体脂肪的区别", "publish_time": "2026-05-12" },
{ "id": 1047, "title": "热玛吉适合什么年龄段", "publish_time": "2026-05-18" },
{ "id": 1056, "title": "吸脂手术前后对比案例分享", "publish_time": "2026-05-22" }
// ... 共42篇
]
}
↓
Skill 将数据返回给后端
↓
后端将结果作为 tool_result 发回给 Claude
Step 6:Claude 收到文章列表,决策第二步
Claude 收到42篇文章数据
↓
提取所有文章ID:[1011, 1025, 1033, 1047, 1056, ...]
↓
决策:调用 getLeadRanking 查留电数据
Claude 返回第二个工具调用指令:
json
{
"type": "tool_use",
"id": "tool_002",
"name": "getLeadRanking",
"input": {
"website_id": "5",
"article_ids": [1011, 1025, 1033, 1047, 1056, "...共42个"],
"start_date": "2026-05-01",
"end_date": "2026-05-31"
}
}
Step 7:后端执行 getLeadRanking Skill
后端收到工具调用指令
↓
执行 getLeadRanking Skill
↓
Skill 内部发起 HTTP 请求:
POST /api/lead/ranking
{
"website_id": "5",
"article_ids": [1011, 1025, 1033, ...],
"start_date": "2026-05-01",
"end_date": "2026-05-31"
}
↓
业务接口返回数据(按留电数排序):
[
{ "article_id": 1033, "title": "玻尿酸填充和自体脂肪的区别", "leads": 89, "views": 3420 },
{ "article_id": 1011, "title": "北京协和医院隆鼻项目介绍", "leads": 76, "views": 2890 },
{ "article_id": 1056, "title": "吸脂手术前后对比案例分享", "leads": 54, "views": 1960 },
{ "article_id": 1047, "title": "热玛吉适合什么年龄段", "leads": 41, "views": 2100 },
{ "article_id": 1025, "title": "双眼皮手术恢复期注意事项", "leads": 38, "views": 1750 },
// ... 共42篇
]
↓
Skill 将数据返回给后端
↓
后端将结果作为 tool_result 发回给 Claude
Step 8:Claude 整理数据,生成最终回复
Claude 收到留电排行数据
↓
自动整理:
- 格式化成排行榜
- 计算总留电数、均值
- 标注高转化率文章
- 提炼关键洞察
↓
生成回复内容,直接返回给用户
Claude 最终回复:
📊 上个月(2026年5月)文章留电排行
共发布 42 篇文章,累计留电 687 条
排名 文章标题 留电数 浏览量 转化率
────────────────────────────────────────────────────────
🥇 1 玻尿酸填充和自体脂肪的区别 89条 3420次 2.6%
🥈 2 北京协和医院隆鼻项目介绍 76条 2890次 2.6%
🥉 3 吸脂手术前后对比案例分享 54条 1960次 2.8% ⬆️
4 热玛吉适合什么年龄段 41条 2100次 2.0%
5 双眼皮手术恢复期注意事项 38条 1750次 2.2%
...
💡 洞察:
- 案例类文章(吸脂对比)转化率最高,达 2.8%
- 玻尿酸和隆鼻类内容流量和留电双高,建议持续生产
- 共 18 篇文章零留电,建议检查落地页咨询入口是否正常
Step 9:结果返回用户界面
Claude 回复内容
↓
后端返回给前端
↓
用户在网页/飞书看到完整排行报告
五、完整时序图
用户 前端 后端 Claude 业务接口
│ │ │ │ │
│─发消息─►│ │ │ │
│ │─POST────►│ │ │
│ │ │─组装上下文────►│ │
│ │ │ admin_id │ │
│ │ │ website_id │ │
│ │ │ Skill列表 │ │
│ │ │ │ │
│ │ │◄─工具调用指令──│ │
│ │ │ getArticleList│ │
│ │ │──────────────────────────►│
│ │ │◄──────────────────────────│
│ │ │ 42篇文章列表 │
│ │ │─tool_result──►│ │
│ │ │ │ │
│ │ │◄─工具调用指令──│ │
│ │ │ getLeadRanking│ │
│ │ │──────────────────────────►│
│ │ │◄──────────────────────────│
│ │ │ 留电排行数据 │
│ │ │─tool_result──►│ │
│ │ │ │ │
│ │ │◄─整理后的排行榜回复─────────│
│ │◄─响应────│ │ │
│◄─显示───│ │ │ │
六、AI决策 vs 后端执行 --- 职责边界
| 职责 | 由谁完成 |
|---|---|
| 理解"上个月"是哪个日期范围 | Claude |
| 决定先查文章、再查留电的执行顺序 | Claude |
| 判断用户没说发飞书所以不发 | Claude |
| 整理数据格式、计算转化率、提炼洞察 | Claude |
| 实际发起 HTTP 请求调业务接口 | Skill(后端执行) |
| 校验 admin_id 权限 | 业务接口 |
| 保证A公司看不到B公司数据 | 业务接口 + admin_id 隔离 |
七、权限与多租户设计
每次请求后端自动注入:
admin_id → 确定操作者身份和数据权限范围
website_id → 确定操作的站点范围
业务接口根据这两个参数:
- 只返回该租户下的数据
- 校验该用户是否有操作权限
- A公司数据绝对不会出现在B公司的AI响应中
用户无感知,无需手动填写任何权限参数
八、为什么不直接用接口,而要用MCP
| 维度 | 传统接口调用 | MCP + Skill |
|---|---|---|
| 调用时机 | 开发者写死,固定触发 | AI根据理解自主决定 |
| 执行顺序 | 固定流程,不可变 | AI动态编排,按需组合 |
| 参数来源 | 代码里定义好 | AI从自然语言中提取 |
| 新增需求 | 改代码、改流程 | 加一个Skill描述即可 |
| 用户操作 | 点按钮、填表单 | 直接说需求 |
| 多步骤任务 | 需要开发多个页面 | AI自动串联多个Skill |
核心差异:接口满足固定的、已知的业务流程;MCP满足自然语言驱动的、动态组合的业务流程。
九、部署方案
方案一:SaaS 模式(平台统一运营)
统一部署后端 + Skill库 + Claude API
↓
客户通过网页/飞书入口使用
↓
按 admin_id 做租户隔离
↓
可按调用量、功能模块向客户收费
方案二:源码交付模式
客户获得完整源码
↓
配置文件填入以下参数:
CLAUDE_API_KEY=sk-ant-xxx # AI服务
DB_HOST=xxx # 业务数据库
FEISHU_WEBHOOK=https://xxx # 飞书通知
↓
一键部署,AI能力随系统启动
支持替换的AI服务:
| AI服务 | 适用场景 |
|---|---|
| Claude API(推荐) | 效果最佳,推理能力强 |
| OpenAI GPT | 国际化客户 |
| 文心 / 通义 / 智谱 | 国内合规要求 |
| Ollama / vLLM | 私有化、数据不出内网 |
方案三:私有化部署(大客户/政企)
全部部署在客户内网
↓
AI使用本地模型(Ollama等)
↓
数据不出内网,满足等保/合规要求
↓
业务系统、AI、Skill全部内网运行
十、核心价值总结
客户买的不是AI技术本身,是一套已经封装好业务逻辑的Skill库,加上能把这些Skill智能串联的AI对话入口。
- AI 负责:理解需求、决策步骤、整理结果
- Skill 负责:执行具体操作
- 接口 负责:提供真实业务数据
- 权限 负责:保障数据安全隔离
用户只需说一句话,系统自动完成过去需要多个页面、多次点击才能完成的操作。