MCP协议实战指南:从零搭建基于MCP的AI Agent工具生态
一篇完整的MCP(Model Context Protocol)协议实战教程,从协议原理到服务端开发,再到客户端集成,手把手教你用MCP构建可扩展的AI Agent工具系统。
MCP(Model Context Protocol)在2026年已经成为AI Agent生态的核心基础设施。如果说2025年是MCP的”概念验证年”,那么2026年就是”大规模部署年”。本文将带你从零到一,完整实现一个基于MCP的AI Agent工具系统。
MCP协议核心概念
简单来说,MCP 定义了三个核心角色:
- MCP Host:运行AI模型的客户端(如 Claude Desktop、Cursor、VSCode)
- MCP Client:与MCP Server建立连接的一对一通信通道
- MCP Server:提供具体工具和资源的服务端程序
通信流程:
AI模型 ↔ MCP Client ↔ [JSON-RPC over Stdio/SSE] ↔ MCP Server ↔ 外部工具/API
第一阶段:搭建你的第一个MCP Server
我们从最简单的本地文件搜索工具开始。
环境准备:
# 安装 MCP SDK
npm install @modelcontextprotocol/sdk
编写Server代码(Node.js):
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new Server({
name: "file-search-server",
version: "1.0.0",
}, {
capabilities: { tools: {} }
});
// 注册工具
server.setRequestHandler("tools/list", async () => ({
tools: [{
name: "search_files",
description: "按关键词搜索文件",
inputSchema: {
type: "object",
properties: {
pattern: { type: "string", description: "搜索关键词" },
directory: { type: "string", description: "搜索目录" }
},
required: ["pattern"]
}
}]
}));
// 实现工具调用
server.setRequestHandler("tools/call", async (request) => {
if (request.params.name === "search_files") {
const { pattern, directory } = request.params.arguments;
// 调用系统搜索命令
const result = await exec(`grep -r "${pattern}" ${directory || '.'}`);
return { content: [{ type: "text", text: result }] };
}
});
// 启动
const transport = new StdioServerTransport();
await server.connect(transport);
第二阶段:开发实用的MCP工具
1. 数据库查询工具
将自然语言转化为SQL查询,直接查询生产数据库:
const dbTool = {
name: "query_database",
description: "用自然语言查询数据库",
inputSchema: {
type: "object",
properties: {
question: { type: "string", description: "自然语言问题" },
db_type: { type: "string", enum: ["mysql", "postgres", "sqlite"] }
}
}
};
// 内部流程:question → LLM生成SQL → 执行 → 返回结果
2. 网页内容抓取工具
让Agent能直接读取和分析网页内容:
const webTool = {
name: "fetch_webpage",
description: "获取网页内容用于分析",
inputSchema: {
type: "object",
properties: {
url: { type: "string", description: "网页URL" },
extract_mode: { type: "string", enum: ["markdown", "text", "structured"] }
}
}
};
第三阶段:集成到AI客户端
在Claude Desktop中配置(最简单的方式)
编辑 claude_desktop_config.json:
{
"mcpServers": {
"file-search": {
"command": "node",
"args": ["/path/to/your/server.mjs"]
},
"database": {
"command": "node",
"args": ["/path/to/db-server.mjs"]
}
}
}
重启Claude Desktop,你就能在对话中直接使用这些工具了。
在Cursor/VSCode中集成
// .cursor/mcp.json
{
"mcpServers": {
"my-tools": {
"type": "stdio",
"command": "python",
"args": ["mcp_server.py"]
}
}
}
第四阶段:生产环境部署
本地调试用 stdio 传输够了,但生产环境需要使用 SSE(Server-Sent Events):
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
import express from "express";
const app = express();
const transports = {};
app.get("/mcp", async (req, res) => {
const transport = new SSEServerTransport("/mcp/message", res);
transports[transport.sessionId] = transport;
await server.connect(transport);
});
app.post("/mcp/message", async (req, res) => {
const sessionId = req.query.sessionId;
await transports[sessionId].handlePostMessage(req, res);
});
app.listen(3000);
进阶:工具组合与编排
高级用法是将多个MCP工具组合成一个”超级工具链”。例如:
“竞品分析”工具链 = 网页抓取 + 情感分析 + 报告生成
const competitorAnalysisChain = async (companyName) => {
// 1. 搜索新闻
const news = await mcpCall("search_web", { query: `${companyName} 2026` });
// 2. 逐个分析
const sentiments = await mcpCall("analyze_sentiment", { texts: news });
// 3. 生成报告
return await mcpCall("generate_report", { data: sentiments });
};
常见问题与调试
- 工具没有被模型调用:检查工具的
description是否清晰准确 - JSON-RPC连接失败:确认 stdio 传输路径和权限正确
- 超时问题:
tools/call最多等待300秒,长任务需要异步处理 - 安全风险:永远不要在MCP工具中执行未经校验的shell命令
总结
MCP协议将AI Agent的能力边界从”对话”扩展到了”工具操控”。从简单的文件搜索到复杂的企业级工具链,MCP提供了一致且可扩展的接口标准。建议开发者从本地文件工具开始,逐步扩展到API集成、数据库查询等生产场景。2026年,掌握MCP开发已经成为AI工程师的必备技能。