目录

  1. 引言:大模型的“上下文孤岛”困境,MCP为何成为行业新标准?
  2. MCP核心认知:用3个比喻搞懂本质
    2.1 官方定义:什么是Model Context Protocol?
    2.2 通俗比喻:MCP是大模型的“通用USB接口”
    2.3 核心定位:MCP到底解决了什么问题?
  3. MCP vs 传统方案:为什么它能替代Function Calling/插件系统?
    3.1 与Function Calling的核心区别
    3.2 与OpenAI插件系统的对比
    3.3 与传统RAG的能力边界差异
    3.4 核心优势对比表
  4. MCP核心原理与架构:协议底层逻辑全拆解
    4.1 协议基础:基于JSON-RPC 2.0的双向通信
    4.2 核心架构:客户端-服务端的双层模型
    4.3 传输层:MCP的3种主流通信方式
    4.4 MCP四大核心能力:工具/上下文/提示词/安全控制
  5. MCP全场景应用:从个人开发到企业级落地
    5.1 个人开发者场景:本地开发效率神器
    5.2 企业级场景:内部系统与大模型的安全打通
    5.3 行业垂直场景:金融/医疗/工业的落地实践
  6. 从零实战:30分钟搭建并接入你的第一个MCP服务
    6.1 环境准备:前置依赖与工具
    6.2 实战案例1:用Python搭建天气查询MCP服务
    6.3 实战案例2:在Claude Desktop中接入MCP服务
    6.4 实战验证:让大模型通过MCP完成实时天气查询
  7. 常见踩坑与解决方案:MCP落地避坑指南
  8. MCP生态与未来发展:从协议到下一代大模型基础设施
  9. 总结:MCP的核心价值与开发者入门建议
  10. 附录:MCP核心资源与常用工具速查表

1. 引言:大模型的“上下文孤岛”困境,MCP为何成为行业新标准?

2024年以来,大模型技术进入了“落地深水区”,但几乎所有开发者和企业都面临同一个核心痛点:大模型始终被困在“上下文孤岛”里

我们能看到大模型的能力边界,始终被两大问题限制:

  1. 知识静态化:大模型的训练数据有明确的截止日期,无法获取实时数据(如当天的天气、最新的股票行情、企业内部的实时业务数据);
  2. 能力封闭化:大模型只能在对话窗口里生成文本,无法直接操作外部系统(如读写本地文件、查询数据库、执行终端命令、控制硬件设备)。

为了解决这些问题,行业里出现了一系列方案:OpenAI的Function Calling、ChatGPT插件系统、各类RAG框架、定制化Agent开发……但这些方案都存在致命的短板:

  • 碎片化:不同大模型的工具调用规范不兼容,为GPT写的插件无法直接给Claude、Gemini用;
  • 开发成本高:每接入一个新工具/数据源,都要单独开发适配代码,重复造轮子;
  • 安全风险不可控:大模型直接调用外部系统,缺乏细粒度的权限控制,容易出现误操作、数据泄露;
  • 上下文管理混乱:传统RAG只能被动注入上下文,无法让大模型动态、按需获取外部数据,容易导致上下文窗口溢出。

正是在这样的背景下,Anthropic在2024年正式推出了Model Context Protocol(MCP,模型上下文协议)——一套标准化、跨模型、安全可控的通信协议,专门解决大模型与外部世界的连接问题。

推出仅半年时间,MCP已经获得了全行业的认可:Claude Desktop原生支持MCP、OpenAI宣布兼容MCP协议、LangChain/Autogen等Agent框架全面接入、全球开发者贡献了数千个开源MCP服务。它不再是一个简单的工具,正在成为大模型时代的“基础设施级协议”。

本文将从“原理本质→架构拆解→场景落地→实战开发→避坑指南”全链路,带你彻底搞懂MCP,即使是零基础的开发者,也能跟着文章完成自己的第一个MCP服务开发与接入。


2. MCP核心认知:用3个比喻搞懂本质

2.1 官方定义:什么是Model Context Protocol?

MCP的官方定义是:一套开源、标准化的双向通信协议,用于在大语言模型(LLM)/智能体(Agent)与外部工具、数据源、系统之间建立安全、统一的连接,让大模型能够动态获取外部上下文、调用外部能力,同时实现细粒度的权限控制与安全隔离

简单来说,MCP做了两件核心的事:

  1. 标准化:定义了大模型和外部系统“对话”的统一语言,不管是什么大模型、什么外部工具,只要符合MCP协议,就能无缝通信;
  2. 安全化:在大模型和外部系统之间建立了一层“安全沙箱”,细粒度控制大模型能做什么、不能做什么,避免越权操作。

2.2 通俗比喻:MCP是大模型的“通用USB接口”

想要快速理解MCP,这3个生活化的比喻足够清晰:

比喻1:MCP = 大模型的通用USB接口

电脑的USB接口有一个核心优势:标准化、即插即用。不管是U盘、鼠标、键盘、移动硬盘,只要符合USB协议,插到任何电脑上都能直接用,不用单独安装驱动。

MCP就是给大模型做的“通用USB接口”:

  • 大模型/智能体 = 电脑;
  • 外部工具/数据源(数据库、文件系统、API、硬件)= U盘/鼠标/键盘;
  • MCP协议 = USB协议,定义了统一的连接和通信标准。

在MCP出现之前,大模型接入外部工具就像“给电脑接外设要单独焊线”,每接一个工具就要单独开发一套适配代码;有了MCP之后,只要外部工具做了MCP适配,大模型就能即插即用,无需额外开发。

下图形象地展示了这一比喻:

MCP协议

大模型/智能体
(电脑)

MCP服务
(USB接口)

文件系统
(U盘)

数据库
(移动硬盘)

API服务
(键盘/鼠标)

硬件设备
(打印机)

比喻2:MCP = 大模型的“安全快递中转站”

大模型直接访问外部系统,就像让陌生人直接进你家拿东西,风险极高。而MCP就像小区的快递中转站:

  • 大模型 = 业主,只能通过中转站发出取件/寄件指令;
  • 外部系统 = 快递驿站/商家,只能和中转站对接;
  • MCP服务 = 快递中转站,负责校验业主的指令是否合法、有没有权限,只把合规的指令传递给外部系统,同时把返回的结果安全地交给业主。

通过这层中转,既实现了大模型和外部系统的通信,又完全隔离了风险,避免大模型直接操作外部系统导致的安全问题。

比喻3:MCP = 大模型的“实时上下文管家”

传统RAG就像“给大模型一本厚厚的书,让它自己翻找需要的内容”,很容易出现找不到重点、上下文溢出的问题。

而MCP就像一个专属管家,大模型需要什么信息,就告诉管家,管家会精准地从外部系统(文件、数据库、API)里获取对应的内容,只把大模型需要的上下文传递过去,既保证了信息的实时性,又避免了上下文冗余。

2.3 核心定位:MCP到底解决了什么问题?

很多人会把MCP简单理解为“升级版的Function Calling”,但它的定位远不止于此。MCP的核心价值,是解决了大模型落地的四大核心痛点:

  1. 跨模型兼容问题:一套MCP服务,可同时接入Claude、GPT、Gemini、Llama等几乎所有主流大模型,一次开发,多端复用;
  2. 开发效率问题:标准化的协议规范,无需为不同大模型重复开发适配代码,降低了大模型工具开发的门槛;
  3. 安全可控问题:提供了细粒度的权限控制、操作审计、沙箱隔离,企业可以放心地让大模型接入内部敏感系统;
  4. 上下文管理问题:支持大模型按需、动态获取外部上下文,替代传统被动式的RAG注入,既提升了上下文的精准度,又避免了窗口溢出。

3. MCP vs 传统方案:为什么它能替代Function Calling/插件系统?

想要理解MCP的先进性,就要看它和行业里已有的方案,到底有什么本质区别。

3.1 与Function Calling的核心区别

Function Calling是目前大模型最常用的工具调用能力,它允许大模型生成符合格式的函数调用指令,开发者解析后执行对应的函数,再把结果返回给大模型。

但它和MCP有本质的差距,下图的对比可以直观呈现:

MCP

Function Calling

劣势

劣势

劣势

劣势

非标准化
不同模型格式不同

单向调用
无状态同步

无原生权限控制

仅工具调用

完全标准化
一套定义多模型适用

双向通信
支持主动推送

原生权限控制/审计/沙箱

工具+上下文+提示词全场景

对比维度 Function Calling MCP协议
标准化程度 非标准化,不同大模型的函数定义格式、调用规范不兼容 完全标准化,一套定义适配所有支持MCP的大模型
通信模式 单向调用,大模型发起指令,开发者被动执行 双向通信,大模型和MCP服务可主动推送信息、状态同步
上下文管理 仅支持工具调用,无法动态管理上下文 原生支持上下文动态注入、提示词模板管理,覆盖RAG全场景
权限控制 无原生权限控制,需开发者自行实现 原生支持细粒度权限控制、操作审计、资源隔离
开发成本 每接入一个大模型,都要单独适配函数格式 一次开发,所有支持MCP的大模型均可直接使用

简单来说,Function Calling是“大模型工具调用的基础能力”,而MCP是“基于标准化协议的完整解决方案”,它不仅包含了工具调用的能力,还解决了Function Calling的兼容、安全、上下文管理等所有痛点。

3.2 与OpenAI插件系统的对比

OpenAI插件系统是最早的大模型插件生态,但它的局限性非常明显,这也是它始终没有大规模普及的核心原因:

  1. 平台锁定:仅支持ChatGPT,无法在其他大模型上使用,生态封闭;
  2. 开发门槛高:需要严格遵循OpenAI的插件规范,部署、审核流程复杂;
  3. 能力单一:仅支持工具调用和简单的上下文获取,缺乏完善的权限控制、提示词管理等能力;
  4. 私有化部署难:企业内部插件无法便捷地私有化部署,数据安全风险高。

而MCP是完全开源、开放的协议,无平台锁定、无厂商绑定,支持私有化部署,能力覆盖更全面,这也是它能快速替代插件系统的核心原因。

3.3 与传统RAG的能力边界差异

RAG(检索增强生成)是目前解决大模型知识更新、私有数据接入的主流方案,但传统RAG存在明显的短板,而MCP可以完美补足这些短板,甚至重构RAG的实现方式:

对比维度 传统RAG MCP增强型RAG
上下文注入方式 被动式,提前把文档分块、向量化,查询时检索相关内容一次性注入大模型 主动式,大模型按需向MCP服务发起查询,动态获取精准的上下文内容
数据实时性 差,需要提前做数据同步、分块、向量化,无法获取实时数据 强,直接对接数据源,实时查询最新数据,无需提前预处理
上下文精准度 依赖检索算法,容易出现检索内容不相关、冗余信息多的问题 极高,大模型可精准指定查询条件,只获取需要的内容,无冗余
数据覆盖范围 主要支持文档类数据,对接数据库、API、本地文件需要额外开发 全场景覆盖,文档、数据库、API、本地系统、硬件设备均可统一接入
开发复杂度 高,需要搭建向量数据库、分块嵌入、检索排序等一整套系统 低,直接复用开源MCP服务,无需搭建复杂的RAG系统

现在行业里已经出现了“MCP优先”的RAG方案:不再需要提前搭建向量数据库,直接通过MCP让大模型按需查询数据库、读取文件、调用API,实现了更轻量、更精准、更实时的检索增强。

3.4 核心优势总结

MCP相比传统方案,有四大不可替代的优势:

  1. 开放兼容:开源无锁定,一套服务适配所有主流大模型;
  2. 开发极简:标准化的协议规范,大幅降低大模型工具开发的门槛;
  3. 安全可控:原生的权限控制、审计、隔离能力,满足企业级安全要求;
  4. 能力全面:覆盖工具调用、上下文管理、提示词模板全场景,一套协议解决大模型外部连接的所有问题。

4. MCP核心原理与架构:协议底层逻辑全拆解

4.1 协议基础:基于JSON-RPC 2.0的双向通信

MCP的底层通信,完全基于JSON-RPC 2.0协议——这是一种轻量级的远程过程调用协议,使用JSON格式定义请求和响应,具备跨语言、跨平台、易解析的特点。

JSON-RPC 2.0的核心格式非常简单,所有通信都遵循统一的结构:

  • 请求格式:大模型向MCP服务发起调用
{
  "jsonrpc": "2.0",
  "id": "唯一请求ID",
  "method": "要调用的方法名",
  "params": "方法参数"
}
  • 响应格式:MCP服务向大模型返回结果
{
  "jsonrpc": "2.0",
  "id": "与请求ID一致",
  "result": "方法执行结果(成功时)",
  "error": "错误信息(失败时)"
}

MCP在JSON-RPC 2.0的基础上,定义了一套标准化的方法名、参数格式、响应结构,比如:

  • tools/list:大模型查询MCP服务提供的所有工具列表;
  • tools/call:大模型调用指定的工具;
  • context/list:查询MCP服务提供的上下文源;
  • context/get:获取指定的上下文内容。

这就是MCP标准化的核心:所有MCP服务都遵循同一套方法定义,大模型不需要关心服务的底层实现,只要按照协议格式发起请求,就能得到统一格式的响应

4.2 核心架构:客户端-服务端的双层模型

MCP采用经典的客户端-服务端(C/S)架构,整个系统分为两个核心角色,职责完全解耦:

1. MCP客户端
  • 定义:集成了MCP协议能力的大模型/智能体/应用,比如Claude Desktop、ChatGPT、LangChain Agent;
  • 核心职责
    1. 与MCP服务建立连接,完成协议握手;
    2. 向MCP服务查询可用的工具、上下文源;
    3. 根据用户需求,向MCP服务发起工具调用、上下文获取请求;
    4. 接收MCP服务的响应结果,融入大模型的上下文窗口,完成后续的生成任务。
2. MCP服务端
  • 定义:实现了MCP协议规范的后端服务,负责对接外部系统、工具、数据源,比如文件系统MCP服务、数据库MCP服务、天气API MCP服务;
  • 核心职责
    1. 实现MCP协议定义的标准方法,与客户端完成通信;
    2. 封装外部系统的能力,暴露为标准化的工具/上下文源;
    3. 实现权限控制、操作审计、安全隔离,过滤非法请求;
    4. 执行客户端的调用请求,返回统一格式的响应结果。

下图展示了客户端与服务端的交互流程:

外部系统 (文件/DB/API) MCP服务端 (封装外部系统) MCP客户端 (大模型/应用) 外部系统 (文件/DB/API) MCP服务端 (封装外部系统) MCP客户端 (大模型/应用) 全程基于JSON-RPC 2.0通信 1. 握手、查询工具/上下文 2. 返回能力列表(标准化定义) 3. 调用工具/获取上下文 4. 执行具体操作(权限控制) 5. 返回结果 6. 返回标准化响应

4.3 传输层:MCP的3种主流通信方式

MCP协议不绑定具体的传输方式,只定义了通信的内容格式,目前主流的传输方式有3种,适用于不同的场景:

传输方式 适用场景 特点
stdio(标准输入输出) 本地MCP服务,比如Claude Desktop接入本地工具 最简单、最安全,无需网络端口,通过进程的标准输入输出通信,适合本地单设备使用
HTTP/HTTPS 远程MCP服务、企业级私有化部署 支持跨设备、跨网络访问,可搭配HTTPS实现加密传输,适合服务端部署的MCP服务
WebSocket 实时性要求高的场景,比如实时数据推送、长连接通信 双向实时通信,支持服务端主动推送消息,适合需要实时更新上下文的场景

其中,stdio是本地开发最常用的方式,配置最简单,无需处理网络、端口、加密,Claude Desktop等客户端原生支持stdio方式的MCP服务接入;而HTTPS是企业级部署的首选,支持跨网络访问,可搭配企业的权限系统、网关实现统一管控。

4.4 MCP四大核心能力

MCP协议定义了四大核心能力,覆盖了大模型与外部系统交互的全场景。下图概括了这四大能力及其关系:

MCP服务端

工具调用能力

封装外部操作为标准工具

上下文提供能力

动态获取文件/DB/API内容

提示词模板能力

预定义场景化提示词

安全与权限控制

细粒度权限/审计/沙箱

1. 工具调用能力(Tool Calling)

这是MCP最基础的能力,允许MCP服务把外部系统的能力,封装为标准化的工具,暴露给大模型调用。

每个工具都遵循统一的定义格式,包含:工具名称、描述、参数格式(JSON Schema),大模型可以自动理解工具的用途和使用方式,无需额外的提示词引导。

示例:天气查询工具的标准化定义

{
  "name": "get_weather",
  "description": "查询指定城市的实时天气信息",
  "inputSchema": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": "要查询的城市名称,比如北京、上海"
      }
    },
    "required": ["city"]
  }
}
2. 上下文提供能力(Context Provider)

这是MCP区别于传统Function Calling的核心能力之一,它允许大模型动态、按需获取外部上下文,替代传统的RAG方案。

MCP服务可以定义多个上下文源,比如“项目代码库”“企业数据库”“实时新闻API”,大模型可以根据用户需求,主动获取对应的上下文内容,无需提前把所有内容注入上下文窗口。

比如,大模型需要分析项目里的main.py文件,它可以通过MCP的context/get方法,直接读取该文件的内容,只把需要的代码注入上下文,既精准又节省窗口空间。

3. 提示词模板能力(Prompt Template)

MCP协议原生支持标准化的提示词模板管理,允许MCP服务把特定场景的提示词封装为模板,大模型可以直接调用,无需重复编写提示词。

比如,一个代码分析的MCP服务,可以提供“代码漏洞扫描”“代码性能优化”“代码注释生成”等提示词模板,大模型只需要传入代码内容,就能直接使用标准化的提示词完成对应的任务,保证了输出效果的稳定性。

4. 安全与权限控制能力

这是MCP企业级落地的核心保障,协议原生支持细粒度的权限控制、操作审计、资源隔离:

  • 细粒度权限:可以控制大模型能调用哪些工具、能访问哪些上下文源,比如只允许读取指定目录的文件,不允许写入、删除;
  • 操作审计:所有大模型的调用请求、执行结果都会被记录,可追溯、可审计,满足企业的合规要求;
  • 沙箱隔离:MCP服务可以在沙箱环境中执行大模型的指令,比如文件操作限制在指定目录、终端命令只允许执行白名单内的指令,避免越权操作;
  • 用户确认机制:对于高风险操作(比如删除文件、执行终端命令),可以配置“用户二次确认”,只有用户同意后才会执行,避免大模型误操作。

5. MCP全场景应用:从个人开发到企业级落地

MCP的应用场景非常广泛,从个人开发者的效率工具,到企业级的大模型落地,再到行业垂直场景,都能发挥核心价值。下图以思维导图形式展示了主要应用领域:

root(MCP应用场景)

个人开发者

本地文件操作

终端命令执行

代码库分析

数据库调试

企业级

内部数据安全接入

统一工具中台

智能客服/内部助手

研发效能提升

行业垂直

金融:实时行情/客户信息/合规审核

医疗:电子病历/医学文献/设备监控

工业:设备监控/生产优化/安全预警

5.1 个人开发者场景:本地开发效率神器

对于个人开发者来说,MCP可以让大模型变成你的“专属开发助手”,彻底打通大模型和你的本地开发环境,实现全流程的开发辅助:

  1. 本地文件系统操作:通过MCP让大模型直接读取、修改、创建本地项目文件,无需手动复制粘贴代码。比如你说“给我的Vue项目添加一个登录页面”,大模型可以直接通过MCP读取项目结构,创建对应的.vue文件,写入代码,无需你手动创建文件、复制代码;
  2. 终端命令执行:让大模型直接执行终端命令,比如安装依赖、启动项目、打包构建、Git提交代码。比如你说“帮我初始化一个React项目,安装Ant Design依赖,启动开发服务器”,大模型可以通过MCP自动执行所有终端命令,完成项目初始化;
  3. 代码库分析与重构:大模型通过MCP读取整个代码库的内容,分析代码结构、查找bug、优化性能、生成注释文档。比如你说“帮我分析这个Python项目的代码结构,找出潜在的性能问题,给出优化方案”,大模型可以直接读取所有代码文件,完成分析;
  4. 数据库本地调试:通过MCP让大模型连接本地数据库,执行SQL查询、分析表结构、优化SQL语句。比如你说“帮我查询用户表中最近7天注册的用户数量,优化这条SQL的执行效率”,大模型可以直接通过MCP连接数据库,完成查询和优化。

目前已经有大量开源的个人开发类MCP服务,比如文件系统MCP、终端MCP、Git MCP、Docker MCP等,接入Claude Desktop后,就能直接拥有一个能操作你本地开发环境的AI助手。

5.2 企业级场景:内部系统与大模型的安全打通

对于企业来说,MCP解决了“大模型接入内部敏感系统”的核心痛点,是企业级大模型落地的最佳方案:

  1. 内部数据安全接入:通过MCP服务,企业可以把内部数据库、ERP、CRM、OA等系统的能力,安全地暴露给大模型,细粒度控制大模型的访问权限,比如只允许查询指定表的数据,不允许修改、删除,同时所有操作都有审计日志,满足合规要求;
  2. 统一的大模型工具中台:企业可以搭建统一的MCP服务中台,把内部的各类系统、API、数据能力封装为标准化的MCP服务,不管企业使用哪个大模型(Claude、GPT、开源大模型),都可以直接复用这些能力,无需重复开发;
  3. 智能客服与内部助手:基于MCP搭建企业智能客服/内部助手,让大模型可以通过MCP查询订单信息、物流状态、员工考勤、审批流程等,直接回答用户的问题,无需人工介入;
  4. 研发效能提升:把企业的代码仓库、CI/CD系统、测试平台封装为MCP服务,让大模型辅助开发人员完成代码评审、自动化测试、部署上线等工作,提升研发效率。

很多大型企业已经开始基于MCP搭建自己的大模型工具中台,相比传统的定制化开发,MCP的标准化方案大幅降低了开发成本,同时解决了安全合规的核心问题。

5.3 行业垂直场景:金融/医疗/工业的落地实践

金融行业
  • 实时行情查询:通过MCP让大模型接入股票、基金、期货的实时行情API,用户可以直接问“今天贵州茅台的股价是多少?”,大模型通过MCP获取实时数据,给出准确回答;
  • 客户信息查询:银行、券商可以通过MCP让大模型安全接入客户管理系统,客户经理可以通过大模型快速查询客户的资产情况、持仓信息、交易记录,提升服务效率;
  • 风险合规审核:通过MCP让大模型接入合规规则库、监管政策库,对金融产品的宣传材料、合同文本进行合规审核,识别违规内容。
医疗行业
  • 电子病历检索:通过MCP让大模型安全接入医院的电子病历系统,医生可以通过大模型快速查询患者的病史、检查报告、用药记录,辅助诊断;
  • 医学文献查询:通过MCP让大模型接入医学文献数据库,实时查询最新的医学研究成果、临床指南,辅助医生制定治疗方案;
  • 医疗设备监控:通过MCP让大模型接入医疗设备的实时数据,监控患者的生命体征,出现异常时及时预警。
工业行业
  • 设备实时监控:通过MCP让大模型接入工业物联网设备,实时获取设备的运行数据、传感器数据,监控设备运行状态,预测设备故障;
  • 生产流程优化:通过MCP让大模型接入生产管理系统,获取生产数据,分析生产瓶颈,给出生产流程优化方案;
  • 安全生产管理:通过MCP让大模型接入监控摄像头、安全传感器,实时识别生产现场的安全隐患,发出预警。

6. 从零实战:30分钟搭建并接入你的第一个MCP服务

理论讲完,我们通过一个完整的实战案例,从零开始搭建一个天气查询的MCP服务,然后接入Claude Desktop,让大模型实现实时天气查询。整个过程30分钟即可完成,零基础也能跟着操作。

下图概括了实战的全流程:

开发者创建MCP服务

实现tools/list, tools/call等接口

使用stdio或HTTP启动服务

在Claude Desktop配置MCP服务

重启Claude,自动连接MCP

用户提问触发工具调用

大模型通过MCP获取实时数据

返回格式化结果给用户

6.1 环境准备:前置依赖与工具

  1. Node.js环境:版本≥18.0.0,用于运行MCP服务(也可以用Python,本文用Node.js官方SDK,更简单);
  2. Claude Desktop:最新版本,原生支持MCP协议,用于接入我们的MCP服务;
  3. 天气API密钥:本文使用和风天气API,免费版即可使用,申请地址:https://dev.qweather.com/;
  4. 代码编辑器:VS Code,用于编写MCP服务代码。

6.2 实战案例1:用Node.js搭建天气查询MCP服务

我们将使用MCP官方的Node.js SDK,快速搭建一个天气查询MCP服务,提供两个核心工具:

  1. get_weather_now:查询指定城市的实时天气;
  2. get_weather_forecast:查询指定城市的未来3天天气预报。
步骤1:初始化项目
# 创建项目文件夹
mkdir mcp-weather-demo
cd mcp-weather-demo

# 初始化npm项目
npm init -y

# 安装MCP官方SDK和axios(用于调用天气API)
npm install @modelcontextprotocol/sdk axios
步骤2:编写MCP服务核心代码

在项目根目录创建index.js文件,写入以下代码:

const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
const {
  CallToolRequestSchema,
  ListToolsRequestSchema,
} = require('@modelcontextprotocol/sdk/types.js');
const axios = require('axios');

// 和风天气API配置,替换为你自己的KEY
const QWEATHER_KEY = '你的和风天气API_KEY';
const QWEATHER_BASE_URL = 'https://devapi.qweather.com/v7';

// 1. 创建MCP服务实例
const server = new Server(
  {
    name: 'mcp-weather-demo',
    version: '1.0.0',
  },
  {
    capabilities: {
      tools: {}, // 声明服务提供工具能力
    },
  }
);

// 2. 实现工具列表查询:大模型调用此方法获取所有可用工具
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: 'get_weather_now',
        description: '查询指定城市的实时天气信息,包括温度、天气状况、风力、湿度等',
        inputSchema: {
          type: 'object',
          properties: {
            cityName: {
              type: 'string',
              description: '要查询的城市中文名称,比如北京、上海、深圳、广州',
            },
          },
          required: ['cityName'],
        },
      },
      {
        name: 'get_weather_forecast',
        description: '查询指定城市的未来3天天气预报,包括每天的最高/最低温度、天气状况',
        inputSchema: {
          type: 'object',
          properties: {
            cityName: {
              type: 'string',
              description: '要查询的城市中文名称,比如北京、上海、深圳、广州',
            },
          },
          required: ['cityName'],
        },
      },
    ],
  };
});

// 工具函数:根据城市名称获取城市ID(和风天气需要用城市ID查询)
async function getCityId(cityName) {
  try {
    const response = await axios.get(`${QWEATHER_BASE_URL}/city/lookup`, {
      params: {
        location: cityName,
        key: QWEATHER_KEY,
      },
    });
    if (response.data.code === '200' && response.data.location.length > 0) {
      return response.data.location[0].id;
    }
    throw new Error(`未找到城市${cityName}的信息`);
  } catch (error) {
    throw new Error(`获取城市ID失败:${error.message}`);
  }
}

// 3. 实现工具调用:大模型调用此方法执行具体的工具
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;

  try {
    // 处理实时天气查询
    if (name === 'get_weather_now') {
      const { cityName } = args;
      const cityId = await getCityId(cityName);
      
      const response = await axios.get(`${QWEATHER_BASE_URL}/weather/now`, {
        params: {
          location: cityId,
          key: QWEATHER_KEY,
        },
      });

      if (response.data.code !== '200') {
        throw new Error(`天气查询失败:${response.data.msg}`);
      }

      const weather = response.data.now;
      return {
        content: [
          {
            type: 'text',
            text: `${cityName}实时天气】
温度:${weather.temp}℃
天气状况:${weather.text}
风力:${weather.windDir} ${weather.windScale}级
湿度:${weather.humidity}%
体感温度:${weather.feelsLike}℃
更新时间:${response.data.updateTime}`,
          },
        ],
      };
    }

    // 处理天气预报查询
    if (name === 'get_weather_forecast') {
      const { cityName } = args;
      const cityId = await getCityId(cityName);
      
      const response = await axios.get(`${QWEATHER_BASE_URL}/weather/3d`, {
        params: {
          location: cityId,
          key: QWEATHER_KEY,
        },
      });

      if (response.data.code !== '200') {
        throw new Error(`天气预报查询失败:${response.data.msg}`);
      }

      const forecastList = response.data.daily;
      let forecastText = `${cityName}未来3天天气预报】\n`;
      
      forecastList.forEach((item, index) => {
        forecastText += `\n${index === 0 ? '今天' : index === 1 ? '明天' : '后天'}:
天气:${item.textDay}${item.textNight}
温度:${item.tempMin}℃ ~ ${item.tempMax}℃
风力:${item.windDirDay} ${item.windScaleDay}级\n`;
      });

      return {
        content: [
          {
            type: 'text',
            text: forecastText,
          },
        ],
      };
    }

    // 未知工具处理
    throw new Error(`未知工具:${name}`);
  } catch (error) {
    return {
      content: [
        {
          type: 'text',
          text: `工具执行失败:${error.message}`,
        },
      ],
      isError: true,
    };
  }
});

// 4. 启动服务:通过stdio传输与客户端通信
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error('MCP天气服务已启动,运行在stdio模式');
}

main().catch((error) => {
  console.error('服务启动失败:', error);
  process.exit(1);
});
步骤3:配置package.json的启动命令

package.json中添加启动命令:

{
  "scripts": {
    "start": "node index.js"
  }
}
步骤4:测试服务是否正常
# 启动服务
npm run start

如果终端输出MCP天气服务已启动,运行在stdio模式,说明服务编写成功,按Ctrl+C停止服务。

6.3 实战案例2:在Claude Desktop中接入MCP服务

Claude Desktop原生支持MCP协议,我们只需要简单的配置,就能接入刚才编写的天气MCP服务。

步骤1:找到Claude Desktop的配置文件

不同操作系统的配置文件路径:

  • Windows%APPDATA%/Claude/claude_desktop_config.json
  • macOS~/Library/Application Support/Claude/claude_desktop_config.json
  • Linux~/.config/Claude/claude_desktop_config.json
步骤2:编辑配置文件,添加MCP服务

打开claude_desktop_config.json文件,写入以下配置(注意替换command中的node路径和项目路径):

{
  "mcp": {
    "servers": {
      "weather-demo": {
        "command": "node",
        "args": [
          "/你的项目完整路径/mcp-weather-demo/index.js"
        ]
      }
    }
  }
}
  • Windows示例:args里的路径写C:\\code\\mcp-weather-demo\\index.js(注意双反斜杠);
  • macOS/Linux示例:args里的路径写/Users/xxx/code/mcp-weather-demo/index.js
步骤3:重启Claude Desktop,验证MCP服务接入
  1. 完全关闭Claude Desktop,重新打开;
  2. 打开Claude的设置,找到“MCP”选项,就能看到我们的weather-demo服务,状态显示“Connected”,说明接入成功;
  3. 如果状态是错误,检查配置文件中的路径是否正确,node命令是否可用,代码是否有语法错误。

6.4 实战验证:让大模型通过MCP完成实时天气查询

现在,我们可以直接和Claude对话,让它通过MCP服务查询天气了:

  1. 输入:“帮我查一下北京今天的实时天气”;
  2. Claude会自动识别需要调用get_weather_now工具,发起MCP调用,获取天气数据;
  3. 最终Claude会返回格式化的天气信息,包含温度、天气状况、风力、湿度等内容;
  4. 再输入:“帮我查一下上海未来3天的天气预报”,Claude会调用get_weather_forecast工具,返回对应的预报信息。

至此,我们完成了从MCP服务开发、到客户端接入、再到实际使用的全流程实战。


7. 常见踩坑与解决方案:MCP落地避坑指南

坑1:Claude Desktop中MCP服务连接失败

  • 常见原因
    1. 配置文件中的路径错误,或node命令不可用;
    2. MCP服务代码有语法错误,启动时崩溃;
    3. 配置文件格式错误(JSON格式不合法)。
  • 解决方案
    1. 先在终端手动执行启动命令,确认服务能正常启动,无报错;
    2. 用JSON校验工具检查配置文件格式是否合法;
    3. 配置文件中使用绝对路径,避免相对路径导致的找不到文件问题;
    4. Windows系统注意路径中的反斜杠需要转义(用\\)。

坑2:大模型无法正确调用MCP工具

  • 常见原因
    1. 工具的description描述不清晰,大模型无法理解工具的用途;
    2. 参数的inputSchema定义不规范,大模型生成的参数格式不符合要求;
    3. 工具返回的内容格式不标准,大模型无法解析。
  • 解决方案
    1. 工具的description要写得足够详细,明确说明工具的用途、适用场景;
    2. 参数的description要清晰,说明每个参数的含义、格式要求;
    3. 严格遵循MCP协议的响应格式,返回的content必须是type: text的数组格式。

坑3:安全风险,大模型误操作导致数据丢失

  • 常见原因
    1. 没有做细粒度的权限控制,大模型可以执行高风险操作(比如删除文件、执行危险终端命令);
    2. 没有配置用户二次确认机制,大模型的调用直接执行,无人工审核。
  • 解决方案
    1. 遵循最小权限原则,只给MCP服务开放必要的权限,比如文件操作限制在指定目录,终端命令只允许白名单内的指令;
    2. 对于高风险操作,配置用户二次确认,Claude Desktop原生支持此功能,只有用户确认后才会执行工具调用;
    3. 开启操作审计,所有工具调用都记录日志,可追溯、可回滚。

坑4:MCP服务返回的上下文过多,导致大模型上下文窗口溢出

  • 常见原因
    1. 上下文提供能力没有做分页、截断,一次性返回大量文本内容;
    2. 工具调用的返回结果包含大量冗余信息,没有做精简。
  • 解决方案
    1. 上下文获取实现分页、关键词过滤,只返回大模型需要的核心内容,避免一次性返回大量文本;
    2. 工具调用的返回结果做精简,只保留关键信息,去除冗余内容;
    3. 对于超长内容,提供摘要能力,先给大模型返回摘要,大模型需要详情时再返回完整内容。

坑5:跨大模型兼容问题,一套MCP服务在不同大模型上表现不一致

  • 常见原因
    1. 使用了特定大模型的扩展能力,没有遵循MCP标准协议;
    2. 工具的描述、参数定义适配了特定大模型的提示词偏好,其他大模型无法正确理解。
  • 解决方案
    1. 严格遵循MCP官方协议规范,不使用非标准的扩展能力;
    2. 工具的描述、参数定义要通用、清晰,不依赖特定大模型的提示词技巧;
    3. 在不同大模型上测试MCP服务,确保兼容性。

8. MCP生态与未来发展:从协议到下一代大模型基础设施

8.1 快速发展的MCP生态

MCP推出仅半年时间,已经形成了非常繁荣的开源生态:

  1. 官方支持:Anthropic、OpenAI、Google等大模型厂商纷纷宣布兼容MCP协议,Claude Desktop原生支持MCP,成为了MCP普及的核心推手;
  2. 开源MCP服务:全球开发者已经贡献了数千个开源MCP服务,覆盖文件系统、终端、数据库、Git、Docker、API对接、行业工具等几乎所有场景,开箱即用;
  3. 框架集成:LangChain、Autogen、LlamaIndex、Dify等主流Agent/大模型应用框架,都已经全面集成MCP协议,支持直接接入MCP服务;
  4. 企业级解决方案:已经出现了企业级的MCP服务中台、权限管理系统、审计平台,满足企业的私有化部署、安全合规需求。

8.2 MCP的未来发展方向

MCP已经不再是一个简单的工具协议,正在成为大模型时代的基础设施,未来的发展方向非常清晰:

  1. 标准化的全面推进:MCP正在成为大模型外部连接的事实标准,未来所有大模型、Agent框架都会原生支持MCP协议,实现真正的“一次开发,全生态复用”;
  2. 多模态能力扩展:目前MCP主要聚焦文本上下文,未来会扩展支持图片、音频、视频等多模态内容的上下文传递,让大模型可以通过MCP获取、处理多模态数据;
  3. 分布式MCP网络:未来会出现分布式的MCP服务网络,开发者可以把自己的MCP服务发布到网络中,其他用户可以安全地调用,形成一个大模型能力的共享生态;
  4. 安全体系的完善:会出现更完善的MCP安全框架,比如零信任访问、数据加密、动态权限控制、恶意行为检测,让企业可以更安全地把核心系统接入大模型;
  5. 与Agent框架的深度融合:MCP会成为智能体的“感官和手脚”,Agent可以通过MCP协议自动发现、接入、使用外部能力,实现完全自主的任务执行。

9. 总结:MCP的核心价值与开发者入门建议

MCP的核心价值

MCP的出现,解决了大模型落地的核心痛点——大模型与外部世界的安全、标准化连接

它的价值可以用三句话总结:

  1. 对个人开发者:MCP让你可以轻松打通大模型和本地开发环境,把大模型变成真正的效率神器,大幅降低开发门槛;
  2. 对企业:MCP提供了一套安全、标准化的方案,让企业可以放心地把内部系统、敏感数据接入大模型,实现大模型的规模化落地;
  3. 对整个行业:MCP统一了大模型外部连接的标准,打破了平台锁定,形成了开放、繁荣的大模型工具生态,推动整个行业从“聊天机器人”向“真正的智能助手”演进。

给开发者的入门建议

  1. 先动手实战:不要只看理论,跟着本文的实战案例,搭建自己的第一个MCP服务,接入Claude Desktop,直观感受MCP的能力;
  2. 复用开源生态:不用重复造轮子,GitHub上有大量成熟的开源MCP服务,可以直接拿来用,也可以基于它们二次开发;
  3. 重视安全问题:开发MCP服务时,始终遵循最小权限原则,做好权限控制、操作审计,避免出现安全漏洞;
  4. 紧跟协议更新:MCP协议还在快速迭代,关注官方仓库的更新,了解最新的能力和规范,避免使用过时的特性。

最后,MCP的本质不是一个技术框架,而是一套“开放、标准化”的思想。在大模型快速发展的今天,开放、兼容、标准化的协议,才是推动整个行业进步的核心动力。而对于开发者来说,掌握MCP,就是掌握了下一代大模型应用开发的核心能力。


10. 附录:MCP核心资源与常用工具速查表

核心资源

  1. MCP官方仓库:https://github.com/modelcontextprotocol
  2. MCP官方文档:https://modelcontextprotocol.io/
  3. 开源MCP服务合集:https://github.com/modelcontextprotocol/servers
  4. Claude Desktop MCP配置指南:https://docs.anthropic.com/en/claude-desktop/mcp

常用开源MCP服务

MCP服务名称 核心能力 地址
mcp-server-fs 文件系统操作,支持目录权限控制 官方仓库
mcp-server-terminal 终端命令执行,支持白名单控制 官方仓库
mcp-server-postgres PostgreSQL数据库查询 官方仓库
mcp-server-git Git仓库操作、代码提交 开源社区
mcp-server-browser 浏览器控制、网页内容抓取 开源社区

核心API速查表

API方法 核心作用
initialize 客户端与服务端握手,初始化连接
tools/list 客户端查询服务端提供的工具列表
tools/call 客户端调用指定的工具
context/list 客户端查询服务端提供的上下文源
context/get 客户端获取指定的上下文内容
prompts/list 客户端查询服务端提供的提示词模板
prompts/get 客户端获取指定的提示词模板
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐