MCP协议实战:2026年构建AI Agent的终极教程#
2026年,MCP(Model Context Protocol)已经成为AI Agent开发的事实标准。本文将从协议原理、服务端实现、客户端集成到生产部署,全方位带你掌握这一关键技术。
为什么2026年你需要关注MCP?#
2024年底,Anthropic发布了Model Context Protocol(MCP)的初始规范。短短一年多时间,MCP已经从一个实验性协议成长为AI行业的基础设施标准。2026年,几乎所有主流AI模型——包括Claude 4.7、GPT-5.5、Gemini 2.5 Ultra、以及国内的文心5.0、通义千问3.0——都已原生支持MCP协议。
MCP解决了什么核心问题?简而言之:它为AI模型提供了一种标准化的方式来连接外部工具、数据源和服务。在MCP之前,每个AI平台都有自己的工具调用方式,开发者需要为每个平台单独适配。MCP统一了这个过程——一次开发,处处可用。
┌─────────────────────────────────────────────────────┐
│ MCP 生态全景图 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Claude │ │ GPT-5.5 │ │ Gemini │ ... │
│ │ 4.7 │ │ │ │ 2.5 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ └──────────┬───┴──────────────┘ │
│ │ │
│ ┌──────▼──────┐ │
│ │ MCP Client │ ← 统一的客户端层 │
│ │ (JSON-RPC)│ │
│ └──────┬──────┘ │
│ │ │
│ ┌────────────┼────────────┐ │
│ │ │ │ │
│ ┌──▼───┐ ┌────▼───┐ ┌───▼────┐ │
│ │Tool │ │Resource│ │Prompt │ │
│ │Server│ │Server │ │Server │ │
│ └──┬───┘ └────┬───┘ └───┬────┘ │
│ │ │ │ │
│ ┌──▼───┐ ┌────▼───┐ ┌───▼────┐ │
│ │数据库│ │文件系统│ │API服务 │ │
│ └──────┘ └────────┘ └────────┘ │
└─────────────────────────────────────────────────────┘MCP协议核心架构#
协议分层#
MCP采用三层架构设计:
- 传输层(Transport Layer):支持stdio、SSE(Server-Sent Events)、以及2025年新增的Streamable HTTP
- 消息层(Message Layer):基于JSON-RPC 2.0,处理请求/响应/通知
- 功能层(Feature Layer):包括Tools、Resources、Prompts、Sampling四大核心能力
┌───────────────────────────────────┐
│ 功能层 (Feature) │
│ Tools │ Resources │ Prompts │ Sampling │
├───────────────────────────────────┤
│ 消息层 (JSON-RPC 2.0) │
│ Request │ Response │ Notification │
├───────────────────────────────────┤
│ 传输层 (Transport) │
│ stdio │ SSE │ Streamable HTTP │
└───────────────────────────────────┘四大核心能力详解#
| 能力 | 方向 | 说明 |
|---|---|---|
| Tools | Client → Server | AI模型调用外部工具(函数调用) |
| Resources | Client → Server | 读取外部数据源(文件、数据库等) |
| Prompts | Client → Server | 获取预定义的提示词模板 |
| Sampling | Server → Client | Server请求AI模型进行推理 |
实战:从零构建MCP Server#
环境准备#
确保你的开发环境满足以下要求:
# Node.js 20+ 或 Python 3.11+
node --version # v20.x+ recommended
python3 --version # 3.11+ recommended
# 安装MCP SDK
# TypeScript
npm install @modelcontextprotocol/sdk
# Python
pip install mcp示例一:TypeScript MCP Server(数据库查询工具)#
我们来构建一个实际的MCP Server,提供数据库查询能力:
// server.ts - Database Query MCP Server
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import Database from "better-sqlite3";
// 初始化数据库连接
const db = new Database("./data.db");
// 创建MCP Server实例
const server = new McpServer({
name: "database-query-server",
version: "1.0.0",
capabilities: {
tools: {},
resources: {},
},
});
// ============ 工具定义 ============
// 工具1:执行SQL查询
server.tool(
"query_database",
"执行SQL查询并返回结果(仅支持SELECT语句)",
{
sql: z.string().describe("要执行的SQL查询语句"),
params: z
.array(z.string())
.optional()
.describe("SQL参数化查询的参数"),
},
async ({ sql, params }) => {
// 安全检查:只允许SELECT查询
if (!sql.trim().toUpperCase().startsWith("SELECT")) {
return {
content: [
{
type: "text",
text: "错误:仅支持SELECT查询语句",
},
],
isError: true,
};
}
try {
const stmt = db.prepare(sql);
const rows = params ? stmt.all(...params) : stmt.all();
return {
content: [
{
type: "text",
text: JSON.stringify(rows, null, 2),
},
],
};
} catch (error) {
return {
content: [
{
type: "text",
text: `查询执行失败: ${error.message}`,
},
],
isError: true,
};
}
}
);
// 工具2:获取表结构
server.tool(
"list_tables",
"列出数据库中的所有表及其结构",
{},
async () => {
const tables = db
.prepare(
"SELECT name FROM sqlite_master WHERE type='table'"
)
.all();
const result = tables.map((t: any) => {
const columns = db
.prepare(`PRAGMA table_info(${t.name})`)
.all();
return {
table: t.name,
columns: columns.map((c: any) => ({
name: c.name,
type: c.type,
nullable: !c.notnull,
})),
};
});
return {
content: [
{
type: "text",
text: JSON.stringify(result, null, 2),
},
],
};
}
);
// ============ 资源定义 ============
server.resource(
"database-schema",
"db://schema",
async (uri) => ({
contents: [
{
uri: uri.href,
text: JSON.stringify(
db
.prepare(
"SELECT * FROM sqlite_master WHERE type='table'"
)
.all(),
null,
2
),
},
],
})
);
// ============ 启动服务器 ============
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Database MCP Server 已启动");
}
main().catch(console.error);示例二:Python MCP Server(API聚合服务)#
# server.py - API Aggregation MCP Server
import asyncio
import httpx
from mcp.server.fastmcp import FastMCP
# 创建MCP Server
mcp = FastMCP(
name="api-aggregator",
version="1.0.0",
)
# HTTP客户端
http_client = httpx.AsyncClient(timeout=30.0)
@mcp.tool()
async def search_web(query: str, max_results: int = 5) -> str:
"""搜索网络获取最新信息"""
response = await http_client.get(
"https://api.search.example.com/search",
params={"q": query, "limit": max_results},
)
data = response.json()
results = [
f"### {r['title']}\n{r['snippet']}\n链接: {r['url']}"
for r in data["results"]
]
return "\n\n---\n\n".join(results)
@mcp.tool()
async def get_weather(city: str) -> str:
"""获取指定城市的天气信息"""
response = await http_client.get(
f"https://api.weather.example.com/v1/current",
params={"city": city, "units": "metric"},
)
data = response.json()
return (
f"## {city} 当前天气\n"
f"- 温度: {data['temperature']}°C\n"
f"- 天气: {data['description']}\n"
f"- 湿度: {data['humidity']}%\n"
f"- 风速: {data['wind_speed']} km/h"
)
@mcp.tool()
async def translate_text(
text: str,
target_lang: str = "en"
) -> str:
"""翻译文本到指定语言"""
response = await http_client.post(
"https://api.translate.example.com/v2/translate",
json={
"text": text,
"target": target_lang,
},
)
data = response.json()
return f"翻译结果 ({target_lang}):\n{data['translated_text']}"
@mcp.resource("config://app")
def get_app_config() -> str:
"""获取应用配置信息"""
return """# API Aggregator Config
version: 1.0.0
services:
- web_search
- weather
- translation
"""
if __name__ == "__main__":
mcp.run(transport="stdio")实战:构建MCP Client#
TypeScript Client实现#
// client.ts - MCP Client
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
async function main() {
// 创建MCP客户端
const transport = new StdioClientTransport({
command: "node",
args: ["./server.js"],
});
const client = new Client({
name: "my-agent-client",
version: "1.0.0",
});
await client.connect(transport);
// 列出可用工具
const tools = await client.listTools();
console.log("可用工具:", tools);
// 调用工具
const result = await client.callTool({
name: "query_database",
arguments: {
sql: "SELECT * FROM users WHERE active = 1 LIMIT 10",
},
});
console.log("查询结果:", result);
// 读取资源
const resource = await client.readResource({
uri: "db://schema",
});
console.log("数据库结构:", resource);
await client.close();
}
main().catch(console.error);与AI模型集成#
将MCP Client与AI模型结合,构建完整的Agent:
// agent.ts - 完整的AI Agent示例
import Anthropic from "@anthropic-ai/sdk";
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
async function createAgent() {
// 1. 初始化MCP客户端
const transport = new StdioClientTransport({
command: "node",
args: ["./database-server.js"],
});
const mcpClient = new Client({
name: "xiadao-agent",
version: "1.0.0",
});
await mcpClient.connect(transport);
// 2. 获取可用工具列表,转换为Claude格式
const toolsResponse = await mcpClient.listTools();
const claudeTools = toolsResponse.tools.map((tool) => ({
name: tool.name,
description: tool.description,
input_schema: tool.inputSchema,
}));
// 3. 初始化Claude客户端(通过XiDao网关)
const anthropic = new Anthropic({
baseURL: "https://api.xidao.online/v1",
apiKey: process.env.XIDAO_API_KEY,
});
// 4. Agent对话循环
const messages: Anthropic.MessageParam[] = [
{
role: "user",
content:
"帮我查询数据库中最近7天注册的活跃用户数量",
},
];
while (true) {
const response = await anthropic.messages.create({
model: "claude-4.7-sonnet",
max_tokens: 4096,
tools: claudeTools,
messages,
});
// 检查是否有工具调用
const toolUseBlocks = response.content.filter(
(block) => block.type === "tool_use"
);
if (toolUseBlocks.length === 0) {
// 没有工具调用,返回最终结果
const textBlock = response.content.find(
(block) => block.type === "text"
);
console.log("Agent回复:", textBlock?.text);
break;
}
// 处理工具调用
messages.push({
role: "assistant",
content: response.content,
});
for (const toolCall of toolUseBlocks) {
console.log(`调用工具: ${toolCall.name}`, toolCall.input);
const result = await mcpClient.callTool({
name: toolCall.name,
arguments: toolCall.input as Record<string, unknown>,
});
messages.push({
role: "user",
content: [
{
type: "tool_result",
tool_use_id: toolCall.id,
content: result.content as string,
},
],
});
}
}
await mcpClient.close();
}
createAgent().catch(console.error);XiDao API网关的MCP路由支持#
作为2026年领先的AI API网关,XiDao 对MCP协议提供了全面的原生支持。
统一的MCP网关架构#
┌──────────────────────────────────────────────────┐
│ XiDao API Gateway │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ MCP Protocol Router │ │
│ │ │ │
│ │ ┌─────────┐ ┌──────────┐ ┌──────────────┐ │ │
│ │ │ 路由层 │ │ 协议转换 │ │ 负载均衡 │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ └────┬────┘ └────┬─────┘ └──────┬───────┘ │ │
│ └───────┼───────────┼──────────────┼───────────┘ │
│ │ │ │ │
│ ┌─────┴───┐ ┌─────┴───┐ ┌───────┴────┐ │
│ │Claude │ │GPT-5.5 │ │Gemini 2.5 │ ... │
│ │4.7 │ │ │ │Ultra │ │
│ └─────────┘ └─────────┘ └────────────┘ │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ MCP Server Registry │ │
│ │ • 自动发现和注册MCP Server │ │
│ │ • 健康检查与故障转移 │ │
│ │ • 工具能力匹配与路由 │ │
│ └──────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘XiDao MCP配置示例#
# xidao-mcp-config.yaml
mcp_gateway:
enabled: true
# 模型路由配置
routing:
default_model: "claude-4.7-sonnet"
fallback_model: "gpt-5.5"
rules:
- match:
tool_type: "database"
route_to: "claude-4.7-opus"
- match:
tool_type: "code_generation"
route_to: "gpt-5.5"
- match:
tool_type: "multimodal"
route_to: "gemini-2.5-ultra"
# MCP Server管理
servers:
- name: "db-server"
transport: "stdio"
command: "node"
args: ["./servers/db-server.js"]
health_check:
interval: 30s
timeout: 5s
- name: "api-aggregator"
transport: "sse"
url: "https://mcp-servers.xidao.online/api-aggregator"
auth:
type: "bearer"
token: "${MCP_API_TOKEN}"
# 速率限制和安全
security:
rate_limit: 1000 # 每分钟请求上限
allowed_tools:
- "query_database"
- "search_web"
- "get_weather"
blocked_patterns:
- "DROP TABLE"
- "DELETE FROM"通过XiDao调用MCP的代码示例#
# 使用XiDao SDK进行MCP调用
import xidao
# 初始化XiDao客户端(自动处理MCP协议)
client = xidao.Client(
api_key="your-xidao-api-key",
gateway="https://api.xidao.online",
)
# 创建MCP-aware的Agent
agent = client.create_agent(
model="claude-4.7-sonnet",
mcp_servers=[
{
"name": "database",
"transport": "stdio",
"command": "node",
"args": ["./db-server.js"],
},
{
"name": "web-search",
"transport": "sse",
"url": "https://mcp.xidao.online/web-search",
},
],
)
# 使用Agent——XiDao自动处理所有MCP协议细节
result = agent.chat(
"帮我分析一下过去一个月的用户增长趋势,"
"并搜索一下同期行业报告作为参考"
)
print(result)生产环境部署最佳实践#
1. MCP Server容器化#
# Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
RUN npm run build
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
# 健康检查端点
HEALTHCHECK --interval=30s --timeout=5s \
CMD wget -qO- http://localhost:3000/health || exit 1
EXPOSE 3000
CMD ["node", "dist/server.js"]2. Docker Compose编排#
# docker-compose.yml
version: "3.9"
services:
mcp-gateway:
image: xidao/mcp-gateway:latest
environment:
- XIDAO_API_KEY=${XIDAO_API_KEY}
- MCP_LOG_LEVEL=info
ports:
- "8080:8080"
depends_on:
mcp-db-server:
condition: service_healthy
mcp-api-server:
condition: service_healthy
deploy:
replicas: 3
resources:
limits:
memory: 512M
mcp-db-server:
build: ./servers/db
volumes:
- db-data:/app/data
healthcheck:
test: ["CMD", "node", "healthcheck.js"]
interval: 15s
timeout: 5s
retries: 3
mcp-api-server:
build: ./servers/api
environment:
- REDIS_URL=redis://redis:6379
depends_on:
- redis
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
volumes:
db-data:
redis-data:3. 监控与可观测性#
// monitoring.ts - MCP Server监控中间件
import { PrometheusExporter } from "@opentelemetry/exporter-prometheus";
import { MeterProvider } from "@opentelemetry/sdk-metrics";
// Prometheus指标
const meterProvider = new MeterProvider({
readers: [
new PrometheusExporter({ port: 9090 }),
],
});
const meter = meterProvider.getMeter("mcp-server");
// 工具调用计数器
const toolCallCounter = meter.createCounter("mcp_tool_calls_total", {
description: "Total MCP tool invocations",
});
// 工具调用延迟直方图
const toolLatency = meter.createHistogram("mcp_tool_latency_ms", {
description: "MCP tool call latency in milliseconds",
});
// 包装MCP Server的工具处理器
function instrumentedHandler(name: string, handler: Function) {
return async (...args: any[]) => {
const startTime = Date.now();
try {
const result = await handler(...args);
toolCallCounter.add(1, {
tool: name,
status: "success",
});
return result;
} catch (error) {
toolCallCounter.add(1, {
tool: name,
status: "error",
});
throw error;
} finally {
toolLatency.record(Date.now() - startTime, {
tool: name,
});
}
};
}4. 安全加固清单#
// security.ts - MCP安全中间件
import { RateLimiter } from "limiter";
import { sanitize } from "sql-sanitizer";
interface SecurityConfig {
maxToolCallsPerMinute: number;
maxInputLength: number;
blockedPatterns: RegExp[];
allowedOrigins: string[];
}
const securityConfig: SecurityConfig = {
maxToolCallsPerMinute: 60,
maxInputLength: 10000,
blockedPatterns: [
/DROP\s+TABLE/i,
/DELETE\s+FROM/i,
/TRUNCATE/i,
/--.*(?:password|secret|key)/i,
/\bexec\b.*\bcmd\b/i,
],
allowedOrigins: [
"https://xidao.online",
"https://api.xidao.online",
],
};
// 输入验证中间件
function validateInput(input: unknown): boolean {
const str = JSON.stringify(input);
if (str.length > securityConfig.maxInputLength) {
throw new Error("输入超过最大长度限制");
}
for (const pattern of securityConfig.blockedPatterns) {
if (pattern.test(str)) {
throw new Error(`输入包含被阻止的模式: ${pattern}`);
}
}
return true;
}
// 速率限制
const limiter = new RateLimiter({
tokensPerInterval: securityConfig.maxToolCallsPerMinute,
interval: "minute",
});
export async function securityMiddleware(
request: any,
handler: Function
) {
// 速率限制检查
if (!limiter.tryRemoveTokens(1)) {
throw new Error("请求频率超过限制");
}
// 输入验证
validateInput(request.params);
// 执行请求
return handler(request);
}2026年MCP生态全景#
主流MCP实现#
| 框架/平台 | MCP支持状态 | 特色功能 |
|---|---|---|
| Claude 4.7 | 原生支持 | Sampling、多模态工具 |
| GPT-5.5 | 原生支持 | 函数调用兼容层 |
| Gemini 2.5 Ultra | 原生支持 | 大上下文资源处理 |
| LangChain 1.0 | 深度集成 | Agent编排 + MCP |
| LlamaIndex 1.0 | 深度集成 | RAG + MCP资源 |
| XiDao Gateway | 全面支持 | 统一路由、负载均衡、安全防护 |
社区热门MCP Server#
- @mcp/server-filesystem — 文件系统操作
- @mcp/server-postgres — PostgreSQL数据库
- @mcp/server-github — GitHub API集成
- @mcp/server-slack — Slack消息与频道管理
- @mcp/server-aws — AWS云服务操作
- @mcp/server-kubernetes — K8s集群管理
性能优化建议#
1. 工具描述优化#
好的工具描述直接影响AI模型的调用准确率:
// ❌ 差的描述
server.tool("query", "查询数据", { sql: z.string() }, handler);
// ✅ 好的描述
server.tool(
"query_database",
"在SQLite数据库中执行SQL SELECT查询。返回JSON格式的查询结果数组。" +
"支持参数化查询以防止SQL注入。" +
"仅支持读操作(SELECT),不支持写操作。",
{
sql: z
.string()
.describe("标准SQL SELECT语句,例如: SELECT * FROM users WHERE id = ?"),
params: z
.array(z.string())
.optional()
.describe("参数化查询的值,与SQL中的 ? 占位符对应"),
},
handler
);2. 响应格式优化#
// 返回结构化的、对AI友好的结果
function formatForAI(data: any[]): string {
if (data.length === 0) {
return "查询结果为空,没有匹配的数据。";
}
// 提供摘要信息
const summary = `查询返回 ${data.length} 条记录。\n`;
// 提供数据预览
const preview = data.slice(0, 5).map((row, i) => {
return `记录 ${i + 1}: ${JSON.stringify(row)}`;
});
// 如果数据量大,提示使用更精确的查询
const hint =
data.length > 5
? `\n\n注意:仅显示前5条记录,共${data.length}条。建议添加LIMIT或WHERE条件获取更精确的结果。`
: "";
return summary + preview.join("\n") + hint;
}3. 连接池与缓存#
// 缓存MCP Server连接
class McpConnectionPool {
private pool = new Map<string, Client>();
private maxSize: number;
constructor(maxSize = 10) {
this.maxSize = maxSize;
}
async getOrCreate(
key: string,
factory: () => Promise<Client>
): Promise<Client> {
if (this.pool.has(key)) {
return this.pool.get(key)!;
}
if (this.pool.size >= this.maxSize) {
// LRU淘汰
const oldestKey = this.pool.keys().next().value;
const oldestClient = this.pool.get(oldestKey)!;
await oldestClient.close();
this.pool.delete(oldestKey);
}
const client = await factory();
this.pool.set(key, client);
return client;
}
}总结#
2026年,MCP协议已经成为AI Agent开发的基石。无论你是构建简单的工具增强聊天机器人,还是复杂的多Agent系统,MCP都提供了标准化、可扩展的基础设施。
通过本文的学习,你应该已经掌握了:
- MCP协议的核心架构 — 传输层、消息层、功能层
- Server开发 — TypeScript和Python两种实现方式
- Client集成 — 与AI模型结合构建完整Agent
- 生产部署 — 容器化、监控、安全加固
- 性能优化 — 工具描述、响应格式、连接管理
结合XiDao API网关的MCP路由能力,你可以轻松构建跨模型、高可用的AI Agent系统。XiDao提供了统一的API接口、智能路由、负载均衡和安全防护,让你专注于业务逻辑而非基础设施。
立即开始你的MCP之旅:
本文由XiDao AI API Gateway团队撰写。XiDao致力于为开发者提供最便捷、最强大的AI模型接入服务,全面支持MCP协议的路由、负载均衡和安全防护。