MCP 协议深度解析:AI 领域的 USB-C 接口

MCP 协议深度解析:AI 领域的 USB-C 接口

你用过多少个 AI 应用?ChatGPT、Claude、Cursor、Windsurf......每个都想连接外部工具。如果每个 AI 应用都要针对每个工具写一套集成代码,这活儿还干得下去吗?

从一个痛点说起

我做 NVC 项目时遇到一个现实问题:AI 需要调用各种工具------查数据库、发邮件、调接口。每个工具都有自己的 API 格式,每个 AI 框架都有自己的调用方式。

假设你有 M 个 AI 应用,要连接 N 个外部工具。传统做法需要写 M × N 套集成代码。5 个应用 × 10 个工具 = 50 套代码。Anthropic 在 2024 年 11 月发布 MCP(Model Context Protocol),直接把这个问题干成了 M + N。

MCP 是什么?

MCP 全称 Model Context Protocol,AI 领域的 USB-C 接口

USB-C 统一了物理接口,MCP 统一了 AI 应用与外部工具的交互方式。AI 应用不用关心工具怎么实现的,工具也不用关心 AI 应用是哪家的。

复制代码
传统方式:M × N 个集成
┌─────────┬─────────┬─────────┐
│ App1    │ App2    │ App3    │
├─────────┼─────────┼─────────┤
│ Tool1   │ Tool1   │ Tool1   │
│ Tool2   │ Tool2   │ Tool2   │
└─────────┴─────────┴─────────┘

MCP 方式:M + N 个适配
┌─────────┬─────────┬─────────┐
│ Client1 │ Client2 │ Client3 │
└────┬────┴────┬────┴────┬────┘
     └─────────┼─────────┘
               │ MCP 协议
     ┌─────────┼─────────┐
┌────┴────┬────┴────┬────┴────┐
│ Server1 │ Server2 │ Server3 │
└─────────┴─────────┴─────────┘

MCP 的架构

三层架构:Host 管全局,Client 管连接,Server 管干活
#mermaid-svg-hG6rIXbsBSVVPCEM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hG6rIXbsBSVVPCEM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hG6rIXbsBSVVPCEM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hG6rIXbsBSVVPCEM .error-icon{fill:#552222;}#mermaid-svg-hG6rIXbsBSVVPCEM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hG6rIXbsBSVVPCEM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hG6rIXbsBSVVPCEM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hG6rIXbsBSVVPCEM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hG6rIXbsBSVVPCEM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hG6rIXbsBSVVPCEM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hG6rIXbsBSVVPCEM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hG6rIXbsBSVVPCEM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hG6rIXbsBSVVPCEM .marker.cross{stroke:#333333;}#mermaid-svg-hG6rIXbsBSVVPCEM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hG6rIXbsBSVVPCEM p{margin:0;}#mermaid-svg-hG6rIXbsBSVVPCEM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hG6rIXbsBSVVPCEM .cluster-label text{fill:#333;}#mermaid-svg-hG6rIXbsBSVVPCEM .cluster-label span{color:#333;}#mermaid-svg-hG6rIXbsBSVVPCEM .cluster-label span p{background-color:transparent;}#mermaid-svg-hG6rIXbsBSVVPCEM .label text,#mermaid-svg-hG6rIXbsBSVVPCEM span{fill:#333;color:#333;}#mermaid-svg-hG6rIXbsBSVVPCEM .node rect,#mermaid-svg-hG6rIXbsBSVVPCEM .node circle,#mermaid-svg-hG6rIXbsBSVVPCEM .node ellipse,#mermaid-svg-hG6rIXbsBSVVPCEM .node polygon,#mermaid-svg-hG6rIXbsBSVVPCEM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hG6rIXbsBSVVPCEM .rough-node .label text,#mermaid-svg-hG6rIXbsBSVVPCEM .node .label text,#mermaid-svg-hG6rIXbsBSVVPCEM .image-shape .label,#mermaid-svg-hG6rIXbsBSVVPCEM .icon-shape .label{text-anchor:middle;}#mermaid-svg-hG6rIXbsBSVVPCEM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hG6rIXbsBSVVPCEM .rough-node .label,#mermaid-svg-hG6rIXbsBSVVPCEM .node .label,#mermaid-svg-hG6rIXbsBSVVPCEM .image-shape .label,#mermaid-svg-hG6rIXbsBSVVPCEM .icon-shape .label{text-align:center;}#mermaid-svg-hG6rIXbsBSVVPCEM .node.clickable{cursor:pointer;}#mermaid-svg-hG6rIXbsBSVVPCEM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hG6rIXbsBSVVPCEM .arrowheadPath{fill:#333333;}#mermaid-svg-hG6rIXbsBSVVPCEM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hG6rIXbsBSVVPCEM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hG6rIXbsBSVVPCEM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hG6rIXbsBSVVPCEM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hG6rIXbsBSVVPCEM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hG6rIXbsBSVVPCEM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hG6rIXbsBSVVPCEM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hG6rIXbsBSVVPCEM .cluster text{fill:#333;}#mermaid-svg-hG6rIXbsBSVVPCEM .cluster span{color:#333;}#mermaid-svg-hG6rIXbsBSVVPCEM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hG6rIXbsBSVVPCEM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hG6rIXbsBSVVPCEM rect.text{fill:none;stroke-width:0;}#mermaid-svg-hG6rIXbsBSVVPCEM .icon-shape,#mermaid-svg-hG6rIXbsBSVVPCEM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hG6rIXbsBSVVPCEM .icon-shape p,#mermaid-svg-hG6rIXbsBSVVPCEM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hG6rIXbsBSVVPCEM .icon-shape .label rect,#mermaid-svg-hG6rIXbsBSVVPCEM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hG6rIXbsBSVVPCEM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hG6rIXbsBSVVPCEM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hG6rIXbsBSVVPCEM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} MCP Host

AI 应用/IDE
MCP Client

协议适配层
MCP Server 1

数据库工具
MCP Server 2

文件系统
MCP Server 3

API 调用

  • MCP Host:宿主应用(Claude Desktop、Cursor),管理多个 Client,处理认证和权限
  • MCP Client:协议适配层,每个 Client 连接一个 Server,维护会话状态
  • MCP Server:真正干活的,暴露具体工具能力

MCP 的三大能力

1. Tools(工具调用)

Tools 让 AI 模型主动调用 外部工具。关键词:模型控制------AI 自己决定什么时候调用、调用哪个、传什么参数。

json 复制代码
{
  "name": "query_database",
  "description": "执行 SQL 查询",
  "inputSchema": {
    "type": "object",
    "properties": {
      "sql": { "type": "string", "description": "SQL 查询语句" }
    },
    "required": ["sql"]
  }
}

2. Resources(数据读取)

Resources 让 AI 应用读取 外部数据。和 Tools 的区别:应用控制,不是模型控制。用户在 Claude Desktop 里拖入文件,通过 Resources 机制读取,模型不会主动"去读文件"。

3. Prompts(提示模板)

Prompts 提供可复用的提示模板,让用户快速发起特定任务。用得相对少,但某些场景下很有用。

传输机制

MCP 支持两种传输方式:

  • stdio(本地):Server 作为子进程启动,通过 stdin/stdout 通信,简单高效
  • Streamable HTTP(远程):Server 作为独立服务运行,适合云端部署和跨网络访问

MCP vs Function Calling

这两个概念经常被搞混:

  • Function Calling:LLM 的能力,让模型结构化地输出工具调用意图。模型不直接执行工具,只是输出 JSON。
  • MCP:应用层的协议,定义 Client 和 Server 之间的通信标准。

两者是互补关系

复制代码
用户提问 → LLM 思考(FC 输出意图) → 应用层解析 → MCP Client → Server 执行 → 结果返回 LLM

Function Calling 是大脑的决策能力("我要吃饭"),MCP 是手的执行能力(拿起筷子、夹菜)。大脑不需要知道手的肌肉怎么收缩。

实战:NVC 项目的工具体系

NVC 是一个 NVC(非暴力沟通)练习平台,基于 Spring Boot 4.0 + Spring AI 2.0 构建。我最终没用 MCP,但架构思想一致。

ToolExecutor 对应 tools/list

NVC 的 10 个工具通过 Spring Bean 自动注册,ToolExecutor 统一管理:

工具 职责
RagSearchTool RAG 知识检索(pgvector)
WikiSearchTool / WikiWriteTool Wiki 搜索与写入
ProfileQueryTool / ProfileUpdateTool 用户档案查询与更新
DashboardQueryTool 练习数据查询
EvaluateNvcTool NVC 表达评估
PracticeStartTool 开始练习
ScenarioGenerateTool / ScenarioSearchTool 场景生成与搜索

每个工具调用都经过 7 层 Hook 链(限流、权限、缓存、错误增强、评估触发、持久化、日志),这是 MCP 标准协议做不到的。

为什么没直接用 MCP?

1. 单 Host 场景:NVC 所有工具都在同一 JVM 进程(Spring Boot 单体),不需要跨进程通信。

2. Hook 链需求:NVC 需要在工具调用前后执行 7 层 Hook(限流用滑动窗口、权限检查用户是否完成过练习、缓存 dashboard_query 5 分钟等),MCP 标准协议没提供这种扩展点。

3. Spring AI 原生支持:NVC 基于 Spring AI 2.0 构建,用原生 ToolCallback 方式更自然,还能利用 Java 21 虚拟线程做并行工具调用。

复制代码
MCP 标准架构:
┌─────────┐     ┌─────────┐     ┌─────────┐
│  Host   │ ──→ │ Client  │ ──→ │ Server  │
└─────────┘     └─────────┘     └─────────┘

NVC 自建架构:
┌───────────────────────────────────────┐
│            NVC Agent                  │
│  ┌─────────────────────────────────┐  │
│  │         ToolExecutor            │  │
│  │  ┌───────┬───────┬───────────┐  │  │
│  │  │rag_   │wiki_  │evaluate_  │  │  │
│  │  │search │search │nvc        │  │  │
│  │  ├───────┼───────┼───────────┤  │  │
│  │  │profile│dash-  │scenario_  │  │  │
│  │  │_query │board  │generate   │  │  │
│  │  └───────┴───────┴───────────┘  │  │
│  └─────────────────────────────────┘  │
│  ┌─────────────────────────────────┐  │
│  │  7层 Hook 链                     │  │
│  │  限流→权限→缓存→错误增强→        │  │
│  │  评估触发→持久化→日志            │  │
│  └─────────────────────────────────┘  │
└───────────────────────────────────────┘

什么时候该用 MCP?

适合用 MCP:构建通用 AI 平台、工具需要被多个应用共享、复用社区 Server、云端部署。

不需要用 MCP:单应用单 Host、需要深度定制 Hook/缓存/重试、已有成熟工具框架、对延迟敏感。

写在最后

MCP 解决的是 AI 工具生态的标准化问题。但标准化不是万能的,NVC 选择自建工具体系,不是因为 MCP 不好,而是场景不匹配。

理解协议背后的设计思想,比记住协议细节更重要。下次遇到"要不要用 XX 协议"的问题时,先问自己:我的场景真的需要这个标准化吗?

相关推荐
动物园猫1 小时前
无人机灾害场景人体目标检测数据集:10,000张图像 | 目标检测
人工智能·目标检测·无人机
神奇霸王龙1 小时前
AgentDesk 配置 Codex+ selltoken 中转 API 实测教程(2026 年 8 月更新)
人工智能·ai·ai编程·策略模式·codex·agentdesk
3A Cloud1 小时前
Architecture Diagram Skill 详细介绍
人工智能·笔记·信息可视化
123_不打狼1 小时前
AI Agent可观测性:破解多步推理黑盒的技术实践
大数据·人工智能
敲代码的玉米C1 小时前
Agent 做 IDE
前端·人工智能·开源
accept 99%1 小时前
python版提取 PDF 的常用第三方库与工具
开发语言·python·pdf
lzhdim1 小时前
C# 通过 Windows API 实现进程内存读写操作
开发语言·windows·c#
敲代码的玉米C1 小时前
补 322 个测试,挖出 19 个 bug
前端·人工智能·架构