教程
2026年5月10日
阅读时间 22 分钟
MCP 3.0协议详解:构建AI与工具的桥梁
深入了解Model Context Protocol 3.0,学习如何构建智能工具,让AI能够安全、可靠地与外部世界交互。
MCP简介
Model Context Protocol(MCP)是由Anthropic开发的开源协议,它定义了AI助手与外部工具和数据源交互的标准方式。MCP 3.0是该协议的最新版本,带来了重大改进,包括更完善的安全模型、更丰富的资源管理能力和更灵活的工具定义方式。
# MCP的核心目标
1. 标准化AI与工具的交互方式
2. 提供安全、可控的工具调用机制
3. 支持上下文信息的高效传递
4. 跨平台、跨语言的兼容性
5. 可扩展的插件架构
核心概念
MCP采用客户端-服务器架构,基于JSON-RPC协议进行通信。核心概念包括资源(Resources)、工具(Tools)和提示模板(Prompts)三大部分,它们共同构成了AI与应用之间交互的基础设施。
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {
"name": "MyClient",
"version": "1.0.0"
}
}
}
Server开发
资源是MCP的核心概念之一,它代表了AI可以访问的数据或信息源。开发MCP服务器时,首先需要定义服务器可以提供哪些资源和服务。
{
"resources": [
{
"uri": "file:///home/user/documents/report.md",
"name": "Project Report",
"description": "Q4 2026 project report",
"mimeType": "text/markdown"
},
{
"uri": "git://repo/main",
"name": "Git Repository",
"description": "Main project repository",
"mimeType": "application/json"
}
]
}
Client开发
工具是AI可以调用的功能或操作,MCP提供了标准化的工具定义方式。在客户端开发中,需要正确处理服务器提供的工具列表,并根据AI的需求发起工具调用请求。
{
"tools": [
{
"name": "search_files",
"description": "Search files in the workspace",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search query"
},
"pattern": {
"type": "string",
"description": "File pattern to match"
}
},
"required": ["query"]
}
}
]
}
安全实践
提示模板允许定义可重用的提示,支持参数化配置。这是MCP协议中用于管理AI与用户交互的重要组成部分。在安全性方面,需要特别注意输入验证和权限检查。
{
"prompts": [
{
"name": "code_reviewer",
"description": "Review code for best practices",
"arguments": [
{
"name": "code",
"description": "Code to review",
"required": true
}
]
}
]
}
权限控制
MCP 3.0引入了强大的安全机制,确保AI工具调用的安全性。权限控制是其中最关键的一环。
- 显式的权限控制:每个工具调用都需要明确的授权
- 用户确认机制:敏感操作需要用户二次确认
- 操作审计日志:所有工具调用都会被完整记录
- 资源访问限制:细粒度的文件和网络访问控制
- 沙箱执行环境:代码执行在隔离环境中进行
部署指南
现在让我们创建一个完整的MCP服务器,展示如何实现自定义工具并进行部署。
#!/usr/bin/env python3
from mcp.server import Server
from mcp.types import Tool
import asyncio
server = Server("my-mcp-server")
@server.list_tools()
async def list_tools():
return [
Tool(
name="calculate",
description="Perform mathematical calculations",
inputSchema={
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "Math expression to evaluate"
}
},
"required": ["expression"]
}
)
]
@server.call_tool()
async def call_tool(name, arguments):
if name == "calculate":
import ast
expr = arguments["expression"]
try:
result = ast.literal_eval(expr)
return {"content": [{"type": "text", "text": str(result)}]}
except Exception as e:
return {"content": [{"type": "text", "text": f"Error: {str(e)}"}]}
return {"content": [{"type": "text", "text": "Unknown tool"}]}
if __name__ == "__main__":
asyncio.run(server.run())