前言
在当今快速发展的AI技术领域,大语言模型(LLM)的应用越来越广泛。然而,如何高效地利用这些模型并将其集成到实际应用中,仍然是一个挑战。MCP(大模型上下文协议)正是为了解决这一问题而设计的。它通过定义一种标准化的通信机制,使得客户端和服务器能够高效地交互,充分利用大语言模型的强大能力。本文将详细介绍MCP协议的相关概念、优势以及实战应用。
一、什么是MCP(Model Context Protocol)
(一)MCP 的定义
MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。它类似于AI的“通用翻译器”,使AI能够安全、可控地访问文件、应用或网络服务,并执行具体任务。
(二)MCP 的优势
MCP的优势在于它提供了一种标准化的通信机制,使得AI模型能够与不同的API和数据源无缝交互。它旨在替换碎片化的Agent代码集成,从而使AI系统更可靠、更有效。通过MCP,服务商可以基于协议推出自己的AI能力,支持开发者快速构建更强大的AI应用。
(三)MCP 与Function Calling 的区别
- MCP(Model Context Protocol),模型上下文协议
- Function Calling,函数调用
上一篇文章我把Function Calling讲了一下,感兴趣可以去https://blog.csdn.net/pdsu_Zhe/article/details/146288112
Function Calling指的是AI模型根据上下文自动执行函数的机制,不同的模型有不同的Function Calling实现。而MCP是一个标准协议,它通过定义统一的通信协议和架构,使得AI系统能够无缝地与多种数据源和服务进行交互。MCP的优势在于:一是开放标准利于服务商开发API,二是避免开发者重复造轮子,可利用现有MCP服务增强Agent。主要总结为以下几个方面:
Function Call | MCP |
---|---|
✔️简单直接: 容易理解和实现 | ✔️ 更完整的功能:工具、资源和提示三位一体 |
✔️广泛支持: 几乎所有LLM都兼容 | ✔️ 标准化协议:JSON-RPC通信标准 |
✔️标准化结构 : JSON格式一致 | ✔️ 通用性:不绑定特定的AI模型 |
❌功能单一 只能调用函数 | ✔️ 双向通信:支持事件和通知 |
❌ 缺乏标准协议:每家实现不完全一致 | ✔️ 细粒度权限:明确的控制机制 |
❌只支持同步调用 : 缺乏事件机制 | ❌ 相对复杂:实现和理解成本较高 |
适用场景:简单应用、快速原型、直接与LLM API交互 | 适用场景:企业级应用、需要支持多种AI的产品、复杂交互场景 |
二、MCP的工作原理
(一)MCP的架构
MCP基于客户端-服务器模型,共分五个部分:
- MCP Hosts:运行AI模型的应用程序,如Cursor、Claude Desktop。
- MCP Clients:在Hosts内负责与服务器通信的模块。
- MCP Servers:通过标准化协议为Clients提供工具、数据和上下文。
- Local Data Sources:本地文件、数据库等直接可访问的数据。
- Remote Services:外部API或服务,如GitHub或Slack。
官方的 MCP 架构图:
(二)MCP的核心架构
MCP的核心架构包括MCP Hosts、MCP Clients和MCP Servers。MCP Servers是整个协议的灵魂,它告诉AI Agent当前有哪些可用服务和数据,AI Agent再通过函数调用执行具体任务。
(三)MCP的工作流程
- 建立连接:客户端向服务器发起连接,创建通信链路。
- 发送请求:客户端构建并发送包含具体需求的消息。
- 解析执行:服务器接收请求,解析并执行相关操作。
- 返回响应:服务器将操作结果封装后反馈给客户端。
- 关闭连接:任务完成后,连接被关闭以结束会话。
三、MCP协议的实战应用
本实战以MCP官网给出的例子进行天气查询并且结合GLM-4-Flash大模型生成答案。
官方教程:https://modelcontextprotocol.io/quickstart/server
(一)项目结构
官方教程给出的方案是用uv来管理Python程序。
uv是由Astral公司开发的一个高性能的Python包管理工具,旨在成为“Python的Cargo”。它提供了快速、可靠且易用的包管理体验,支持依赖管理、虚拟环境管理、单文件脚本运行,甚至Python本身的安装和管理。
uv是一个统一接口,可以管理Python项目、命令行工具、单文件脚本,甚至Python本身。它是一个二进制文件,支持多种方式安装而不依赖于Rust和Python环境)。
# uv安装方式:
pip install uv
### 项目结构
MCP-CLIENT/
│
├── mcp-client/ # 客户端代码目录
│ ├── .venv/ # 客户端虚拟环境,用于隔离Python依赖
│ ├── .env # 客户端环境变量文件,存储敏感信息如API密钥
│ ├── .python-version # Python版本指定文件
│ ├── client.py # 客户端主程序文件
│ ├── pyproject.toml # 客户端项目配置文件
│ ├── README.md # 客户端项目说明文件
│ └── uv.lock # 客户端依赖锁定文件
│
├── weather/ # 服务端代码目录
│ ├── .venv/ # 服务端虚拟环境,用于隔离Python依赖
│ ├── .python-version # Python版本指定文件,存储敏感信息如API密钥
│ ├── pyproject.toml # 服务端项目配置文件
│ ├── README.md # 服务端项目说明文件
│ └── uv.lock # 服务端依赖锁定文件
│ └── weather.py # 服务端主程序文件
│
└── 外部库/ # 项目依赖的第三方库(具体内容未展示)
└── 临时文件和控制台 # IDE生成的临时文件和控制台输出区域
(二)服务端 (weather.py)
1. 环境准备
# Create a new directory for our project
uv init weather
cd weather
# Create virtual environment and activate it
uv venv
.venv\Scripts\activate
# Install dependencies
uv add mcp httpx
# Create our server file
echo. > weather.py
2. 初始化 FastMCP 服务器
# 创建了一个名为 "weather" 的 FastMCP 服务器实例。
mcp = FastMCP("weather")
3. 定义常量
# 定义了用于访问天气API的基础URL和用户代理字符串。
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"
4. 定义异步函数 make_nws_request
# 这个函数用于向美国国家气象局(NWS)的API发送异步请求,并处理可能的异常。
async def make_nws_request(url: str) -> dict[str, Any] | None:
headers = {
"User-Agent": USER_AGENT, "Accept": "application/geo+json"}
async with httpx.AsyncClient() as client:
try:
response = await client.get(url, headers=headers, timeout=30.0)
response.raise_for_status()
return response.json()
except Exception:
return None
5. 定义 MCP 工具函数 get_alerts 和 get_forecast
# 使用 @mcp.tool() 装饰器定义了两个MCP工具函数,get_alerts 和 get_forecast
# 它们分别用于获取特定州的天气警报和给定位置的天气预报。
@mcp.tool()
async def get_alerts(state: str) -> str:
...
@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:
...
(三)客户端 (client.py)
1. 环境准备
# Create project directory
uv init mcp-client
cd mcp-client
# Create virtual environment
uv venv
# Activate virtual environment
# On Windows:
.venv\Scripts\activate
# Install required packages
uv add mcp openai python-dotenv
# Create our main file
echo. > client.py
2. .env文件设置
3. 加载环境变量
# 从.env文件加载环境变量,这些变量用于配置OpenAI API的密钥和基础URL。
load_dotenv() # load environment variables from .env
api_key = os.environ["OPENAI_API_KEY"]
base_url = os.environ["OPENAI_API_BASE"]
4. 定义 MCPClient 类
# 定义了一个MCPClient类,它初始化会话和客户端对象,并创建一个OpenAI实例。
class MCPClient