基于MCP构建一个智能助手

基于MCP构建一个智能助手

传统的 Function Calling 虽然实现了模型调用外部工具的能力,但缺乏统一标准,导致集成复杂、维护困难、安全性难以保障。

Model Context Protocol (MCP)它是一种标准化的协议它的目的是为 LLM 提供一种统一、安全、可靠的方式,来访问和操作外部资源 ,如数据库、搜索引擎、地图服务、企业内部系统等。 MCP 就像计算机的 USB 接口------无论你插入的是U盘、鼠标还是打印机,只要遵循 USB 协议,系统就能识别并使用它。同样,只要外部服务遵循 MCP 协议,LLM 就能"即插即用"地调用它们。

核心概念

  • MCP Server:遵循 MCP 协议的服务端程序,它封装了具体的外部资源(如高德地图 API),并定义了可供 LLM 调用的标准化接口(Tools)。
  • MCP Client :运行在 LLM 应用端的客户端(如 clinecursor 等),负责与 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 的客户端中输入:

"现在是什么时候"

系统工作流程如下:

  1. LLM 分析请求 :LLM 识别出用户需要"路线规划"服务,并发现本地有可用的 MCP Tool get_driving_route
  2. MCP Client 调用 :Client 根据 LLM 的指令,调用本地运行的 MCP Server(http://localhost:8080)的 get_driving_route 接口,传入参数 。
  3. MCP Server 执行:Server 调用高德地图 API,获取路线数据,并将结构化结果返回给 Client。
  4. 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 的健壮性。

相关推荐
Dragon Wu15 分钟前
前端 下载后端返回的二进制excel数据
前端·javascript·html5
Q_Q51100828519 分钟前
python的校园研招网系统
开发语言·spring boot·python·django·flask·node.js·php
北海几经夏21 分钟前
React响应式链路
前端·react.js
晴空雨1 小时前
React Media 深度解析:从使用到 window.matchMedia API 详解
前端·react.js
一个有故事的男同学1 小时前
React性能优化全景图:从问题发现到解决方案
前端
探码科技1 小时前
2025年20+超实用技术文档工具清单推荐
前端
Juchecar1 小时前
Vue 3 推荐选择组合式 API 风格(附录与选项式的代码对比)
前端·vue.js
uncleTom6661 小时前
# 从零实现一个Vue 3通用建议选择器组件:设计思路与最佳实践
前端·vue.js
影i1 小时前
iOS WebView 异步跳转解决方案
前端
Nicholas681 小时前
flutter滚动视图之ScrollController源码解析(三)
前端