浅析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.youkuaiyun.com/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 类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

慢热型网友.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值