[控场AI]
· 9 分钟阅读· 4,518 字

MCP协议入门:从概念到天气服务实战开发全解析

MCP协议入门:从概念到天气服务实战开发全解析

MCP是Anthropic推出的大模型工具调用标准协议,本文从架构原理到Python实战完整讲解其开发流程。

MCP(模型上下文协议)是Anthropic推出的开放标准,通过统一的调用协议解决大模型与外部工具之间的兼容性难题,作用类似USB接口。其核心架构分为Host、Client、Server三层,Client充当大模型与工具服务之间的桥梁,驱动"调用—返回—归纳"闭环。协议支持stdio本地通信与SSE+HTTP远程通信两种机制,均基于JSON-RPC 2.0格式。文章以天气查询为例,演示了如何用Python和UV工具开发MCP Server、在Claude Desktop中配置并验证调用,以及如何用代码编写自定义MCP Client,并指出UV环境配置、路径正确性和API Key是实战中的三个常见坑点。

什么是MCP:大模型的"USB接口"

MCP(Model Context Protocol,模型上下文协议)是由Anthropic推出的一种开放标准,目标是解决大模型与外部数据源、工具之间的通信问题。在没有统一标准之前,各家公司的API实现五花八门——有的用JSON,有的用XML,还有的采用WebService,大模型想调用这些工具时兼容性非常麻烦。

MCP的本质是一套标准化的调用协议。有了它之后,大模型接入不同工具时可以使用相同的协议方式去调用,仅在参数上存在差异,发起请求、获取报文等环节都是标准化的。这让AI应用能够更高效、更安全地访问和操作本地及远程数据,为AI应用提供了"连接万物"的接口。

官方文档里有一个贴切的比喻:MCP就像电脑上的USB接口。USB提供了标准化的方式将鼠标、键盘等设备接入电脑,而MCP则提供标准化方式将AI模型连接到不同的数据源与工具。目前主流的模型提供商基本都已支持MCP。

MCP、Function Calling与Agent的关系

这三个概念容易混淆,有必要理清。Function Calling是AI模型调用函数的一种底层机制;MCP是一种标准协议,让AI模型与各类API无缝交互;而AI Agent则是一个自主运行的智能系统,它利用Function Calling和MCP来分析并执行任务,最终实现特定目标。简单说,Function Calling是能力,MCP是规范,Agent是应用形态。

Function Calling(函数调用)是目前主流大模型普遍支持的一种能力:模型在生成回复时,可以输出一段结构化的"意图",声明自己想调用哪个函数、传入什么参数,由外部程序实际执行后再将结果返回给模型。这一机制由OpenAI率先在GPT-4中正式推出,随后Claude、Gemini、DeepSeek广告等模型相继跟进。Function Calling本质上是模型与宿主程序之间的"意图传递",但它只规定了模型侧的输入输出格式,并不规定工具服务端该如何实现。MCP正是在Function Calling之上补充了那层缺失的"服务端规范"——它定义了工具如何注册、参数如何描述、结果如何返回,让同一个工具服务可以被不同模型、不同宿主复用,而无需为每个模型单独适配。

MCP的核心架构

理解MCP开发,先要搞清楚它的三层架构。

MCP主机(Host):发起MCP请求的客户端程序。比如Claude Desktop桌面应用,或者Cursor、VSCode这类带AI功能的IDE,都可以作为MCP主机。我们在其中对话聊天时,背后就是主机在驱动调用。

MCP客户端(Client):运行在主机内部,与MCP服务端保持一对一的长连接。目前主流IDE工具内都会内置一个MCP Client,用来与Server建立持续的数据传输通道。

MCP服务端(Server):为客户端提供上下文、工具和提示词信息。比如一个天气查询的MCP服务器,需要具备查询天气的工具,并给出参数说明。Server既可以访问本地资源(如文件、数据库),也可以连接远程资源(如天气API)。

MCP结果会被发送回大模型

客户端的工作流程

MCP Client充当了大模型与MCP Server之间的桥梁,其工作流程可以拆成几步:Client先从Server获取可用工具列表;再将用户查询连同工具描述通过Function Calling一起发给大模型;大模型判断是否使用工具以及用哪些工具;如需调用,Client通过Server执行相应工具;工具返回的结果(通常是JSON报文)再交给大模型做总结归纳,最终输出用户能看懂的自然语言。

这个"调用—返回—归纳"的闭环,是MCP实用价值的核心。原始的JSON天气数据用户看不懂,正是靠大模型的总结能力,才能把它转化成"北京多少度、什么天气"这样的可读内容。

两种通信机制与服务端功能

MCP协议支持两种通信机制,均采用JSON-RPC 2.0格式传输消息。

  • stdio(标准输入输出):本地通信方式,适合客户端与服务器运行在同一台机器上,效率较高。
  • SSE + HTTP:用于Web形式的远端通信,适合跨网络、需要访问远程资源或分布式部署的场景。

MCP服务端作为关键组件,主要提供三类功能:资源(类似文件的数据,可被客户端读取,如API响应、文件内容)、工具(可被大模型调用的函数,需用户批准)、提示词(预先编写的模板,帮助完成特定任务)。

JSON-RPC 2.0是一种轻量级的远程过程调用(RPC)协议,消息格式基于JSON,无状态、传输层无关,既可以走HTTP,也可以走WebSocket或stdio等任意字节流。一条典型的请求消息包含四个字段:jsonrpc(固定值"2.0")、method(要调用的方法名)、params(参数对象)和id(用于匹配响应的标识符)。MCP选用JSON-RPC 2.0作为消息格式,意味着它天然支持异步、批量调用,也便于调试——用任何能发送JSON的客户端都可以手动构造请求进行测试。SSE(Server-Sent Events)是一种基于HTTP的单向推送技术,服务端可以持续向客户端推送事件流,MCP将其与HTTP POST结合,实现了客户端发请求、服务端异步推回结果的双向交互,适合跨网络的远程工具场景。

实战:用Python开发天气查询MCP服务

下面进入动手环节,目标是基于Claude Desktop作为客户端,开发一个查询天气的MCP Server。

环境准备

先决条件包括:Python 3.10或更高版本,安装Claude Desktop,以及安装UV这个Python包管理工具。UV是一站式的管理工具,能方便地管理Python包。安装UV需打开PowerShell执行安装命令,装完后记得设置环境变量,这样重启后依然能识别uv命令。

UV是由Astral团队(也是Python代码检查工具Ruff的开发者)用Rust编写的新一代Python包管理工具,目标是替代pip、pip-tools、virtualenv、poetry等工具的组合。其核心优势在于速度极快(依赖解析和安装比pip快10-100倍)以及将项目初始化、虚拟环境管理、依赖锁定、脚本运行整合为统一命令行接口。uv init会生成项目骨架和pyproject.toml,uv venv在项目目录下创建隔离的虚拟环境,uv add在添加依赖的同时自动更新锁文件,uv run则无需手动激活虚拟环境即可在隔离环境中执行脚本。对于MCP Server开发,使用UV的另一个好处是Claude Desktop配置文件中可以直接用uv run启动脚本,避免了系统Python环境与项目依赖冲突的问题。

创建项目与编写Server

创建流程大致如下:

uv init weather        # 初始化项目
cd weather
uv venv                # 创建虚拟环境
uv add "mcp[cli]" httpx # 安装MCP相关包

随后新建weather.py文件,核心是创建一个FastMCP实例,访问api.weather.gov接口来获取天气信息。代码中声明了两个MCP工具:一个根据城市名获取天气预报,另一个根据经纬度获取定位信息。

传入纽约等城市名获取天气

在Claude Desktop中配置服务

打开Claude Desktop的 File → Settings → Developer,点击 Edit Config 编辑claude_desktop_config.json文件,将MCP服务配置进去——关键是把运行目录配置正确,用UV命令方式运行weather.py脚本。配置完成后需要完全退出并重启Claude,服务才会进入running状态。

可以尝试其他案例

验证调用

重启后在聊天界面能看到工具图标,集成的两个工具就在其中。输入"What's the weather in 纽约",Claude会先用大模型把纽约的经纬度分析出来,封装成参数调用get_forecast函数,并在调用前请求用户授权。返回的是一段英文JSON,加上"请用中文输出"后,大模型就会把一周的天气整理成可读的中文内容。

用MCP Client编码方式调用

除了借助现成的客户端,也可以用代码的方式自己写一个MCP Client来连接服务。

创建weather.py文件

客户端代码的核心逻辑包括:定义MCPClient类并初始化会话(这里用Anthropic的库);通过connect_to_server连接MCP服务器,根据传入的是Python还是JS文件做不同处理,采用stdio方式建立连接;调用list_tools拿到工具列表;将工具描述拼装后随用户查询一起发给大模型,触发Function Calling;当返回报文中出现tool_use时,用MCP session客户端执行工具调用,拿到结果后再交给大模型做总结归纳;最后进入一个基于命令行的聊天循环,持续对话。

运行方式是:

uv run client.py d:/weather/weather.py

这里需要注意,客户端代码中调用了Claude 3.5模型,需要配置Anthropic的API Key(放在.env文件中)并充值才能用。如果API Key无法充值,完全可以换成DeepSeek等其他模型,仅改一个模型配置即可,调用方法本身没有问题。

小结:开发者该掌握的几个要点

走完整个流程,有几个关键点值得记牢:

  • MCP解决的是数据孤岛问题,为AI应用提供标准化的"连接万物"接口;
  • 核心架构是Host、Client、Server三层,Client是大模型与Server之间的桥梁;
  • 两种通信机制各有适用场景:stdio用于本地,SSE+HTTP用于远程;
  • Server提供资源、工具、提示词三类功能;
  • 实战中UV环境搭建、配置文件目录正确性、API Key充值是三个常见坑点。

掌握这套基础概念与开发流程后,就可以在天气案例的基础上扩展出数据库查询、文件操作、联网搜索等更丰富的MCP服务。

分享:

相关推荐