MCP协议v1.0核心规范与架构设计
MCP(Model Context Protocol)协议v1.0于2026年7月正式定稿,为AI模型与外部工具之间的交互建立了统一标准。该协议定义了模型上下文传递、工具调用、资源访问三个核心原语,解决了以往AI Agent工具集成中接口不统一、协议碎片化的痛点。对于从事大模型开发和AI工具链搭建的工程师来说,掌握MCP协议规范已成为必备技能。
MCP协议的核心架构采用Client-Server模式。AI应用作为Client发起请求,Tool Server作为服务端暴露工具能力。协议基于JSON-RPC 2.0,支持三种通信方式:stdio(标准输入输出)、SSE(Server-Sent Events)和HTTP Stream。以下是MCP协议的核心消息格式:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "query_database",
"arguments": {
"sql": "SELECT * FROM users LIMIT 10",
"timeout": 5000
}
}
}
v1.0定稿版本相比之前的draft版本,新增了以下关键特性:流式工具调用结果返回、工具能力协商机制、资源订阅通知、采样(Sampling)能力声明。这些特性让MCP从简单的工具调用协议升级为完整的Agent工具链通信协议。
从零搭建MCP Tool Server实战
搭建一个MCP Tool Server需要遵循协议规范实现三个核心能力:工具列表(tools/list)、工具调用(tools/call)、资源访问(resources/read)。Python生态中官方提供了mcpSDK,可以快速搭建Server。
安装SDK:
pip install mcp
实现一个数据库查询工具Server:
from mcp.server import Server
from mcp.types import Tool, TextContent
import asyncio
app = Server("db-query-server")
@app.list_tools()
async def list_tools():
return [
Tool(
name="query_mysql",
description="执行MySQL查询语句,返回结构化结果",
inputSchema={
"type": "object",
"properties": {
"sql": {"type": "string", "description": "SQL查询语句"},
"database": {"type": "string", "description": "数据库名称"}
},
"required": ["sql", "database"]
}
),
Tool(
name="query_postgres",
description="执行PostgreSQL查询语句",
inputSchema={
"type": "object",
"properties": {
"sql": {"type": "string", "description": "SQL查询语句"},
"database": {"type": "string", "description": "数据库名称"}
},
"required": ["sql"]
}
)
]
@app.call_tool()
async def call_tool(name, arguments):
if name == "query_mysql":
result = await execute_mysql_query(
arguments["database"],
arguments["sql"]
)
return [TextContent(type="text", text=str(result))]
elif name == "query_postgres":
result = await execute_pg_query(
arguments["database"],
arguments["sql"]
)
return [TextContent(type="text", text=str(result))]
async def main():
from mcp.server.stdio import stdio_server
async with stdio_server() as (read_stream, write_stream):
await app.run(read_stream, write_stream)
if __name__ == "__main__":
asyncio.run(main())
上述代码定义了两个数据库查询工具,分别对应MySQL和PostgreSQL。list_tools返回工具清单及参数Schema,call_tool处理具体调用逻辑。MCP协议要求工具参数必须符合JSON Schema规范,这样AI模型可以自动理解参数含义并正确传参。
MCP Client集成与AI Agent工具链编排
Server搭建完成后,需要在AI Agent的Client端集成MCP Client。以下是使用官方Python SDK连接MCP Server的示例:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
server_params = StdioServerParameters(
command="python",
args=["db_query_server.py"],
env=None
)
async def run_agent():
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
for tool in tools.tools:
print(f"Tool: {tool.name}, Desc: {tool.description}")
result = await session.call_tool(
"query_mysql",
arguments={"sql": "SHOW TABLES", "database": "production"}
)
print(result)
实际生产环境中,Agent需要同时连接多个MCP Server,每个Server负责一类工具能力。这种多Server架构下,Agent充当工具编排中枢,根据用户意图选择合适的Server和工具。编排策略的核心是意图识别与工具匹配:
class MCPToolOrchestrator:
def __init__(self):
self.servers = {}
self.tool_registry = {}
async def register_server(self, name, server_params):
client = await self.connect(server_params)
tools = await client.list_tools()
self.servers[name] = client
for tool in tools.tools:
self.tool_registry[tool.name] = {
"server": name,
"schema": tool.inputSchema,
"description": tool.description
}
async def dispatch(self, tool_name, arguments):
if tool_name not in self.tool_registry:
raise ValueError(f"Unknown tool: {tool_name}")
server_name = self.tool_registry[tool_name]["server"]
client = self.servers[server_name]
return await client.call_tool(tool_name, arguments)
MCP协议安全机制与生产部署要点
MCP v1.0在生产部署中需要关注以下安全要点:
工具权限控制:MCP协议本身不定义权限模型,需要在Server端实现。推荐的做法是在call_tool处理器中增加权限校验层:
@app.call_tool()
async def call_tool(name, arguments):
if not await check_permission(context.user, name, arguments):
return [TextContent(
type="text",
text=f"Permission denied: user cannot execute {name}"
)]
return await execute_tool(name, arguments)
资源访问隔离:MCP Server应以最小权限运行,数据库连接使用只读账号,文件系统访问限制在指定目录内。容器化部署时,通过Docker的安全配置限制Server的访问范围:
# docker-compose.yml
services:
mcp-db-server:
build: ./mcp-db-server
security_opt:
- no-new-privileges:true
read_only: true
environment:
- DB_HOST=${DB_HOST}
- DB_USER=readonly_agent
- DB_PASSWORD=${DB_PASSWORD}
networks:
- agent-net
deploy:
resources:
limits:
memory: 512M
cpus: "0.5"
通信安全:HTTP模式下的MCP通信必须使用TLS加密。SSE模式支持Token认证,建议在Nginx层统一处理TLS终止和认证:
server {
listen 443 ssl;
server_name mcp-tools.example.com;
ssl_certificate /etc/ssl/certs/mcp.pem;
ssl_certificate_key /etc/ssl/private/mcp.key;
location / {
proxy_pass http://mcp-server:8080;
proxy_set_header Authorization $http_authorization;
proxy_set_header X-Real-IP $remote_addr;
}
}
MCP协议的定稿标志着AI工具链进入标准化阶段。从Server开发到Client集成,再到安全加固,每个环节都需要严格按照协议规范实现。生产环境中要格外关注权限控制和通信安全,确保AI Agent的工具调用能力在受控范围内运行。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/mcp-xie-yi-v10-ding-gao-hou-de-ai-gong-ju-lian-ji-cheng/