基于MCP构建一个智能助手
传统的 Function Calling 虽然实现了模型调用外部工具的能力,但缺乏统一标准,导致集成复杂、维护困难、安全性难以保障。
Model Context Protocol (MCP) ,它是一种标准化的协议 ,它的目的是为 LLM 提供一种统一、安全、可靠的方式,来访问和操作外部资源 ,如数据库、搜索引擎、地图服务、企业内部系统等。 MCP 就像计算机的 USB 接口------无论你插入的是U盘、鼠标还是打印机,只要遵循 USB 协议,系统就能识别并使用它。同样,只要外部服务遵循 MCP 协议,LLM 就能"即插即用"地调用它们。
核心概念
- MCP Server:遵循 MCP 协议的服务端程序,它封装了具体的外部资源(如高德地图 API),并定义了可供 LLM 调用的标准化接口(Tools)。
- MCP Client :运行在 LLM 应用端的客户端(如
cline
、cursor
等),负责与 MCP Server 通信。它接收用户请求,询问 LLM 是否需要调用某个 MCP 工具,若需要,则调用对应的 MCP Server 并将结果返回给 LLM。然后LLM在更具这个结果进行输出。 - Tool:MCP Server 暴露的功能单元,类似于 API 接口,但以自然语言可理解的方式描述其功能、参数和返回值。
MCP相对于Function的优点
- 标准化集成:它统一了接口,不需要为每个 API 手动编写 Function Call 这个繁琐的过程,MCP 提供统一的接入方式。
- 提升可靠性:通过标准化的输入输出格式,减少因参数错误或数据格式不匹配导致的调用失败。
- 增强安全性:MCP Server 可以在本地处理敏感信息(如 API 密钥),避免密钥泄露给云端 LLM。
- 降低开发成本:开发者只需关注 MCP Server 的实现,无需关心 LLM 端的集成细节。
使用 MCP 实现获取当前时间的助手
接下来,将通过一个简单的 Node.js 项目,演示如何创建一个 MCP Server,用于调用高德地图 API 查询从公司到机场的路线。
第一步:初始化项目
bash
mkdir mcp-amap-demo # 创建文件夹
cd mcp-amap-demo #
npm init -y # 初始化后端项目
npm i @modelcontextprotocol/sdk # 安装 Model Context Protocol (MCP) 的 SDK。这个 SDK 允许开发者创建基于 MCP 协议的服务软件
第二步:创建 MCP Server
创建 server.js
文件:
javascript
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
// 大模型运行的主进程(如AI应用)与通过StdioServerTransport启动的MCP工具服务器进程之间的通信。
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
// 导入调用工具请求和响应的数据结构类型定义,确保通信数据格式规范
import {
CallToolRequestSchema,
CallToolResultSchema,
} from "@modelcontextprotocol/sdk/types.js";
const axios = require('axios');
// 创建 MCP Server 实例
const server = new McpServer(
{
name: "demo-mcp-server", // 服务器名称,用于标识当前MCP服务
version: "1.0.0", // 服务器版本,便于版本管理和兼容性控制
},
{
capabilities: {
tools: {}, // 可以动态注册工具
},
}
);
// 2. 注册一个工具(比如:获取当前时间)
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "getTime") {
return {
content: [
{
type: "text",
text: `当前时间是: ${new Date().toISOString()}`,
},
],
};
}
throw new Error("未知工具: " + request.params.name);
});
// 启动 MCP Server
// StdioServerTransport 是通信桥梁(运输层)
const transport = new StdioServerTransport();
// server.connect(transport) 是将 MCP 服务器连接到该桥梁
server.connect(transport);
第三步:配置 MCP Client(以 cline 为例)
在你的 LLM 应用(如使用 cline
)中,你需要配置 MCP Client 指向我们刚刚启动的服务器:
json
{
"mcpServers": {
"amap-maps": {
"disabled": false,
"timeout": 60,
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@amap/amap-maps-mcp-server"
],
"env": {
"AMAP_MAPS_API_KEY": "你的高德地图api-key"
}
} ,
"time-mcp": {
"autoApprove": [],
"disabled": false,
"timeout": 60,
"type": "stdio",
"command": "node",
"args": [
"E:/ai_lesson/interview/ai/MCP/demo/index.mjs" // 本地服务所在的文件
],
"env": {}
}
}
}
第四步:用户提问与系统响应
现在,当你在支持 MCP 的客户端中输入:
"现在是什么时候"
系统工作流程如下:
- LLM 分析请求 :LLM 识别出用户需要"路线规划"服务,并发现本地有可用的 MCP Tool
get_driving_route
。 - MCP Client 调用 :Client 根据 LLM 的指令,调用本地运行的 MCP Server(
http://localhost:8080
)的get_driving_route
接口,传入参数 。 - MCP Server 执行:Server 调用高德地图 API,获取路线数据,并将结构化结果返回给 Client。
- LLM 生成回复:LLM 接收到 JSON 格式的路线信息,将其转化为自然语言回复:
根据系统信息显示,现在是:
2025年8月21日 下午4:01 (北京时间,UTC+8:00)
关于您之前询问的从杭州到抚州的出行方案,我已经为您提供了详细的驾车路线和公共交通选择。如果您需要根据当前时间安排具体的出行计划,建议:
- 当日出行: 如果现在出发,驾车约6小时23分钟,预计晚上10点左右到达
- 明日出行: 可以提前查询高铁班次时刻表,选择合适的出发时间
- 周末出行: 注意高速公路可能会有较多车流,建议预留更多时间
您是打算什么时候出发呢?
总结
通过这个简单的 MCP Demo,我们可以看到:
- MCP 统一了外部资源的接入方式,让 LLM 能像调用本地函数一样使用高德地图。
- API Key 保存在本地 MCP Server 中,不会暴露给云端 LLM。
- 开发效率提升、只需实现一次 MCP Server,即可在多个支持 MCP 的客户端中复用。
MCP 正在成为连接 LLM 与现实世界的"通用接口标准"。随着更多服务提供 MCP 支持,未来的 AI 助手将能无缝集成企业内部系统、物联网设备、金融数据等,真正实现"智能体"(Agent)的愿景。
提示:在生产环境中,请使用环境变量管理 API Key,并考虑添加身份验证、请求限流、错误重试等机制以增强 MCP Server 的健壮性。