MCP是什么?为什么需要它?

Model Context Protocol(MCP)是Anthropic在2024年底提出的开放协议,目标是标准化AI模型与外部工具/数据源的连接方式。在MCP之前,每个Agent框架都自定义工具调用接口——LangChain有tools格式,OpenAI有function calling schema,AutoGPT又是一套——导致工具开发者需要为每个框架写适配层。

MCP的价值主张很简单:一次开发,处处可用。写一个MCP Server,任何支持MCP的客户端都能调用。

协议架构

客户端-服务器模型

MCP采用客户端-服务器架构:

[Host App (Claude Desktop)]
    ├── MCP Client A ←→ [MCP Server A: 文件系统]
    ├── MCP Client B ←→ [MCP Server B: 数据库]
    └── MCP Client C ←→ [MCP Server C: GitHub]
  • Host:集成MCL客户端的应用(如Claude Desktop、IDE、Agent框架)
  • MCP Client:在Host内部,每个连接维护一个客户端实例
  • MCP Server:提供工具、资源、提示的独立进程

传输层

MCP支持两种传输方式:

  1. stdio:标准输入输出,适合本地工具(文件系统、本地数据库)
  2. SSE(Server-Sent Events):HTTP+SSE,适合远程服务

JSON-RPC 2.0作为消息格式,请求和响应都是标准的JSON-RPC消息。

消息类型

MCP定义了三种核心原语:

原语方向用途
Tools模型→Server执行操作(查询数据库、调API)
ResourcesServer→模型提供数据(文件内容、配置)
PromptsServer→用户提供预设提示模板

工具定义格式

MCP Server通过tools/list端点声明可用工具:

{
  "name": "search_docs",
  "description": "搜索技术文档库",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "搜索关键词"
      },
      "limit": {
        "type": "integer",
        "default": 10,
        "description": "返回结果数量"
      }
    },
    "required": ["query"]
  }
}

这个格式与OpenAI的function calling schema高度兼容,降低了迁移成本。

交互流程

一个完整的MCP工具调用流程:

  1. 初始化:Client连接Server,发送initialize请求,协商协议版本和能力
  2. 发现工具:Client发送tools/list,获取可用工具列表
  3. 模型决策:Host将工具描述注入prompt,模型决定是否调用工具
  4. 执行工具:模型输出工具调用请求,Client通过tools/call转发给Server
  5. 返回结果:Server执行工具,返回结果给Client,Client传给模型
  6. 模型生成:模型基于工具结果生成最终回答

生态现状

已有MCP Server

  • filesystem:本地文件读写
  • github:GitHub API封装
  • postgres/slack:数据库和消息平台集成
  • puppeteer:浏览器自动化
  • memory:知识图谱记忆存储

客户端支持

  • Claude Desktop:最早的原生支持
  • Cursor、Windsurf等AI IDE:已集成
  • LangChain/LangGraph:通过适配层支持
  • 开源Agent框架逐步跟进

实践:自建MCP Server

以Python SDK为例,创建一个简单的查询工具:

from mcp.server import Server
from mcp.types import Tool, TextContent

server = Server("my-weather-server")

@server.list_tools()
async def list_tools():
    return [Tool(
        name="get_weather",
        description="查询城市天气",
        inputSchema={
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"]
        }
    )]

@server.call_tool()
async def call_tool(name, arguments):
    if name == "get_weather":
        city = arguments["city"]
        # 实际调用天气API
        return [TextContent(type="text", text=f"{city}今天晴,25°C")]

MCP vs Function Calling

维度MCPOpenAI Function Calling
标准化开放协议,跨厂商厂商标准
传输支持远程(SSE)仅API调用
动态发现运行时发现工具预定义工具列表
生态开放,社区驱动封闭在OpenAI生态

总结

MCP协议正在成为AI Agent连接外部世界的事实标准。它的设计哲学类似USB——一个统一的接口标准让无数设备即插即用。对于Agent开发者,MCP意味着可以专注于构建工具而不是适配框架;对于工具开发者,MCP意味着一次开发即可服务所有Agent生态。2026年,MCP的广泛采用将是Agent生态走向繁荣的关键基础设施。