让你彻底弄懂MCP的一切


让你彻底弄懂 MCP 的一切

AI界的TYPE-C接口:模型上下文协议!

MCP 模型上下文协议(Model Context Protocol)是 AI 领域的一种 标准化通信协议,是由 Anthropic202411 月推出,旨在解决大语言模型(LLM)与外部工具、数据源之间的碎片化集成问题。其核心目标是充当 AI领域的USB-C接口,实现模型与工具的即插即用式连接,推动 AI 从被动生成文本转向主动执行任务。

MCP

1. 技术原理与架构

MCP 促进了AI 模型与外部世界之间的连接和交互。

MCP 的核心是通过 标准化接口 统一 AI 模型与外部资源的交互方式,技术架构分为三个核心组件:MCP Host(运行 AI 模型的应用程序;负责发起用户请求)、MCP Client(集成在 Host 内并与Server通信;负责将 LLM 的请求转换为标准化消息)、MCP Server(轻量级服务端;封装特定工具或数据源的功能;通过 JSON-RPC 2.0 协议暴露接口)。

MCP

> 工作流程

1. 工具发现ClientServer 获取可用工具列表,比如发送邮件等。2. 请求处理:用户查询+工具描述发送给 LLMLLM 决策需调用的工具及参数。3. 工具执行Client 调用对应 Server 执行操作,比如查询 GitHub 仓库。4. 结果整合Server 返回结果至 LLM,然后 LLM 生成自然语言响应给用户。

MCP

需要注意的是,MCP 选择 JSON-RPC 2.0 作为通信协议核心。主要原因是,解决 LLM 工具调用的核心痛点,比如极简的消息结构双向通信灵活性无状态协议适配性强错误处理机制生态成熟度

// 请求
{"jsonrpc":"2.0", "method":"tool.execute", "params":{...}, "id":1}

// 成功响应
{"jsonrpc":"2.0", "result":{...}, "id":1}

// 错误响应
{"jsonrpc":"2.0", "error":{"code":-32601, "message":"Method not found"}, "id":1}

MCP

> 通信模式

1. 本地模式(STDIO):Server 作为 Host 的子进程运行,通过 stdin/stdout 管道交换 JSON-RPC 消息,无需网络传输,适合敏感操作如文件访问。使用场景,比如代码编辑器插件需要访问本地文件系统、数据库凭证管理等执行敏感的操作。

# 启动Server(Python示例)
import mcp
server = mcp.StdioServer(tools=[FileTool(), DBQueryTool()])
server.start()

# Host配置(伪代码)
mcp_client = Client(server_path="python mcp_server.py")

**2. 远程模式(SSE)**:基于 HTTP Server-Sent Events 的单向流通信,Client 发送 POST 请求后,Server 通过事件流持续返回结果。支持云端服务调用,比如 Slack 消息推送、长时任务执行、多 Host 共享工具服务。

# 启动Server(监听8080端口)
mcp-server --tools github_tool --port 8080

# Client调用
curl -X POST http://localhost:8080/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "method": "github.search_repos",
    "params": {"query": "MCP protocol", "limit": 5}
  }'

MCP

2. 技术突破与优势

MCP 促进了AI 模型与外部世界之间的连接和交互。

1. 动态工具集成

支持运行时发现新工具(如临时接入 GitHub API),突破传统预定义函数的限制。

2. 上下文感知

跨多步任务保持状态(例如先查数据库再生成报告),避免传统 RAG 的单次检索局限。

3. 协议无关性

封装多种底层协议(HTTP/WebSocket),统一为 JSON 消息格式,降低开发成本。

4. 生态兼容性

OpenAIGoogle 等巨头已支持,推动协议成为行业标准。

3. 与传统技术对比

工具调用(Function Call) + 系统提示词(System Prompt)

MCP 和客户端对接的时候,根据客户端的不同,对接方式也有所不同。比如,Cline 依赖系统提示词不依赖 function call,而 5ire 则选择依赖 function call 功能没有使用系统提示词。所以 MCP 协议是一种灵活的协议,通用性能力更强,可以兼容市面上所有的大模型。

MCP 的本质是 AI 大模型的标准化工具箱。每个 MCP Server 通过 mcp.discover 方法返回结构化工具描述,其中,description 字段用自然语言描述功能,直接被注入 LLMprompt 中。参数类型兼容 JSON Schema,但 不强制严格校验

{
  "tools": [{
    "name": "send_email",
    "description": "发送邮件至联系人",  // LLM可读的语义描述
    "parameters": {                  // 参数Schema
      "recipient": {"type": "string", "description": "收件人邮箱"},
      "subject": {"type": "string"},
      "body": {"type": "string"}
    }
  }]
}

MCP

4. 简单开发的示例

协议:STDIO、SSE、Streamable HTTP!

MCP

下面是,官网 Python-SDK 给出的一个测试用例。即创建一个简单的 MCP 服务器,功能只包括计算器中的一个加法运算。这里使用的协议模式是 stdio,即标准输入输出。我们不需要启动 MCP Server 的服务,让客户端帮我们启动即可。

# 初始化我们自己的mcp服务
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Demo")

# tool声明下面这个函数是一个MCP工具
# tool类似于HTTP的RestAPI里面的Post方法
@mcp.tool()
def add(a: int, b: int) -> int:
    # 上面的类型修饰符必须写;有助于大模型理解传参类型
    # 注释必须写;给AI进行输入信息(必须语义正确)
    """Add two numbers"""
    return a + b


# resource类似于HTTP的RestAPI里面的Get方法
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
    """Get a personalized greeting"""
    return f"Hello, {name}!"


if __name__ == "__main__":
    mcp.settings.host = "0.0.0.0"
    mcp.settings.port = 8000

    mcp.run(transport="stdio")

MCP

之后,添加运行成功之后,可以将协议改为 sse 远程调用方式。这时就需要我们手动现将之前写好的 MCP Server 的服务启动起来,再通过 API 接口调用。

# uv run ./main.py(http://127.0.0.1:8000/sse)
if __name__ == "__main__":
    mcp.run(transport="sse")

MCP

后续,还支持使用 streamable-http 可流式传输 HTTP 协议。

# uv run ./main.py(http://127.0.0.1:8000/mcp)
if __name__ == "__main__":
    mcp.run(transport="streamable-http")

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录