浅析Model Context Protocol (MCP)协议:概念、优势与实战应用


前言

在这里插入图片描述

         在当今快速发展的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的工作流程

  1. 建立连接:客户端向服务器发起连接,创建通信链路。
  2. 发送请求:客户端构建并发送包含具体需求的消息。
  3. 解析执行:服务器接收请求,解析并执行相关操作。
  4. 返回响应:服务器将操作结果封装后反馈给客户端。
  5. 关闭连接:任务完成后,连接被关闭以结束会话。
    在这里插入图片描述

三、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
### Model Context Protocol (MCP) 和 API 的定义 #### Model Context Protocol (MCP) Model Context Protocol 是一种用于描述模型上下文交互的协议,旨在通过标准化的方式传递数据及其语义背景。它通常涉及复杂的结构化数据交换,并支持动态调整通信中的元数据和实际数据[^1]。 MCP 不仅关注数据本身,还强调数据的上下文环境以及如何解释这些数据。 #### Application Programming Interface (API) Application Programming Interface 则是一个更广泛的术语,指一组规则和工具,允许不同的软件应用程序之间相互通信。API 定义了请求和服务端响应的标准格式,使得开发者可以轻松集成不同服务的功能而不必理解其内部实现细节[^2]。 --- ### 主要区别 | 方面 | **Model Context Protocol (MCP)** | **API** | |---------------------|--------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------| | **核心目标** | 提供一种机制来传输带有上下文的数据,确保接收方能够正确理解和处理发送过来的信息. | 提供接口让外部程序访问特定功能或数据集,简化应用间互动过程[^2]. | | **复杂度** | 更加注重于数据的意义其关联关系,在某些情况下可能涉及到较为复杂的配置文件或者额外的消息头字段说明等内容. | 相对比之下更为简单明了;只需要遵循既定的方法签名即可完成调用操作[^2]. | | **适用场景** | 常见于机器学习框架、人工智能平台等领域当中,当需要精确表达训练样本特征向量所处的具体情境时尤为有用. | 几乎适用于任何类型的软硬件产品开发过程中——无论是移动客户端还是云端服务器都可以利用 RESTful APIs 来互相协作工作[^2]. | 值得注意的是,虽然两者都属于技术层面的概念范畴之内,但是它们各自侧重点完全不同:前者偏向理论研究方向探索未知可能性边界;后者则更多体现在工程实践上面解决现实世界里的具体需求问题上。 ```python # 示例代码展示了一个简单的 API 调用方式 import requests response = requests.get('https://api.example.com/data') data = response.json() print(data) # 对应到 MCP 中,则可能是如下形式(假设基于 JSON-RPC 实现) mcp_request = { "jsonrpc": "2.0", "method": "getContextData", "params": {"context_id": 123}, "id": 1 } result = requests.post('https://mcp.example.com/', json=mcp_request).json() print(result['result']) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢热型网友.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值