协议概述
MCP是一种标准化通信协议,用于桥接AI模型(如LLMs)与外部数据源/工具,实现动态上下文管理。其核心价值包括:
- 统一上下文管理:通过结构化数据流解决AI交互中的状态丢失问题
- 跨会话持久化:支持上下文状态的保存与恢复,提升连续对话能力
- 工具无缝集成:标准化外部工具(如数据库、API)的调用方式

举个实际例子🌤️
用户提问: "明天北京天气如何?" 流程:
- 客户端发现已连接"天气服务MCP" → 注册
get_weather
工具。 - LLM判断需调用
get_weather
→ 发送{city: '北京'}
。 - 天气服务返回
{北京: 晴, 20℃}
。 - LLM生成: "明天北京晴天20℃,适合户外活动!"
其实这个例子只能说明MCP打通了三方数据交互的问题,并不能说明MCP的强大,因为就算你没有这个MCP的插件,AI照样是可以通过联网得知天气,接下来我们换个角度。
开发一个MCP
js
#!/usr/bin/env node
/**
* @fileoverview 一个极简的查询天气命令的MCP服务器。
* @description 只包含最核心功能的简单MCP服务示例。
* @author Gemini
*/
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
// 1. 定义你的工具
// 这是工具的"蓝图",告诉AI这个工具叫什么、能做什么、需要什么参数。
const weatherTool = {
name: "query_weather",
description: "查询指定一线城市的天气(使用模拟数据)",
inputSchema: {
type: "object",
properties: {
city: {
type: "string",
description: "要查询的城市名称",
enum: ["北京", "上海", "广州", "深圳"],
},
},
required: ["city"], // 将 city 设为必需参数
},
};
// 2. 准备工具需要用到的数据和执行逻辑
// 这是工具实际要做的事情。
const weatherData = {
北京: "晴, 15°C, 东北风3级",
上海: "多云, 18°C, 东南风4级",
广州: "雷阵雨, 22°C, 南风2级",
深圳: "小雨, 24°C, 东南风3级",
};
/**
* 当工具被调用时,执行这个函数。
* @param {object} args - 从AI请求中收到的参数。
* @returns {string} - 要返回给AI的结果。
*/
function executeQueryWeather(args) {
const city = args.city;
if (weatherData[city]) {
return `${city}的天气是: ${weatherData[city]}`;
}
return `没有找到 ${city} 的天气信息。`;
}
// 3. 创建并配置MCP服务器
const server = new Server({ name: "simple-weather-server", version: "1.0.0" });
// 当AI问"你有什么工具?"时,告诉它我们有weatherTool
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [weatherTool],
}));
// 当AI说"请用query_weather工具"时,执行我们的函数并返回结果
server.setRequestHandler(CallToolRequestSchema, async ({ params }) => {
if (params.name === "query_weather") {
const result = executeQueryWeather(params.arguments);
return { content: [{ type: "text", text: result }] };
}
// 如果AI叫错了工具名字,给它一个提示
return { content: [{ type: "text", text: `错误:未知的工具 "${params.name}"` }] };
});
// 4. 启动服务器,让它开始监听请求
async function startServer() {
console.log("MCP天气服务启动中...");
const transport = new StdioServerTransport();
await server.connect(transport);
console.log("🚀 服务已连接,可以接收来自AI的请求。");
}
startServer().catch((error) => {
console.error("服务启动失败:", error);
process.exit(1);
});
这里依旧使用天气例子,数据源固定。
- 使用本地MCP
json
"my-weather-mcp": {
"command": "node",
"args": ["F:/XXX/weather.js"],
"env": {}
},
- main函数,MCP其实同样是一个脚本,当你指定了node环境使用的时候,main函数调用会 connect 连接。
- args,第一个参数指定你脚本的地址,第二个参数就是参数,也可以拼接执行
- 执行查看

可以看到它会主动根据问题提出参数,并找到与你这个mcp匹配并调用返回。
- 那这个和指令有什么区别?,直接说北京,然后返回对应数据!

我们可以通过这个问题对比出来与指令的区别 ,我们可以假设你这个mcp是一个非常复杂的逻辑性功能插件,当不是专业用户使用的时候,问题必然会偏离你的参数,这时候AI模型会与MCP进行精准的匹配,比如这个例子它可以从问题中自己找到信息:天气,首都,上海,相差...
总结
MCP协议正逐步发展为AI生态的基础接口,未来将重点增强工作流引擎 (支持多工具协同)、细粒度权限管理 (提升安全性)和跨平台互操作性 (统一标准)。开发者可受益于其标准化SDK (降低开发成本)、沙箱安全机制 (隔离风险)和灵活部署(本地/云端适配),为构建企业级AI应用提供高效、安全的工具集成方案。