模型上下文协议
理解 MCP(Model Context Protocol)协议的设计和实现,标准化 LLM 与工具的交互
模型上下文协议
每个模型提供商都有自己的工具调用格式。MCP 试图统一这一切——一个标准协议,让任何 LLM 都能使用任何工具。
类型: 概念 前置条件: Phase 11 Lesson 09(函数调用) 预计时间: ~30 分钟
学习目标
- 理解 MCP 的设计目标和架构
- 掌握 MCP 的核心概念:资源、工具、提示
- 理解 MCP 服务器的实现方式
- 分析 MCP 与传统函数调用的区别
MCP 架构
LLM 应用(Host)
↓ MCP 协议
MCP 客户端
↓ 标准化通信
MCP 服务器 ← 连接工具/数据源
MCP 定义了三个核心原语:
- 资源(Resources):应用可以向 LLM 提供的上下文数据
- 工具(Tools):LLM 可以调用的功能
- 提示(Prompts):预定义的提示模板
MCP 工具定义
# MCP 工具定义格式
{
"name": "database_query",
"description": "执行 SQL 查询并返回结果",
"inputSchema": {
"type": "object",
"properties": {
"sql": {
"type": "string",
"description": "要执行的 SQL 查询语句"
},
"limit": {
"type": "integer",
"description": "返回结果的最大行数",
"default": 100
}
},
"required": ["sql"]
}
}
MCP 服务器实现
from mcp.server import Server
from mcp.types import Tool, TextContent
server = Server("my-tools")
@server.list_tools()
async def list_tools():
"""列出可用工具"""
return [
Tool(
name="calculator",
description="执行数学计算",
inputSchema={
"type": "object",
"properties": {
"expression": {"type": "string", "description": "数学表达式"},
},
"required": ["expression"],
},
),
]
@server.call_tool()
async def call_tool(name, arguments):
"""执行工具调用"""
if name == "calculator":
try:
result = eval(arguments["expression"]) # 生产环境应使用安全解析器
return [TextContent(type="text", text=str(result))]
except Exception as e:
return [TextContent(type="text", text=f"计算错误: {e}")]
MCP vs 传统函数调用
| 维度 | 传统函数调用 | MCP |
|---|---|---|
| 标准化 | 每个提供商不同 | 统一协议 |
| 工具发现 | 手动定义 | 自动发现 |
| 传输方式 | API 内嵌 | 独立通信层 |
| 可组合性 | 低 | 高(工具可跨服务器组合) |
| 生态系统 | 孤立 | 共享 |
关键术语
| 术语 | 通俗说法 | 实际含义 |
|---|---|---|
| MCP | ”工具协议” | Model Context Protocol,标准化 LLM 与工具交互的协议 |
| MCP 服务器 | ”工具服务器” | 提供工具和资源的 MCP 服务端 |
| 资源 | ”上下文数据” | MCP 中应用向 LLM 提供的数据 |
| 工具发现 | ”自动找工具” | MCP 客户端自动获取服务器提供的工具列表 |
延伸阅读
- MCP 官方文档 — MCP 协议规范
- MCP Python SDK — Python MCP SDK
- MCP 服务器目录 — 官方 MCP 服务器集合