换个角度认识 MCP

协议概述

MCP是一种标准化通信协议,用于桥接AI模型(如LLMs)与外部数据源/工具,实现动态上下文管理。其核心价值包括:

  • 统一上下文管理:通过结构化数据流解决AI交互中的状态丢失问题
  • 跨会话持久化:支持上下文状态的保存与恢复,提升连续对话能力
  • 工具无缝集成:标准化外部工具(如数据库、API)的调用方式

举个实际例子🌤️

用户提问: "明天北京天气如何?" 流程:

  1. 客户端发现已连接"天气服务MCP" → 注册get_weather工具。
  2. LLM判断需调用get_weather → 发送{city: '北京'}
  3. 天气服务返回{北京: 晴, 20℃}
  4. 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": {}
    },
  1. main函数,MCP其实同样是一个脚本,当你指定了node环境使用的时候,main函数调用会 connect 连接。
  2. args,第一个参数指定你脚本的地址,第二个参数就是参数,也可以拼接执行
  • 执行查看

可以看到它会主动根据问题提出参数,并找到与你这个mcp匹配并调用返回。

  • 那这个和指令有什么区别?,直接说北京,然后返回对应数据!

我们可以通过这个问题对比出来与指令的区别 ,我们可以假设你这个mcp是一个非常复杂的逻辑性功能插件,当不是专业用户使用的时候,问题必然会偏离你的参数,这时候AI模型会与MCP进行精准的匹配,比如这个例子它可以从问题中自己找到信息:天气,首都,上海,相差...

总结

MCP协议正逐步发展为AI生态的基础接口,未来将重点增强工作流引擎 (支持多工具协同)、细粒度权限管理 (提升安全性)和跨平台互操作性 (统一标准)。开发者可受益于其标准化SDK (降低开发成本)、沙箱安全机制 (隔离风险)和灵活部署(本地/云端适配),为构建企业级AI应用提供高效、安全的工具集成方案。

相关推荐
鲲志说4 小时前
告别繁琐配置!用 Trae Remote-SSH 轻松远程开发和部署
人工智能·ai编程
鲲志说4 小时前
零代码开发者的狂欢:用Trae 3分钟复刻「2048」秀翻全场
人工智能·ai编程
用户4099322502126 小时前
如何在FastAPI中实现权限隔离并让用户乖乖听话?
后端·ai编程·trae
loong_XL9 小时前
fastmcp MCPConfig多服务器使用案例;sse、stdio、streamable-http使用
服务器·agent·mcp
Young55669 小时前
MCP实践:MCP Client 开发保姆教程(附全部代码)
mcp
Jooolin9 小时前
【操作系统】Unix 的文件系统是怎么运作的?
操作系统·unix·ai编程
后端小肥肠9 小时前
让Mermaid听懂人话:用Coze空间+MCP一句话搞定所有业务图
人工智能·coze·mcp
dogstarhuang12 小时前
【快速入门到精通】MCP Typescript SDK核心概念和快速开发你的MCP
程序员·node.js·mcp