MCP(模型上下文协议)
一、概述
MCP(即模型上下文协议), 是一项开放标准, 它在2024年11月被推出, 其目的在于, 为大型语言模型提供一套安全且标准化的通信协议, 借由这套协议来完成连接以及调用外部数据源和工具的动作, 进而推动AI从仅仅会回答的状态, 升级成为能够执行操作的行动助手。
二、引言
当下, 各大LLM平台(就像 、、这样的)一般都支持 , 准许模型在有需求的时候调用特定函数(好比访问网络、查询数据库之类的)以此来扩充能力。可是, 不同平台的Call API有着实现方面的差别, 致使开发者在进行平台切换时要再度适配, 这就增添了开发成本。
如下图所示(LLM Model与的调用过程):

MCP 的核心之处在于, 针对大模型调用外部工具构建起一个标准化了的流程 , 在此基础之上, MCP 又去作进一步地定义, 从请求构建开始, 历经发送, 再到执行 , 最后直至结果返回, 这样一步接一步依次推进的一系列标准化流程 , 因为有了 MCP , 模型能够以一种统一起来的方式, 与各种各样的外部工具以及数据源相互进行交互 , 如此一来, 便极大程度地提升了跨平台的兼容性, 还提高了 AI 应用开发的效率。

三、MCP架构
MCP 遵循客户端-服务器架构,角色主要包含三部分:
若运行LLM(比如那一些、还有那些、以及其他的)的实体节点, 当所使用的LLM是线上模型时, 则能够将此部分给忽略掉。
有一种运行着能与大模型对话且可能使用工具的客户端, 它被称作MCP。它和MCP保持着1:1的连接, 它负责去解析模型请求,要是使用工具的话它会把请求转发到对应的MCP。
负责处理请求的, 会把结果返回给的, 运行着实际外部工具的, 像是访问文件系统、发送邮件、查询日历这些外部工具的服务端, 被称作MCP。
(资源): 仅仅是进行只读操作的数据, 像是本地的文件、数据库之中的记录、知识库里面的内容等等。Tools(工具): 能够被执行的函数, 例如进行发送邮件的操作、运行代码、调用第三方的API等等。(提示): 预先定义好的工作流模板, 用来指导模型达成特定任务(像是代码生成、报告撰写等)。
两种通信机制存在于MCP与MCP之间, 一种是Stdio(标准输入/输出), 另一种是SSE(-Sent-Event, 服务器发送事件), 如下是对这两种机制的介绍:

例如:查询天气流程
Host接收用户提问, “今天天津天气如何? ”, Host解析用户意图, 经MCP发送标准化JSON-RPC请求, 请求被路由到对应的天气MCP, 天气MCP执行查询, 结构化天气数据得以返回, 返回结果被传回Host, 经模型整合数据后生成自然语言回答给用户。
四、技术实现与工作流程
MCP的技术达成, 主要依靠标准化的通信协定, 还有动态发觉机制:
标准化通信方面, MCP 借助 JSON - RPC 2.0 协议以开展通信行动, 不管是本土通信凭借标准输入输出也就是 stdio, 还是远程通信依靠基于 HTTP 的 SSE 长连接, 全部的请求以及响应均依照统一的 JSON 消息格式, 从而保障了交互的规范性。动态发现机制这里面, 这属于 MCP 的核心创新之处, MCP 能够主动去查询 MCP 所提供的工具列表也就是(()), 进而会返回工具的元数据其中涵盖名称、参数、描述。当有新增工具之后, 还能够主动去通知进行刷新列表, 而这件事情意味着AI是可以在实时状况下实现集成新工具这一行为的, 并且是不需要提前去编写适配代码才能够整合得起来的。
五、MCP的优势
MCP 的出现解决了传统 AI 应用开发中的核心痛点:
当下, MCP 得到了, , 微软, 以及百度, 还有阿里, 再有腾讯等主流厂商的支持, 正演变为构建下一代 AI Agent 的核心基础设施。
六、LLM通用mcp 开发
eg:以查询天气为例
from typing import Any
import httpx
from dotenv import load_dotenv
from mcp.server.fastmcp import FastMCP
import os
# 初始化 FastMCP server
mcp = FastMCP("weather")
# 加载 .env 文件中的环境变量
load_dotenv()
# 获取环境变量
OPEN_WEATHER_API_KEY = os.getenv("OPEN_WEATHER_API_KEY")
async def make_openweather_request(url: str) -> dict[str, Any] | None:
"""向 OpenWeather API 发出 GET 请求,处理错误并返回 JSON 响应。"""
async with httpx.AsyncClient() as client:
try:
response = await client.get(url, timeout=30.0)
response.raise_for_status()
return response.json()
except Exception:
return None
@mcp.tool()
async def get_weather(city: str) -> str:
"""
获取指定城市的当前天气情况。
Args:
city: 城市名称,必须是英文格式,比如 London 或 Beijing
Returns:
格式化后的天气报告字符串。
"""
base_url = "http://api.openweathermap.org/data/2.5/weather"
params = {
"q": city,
"appid": OPEN_WEATHER_API_KEY,
"units": "metric",
"lang": "zh_cn"
}
query = "&".join(f"{k}={v}" for k, v in params.items())
url = f"{base_url}?{query}"
data = await make_openweather_request(url)
print(f"data:{data}")
if not data or data.get("cod") == 404:
return "未找到该城市的天气信息。"
try:
main = data["main"]
weather = data["weather"][0]
wind = data["wind"]
# 提取天气主要信息
weather_description = weather.get("description", "无描述") #天气描述
temperature = main.get("temp") #当前温度
feels_like = main.get("feels_like") #体感温度
temp_min = main.get("temp_min") #最低温度
temp_max = main.get("temp_max") #最高温度
pressure = main.get("pressure") #气压
humidity = main.get("humidity") #湿度
sea_level = main.get("sea_level", "未知") #海平面气压
grnd_level = main.get("grnd_level", "未知") #地面气压
wind_speed = wind.get("speed") #风速
# 生成天气报告
weather_report = f"""
城市: {data.get('name', '未知')}
天气描述: {weather_description.capitalize()}
当前温度: {temperature}°C
体感温度: {feels_like}°C
最低温度: {temp_min}°C
最高温度: {temp_max}°C
气压: {pressure} hPa
湿度: {humidity}%
海平面气压: {sea_level} hPa
地面气压: {grnd_level} hPa
风速: {wind_speed} m/s
""".strip()
return weather_report
except Exception as e:
return f"处理天气数据时出错:{e}"
if __name__ == "__main__":
mcp.run(transport="stdio")
请注意, @mcp.tool(), 它是那个框架里的一个装饰器, 其作用是把函数注册为MCP(Model)工具。与之对应的方法当中, 注释是相当重要的, 因为LLM会借助该注释去理解这个工具的功能以及用法。
更多推荐


所有评论(0)