当前位置: 首页 > web >正文

MCP模型上下文协议:基于FastMCP 2.0的实践(2)

本文将用python三方包 FastMCP 2.0 实战讲解mcp

文章目录

    • 体验MCP(若已尝试可跳过)
      • 配置MCP
      • 在聊天中使用
    • 开发MCP服务器以及客户端
      • 安装环境
      • 开发tools
      • 定义服务端
      • 定义客户端

推荐您阅读本系列第一篇,MCP原理,不要错过: MCP与通讯模式:理论与实战体验(1)

体验MCP(若已尝试可跳过)

体验MCP只需要导入配置即可,不需要开发

配置MCP

准备配置MCP了
在这里插入图片描述

在内置广场选fetch,点击+安装,如下图
在这里插入图片描述
安装好了返回去会出现绿色电脑
在这里插入图片描述

在聊天中使用

需要选中要不然用不了工具
在这里插入图片描述

使用语句尝试

https://blog.csdn.net/ngadminq/category_12962115.html  介绍下这个博主

可以看到确实调用了工具,恭喜!
在这里插入图片描述

开发MCP服务器以及客户端

我们可以看到cherry的fetch实现了几个工具(可以理解为功能函数API接口),现在我们来实现其中一个工具:fetch_html
在这里插入图片描述
在开始实战前,让我们复习下MCP的基本术语,以便您可以顺利理解到以下实战:

  • MCP (Model Context Protocol): 模型上下文协议,是一种标准化的通信协议,使AI模型能够更容易地与外部服务和数据源交互。
  • MCP服务器: 暴露功能和数据的程序,可以被AI模型访问。
  • MCP客户端: 能够访问MCP服务器的程序,通常是大模型或其宿主环境。
  • 工具 (Tools): MCP中的可调用函数,用于执行特定任务如数据检索、信息搜索等。
  • 传输层 (Transport Layer): MCP通信方式,主要有本地STDIO和远程传输(SSE或HTTP流)。
  • FastMCP: 一个Python库,简化MCP服务器和工具的开发,让我们可以用装饰器轻松将函数转为MCP工具。

安装环境

请先安装uv
pip install uv

使用以下命令

uv init mcp-server
cd mcp-server
uv add "mcp[cli]"

初始化环境
在这里插入图片描述
安装我们后续代码需要的三方包

.venv/Scripts/activate.bat
uv add BeautifulSoup4  requests langchain-deepseek  langchain-mcp-adapters langgraph

开发tools

我们写个fetch_html函数,这里简化功能直接对网页的html提取所有文本,这段代码是测试功能的(您可以不尝试,后面会集成到正式代码)

import requests
from bs4 import BeautifulSoupdef fetch_html(url,headers= {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}):"""抓取指定 URL 的 HTML 文本内容参数:url (str): 要抓取的网页 URL返回:dict: 包含状态码、HTML 文本和提取的纯文本"""try:# 发送 HTTP 请求response = requests.get(url, headers=headers, timeout=10)# 检查状态码response.raise_for_status()# 获取 HTML 内容html_content = response.text# 使用 BeautifulSoup 解析 HTMLsoup = BeautifulSoup(html_content, 'html.parser')# 提取纯文本 (去除 HTML 标签)text_content = soup.get_text(separator='\n', strip=True)return text_contentexcept requests.exceptions.RequestException as e:return '抓取失败'# 使用示例
if __name__ == "__main__":url = "https://blog.csdn.net/ngadminq/category_12962115.html"result = fetch_html(url)print(result)

可以看到都是爬取我的博客相关信息
在这里插入图片描述

定义服务端

现在我们定义一个server.py代码,使用了fastmcp对我们的函数进行包装,即一个MCP服务。

from mcp.server.fastmcp import FastMCP
import requests
from bs4 import BeautifulSoupmcp = FastMCP("MCPserver")@mcp.tool()
def fetch_html(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}):"""抓取指定 URL 的 HTML 文本内容参数:url (str): 要抓取的网页 URL返回:dict: 包含状态码、HTML 文本和提取的纯文本"""try:# 发送 HTTP 请求response = requests.get(url, headers=headers, timeout=10)# 检查状态码response.raise_for_status()# 获取 HTML 内容html_content = response.text# 使用 BeautifulSoup 解析 HTMLsoup = BeautifulSoup(html_content, 'html.parser')# 提取纯文本 (去除 HTML 标签)text_content = soup.get_text(separator='\n', strip=True)return text_contentexcept requests.exceptions.RequestException as e:return '抓取失败'if __name__ == '__main__':mcp.run(transport='stdio')

定义客户端

这里我们设置了两个问题,第一个问题与AI闲聊,我们预期的是它不会调用工具。第二个问题我们期望它调用工具

import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from langchain_mcp_adapters.tools import load_mcp_tools
from langgraph.prebuilt import create_react_agent
from langchain.chat_models import init_chat_modelapi_key = "X"
api_base = "https://api.deepseek.com/"model = init_chat_model(model="deepseek-chat",api_key=api_key,api_base=api_base,temperature=0,model_provider="deepseek",
)server_params = StdioServerParameters(command="python",args=["server.py"],
)async def run_agent(messages):async with stdio_client(server_params) as (read, write):async with ClientSession(read, write) as session:# 初始化连接await session.initialize()# 通信tools = await load_mcp_tools(session)# 生成对话agent = create_react_agent(model, tools)agent_response = await agent.ainvoke({"messages": messages})return agent_responseif __name__ == "__main__":result = asyncio.run(run_agent("你是谁"))print(result)result = asyncio.run(run_agent("https://blog.csdn.net/ngadminq/category_12962115.html 介绍一下这个博主"))print(result)

这是问题1,你是谁,不调用工具,符合期望√
在这里插入图片描述
问题2,访问链接介绍博主,调用工具,符合期望√
在这里插入图片描述
这是AI的回答,可以看到是工具调用后作为上下文的
在这里插入图片描述

http://www.xdnf.cn/news/7755.html

相关文章:

  • 机器学习第十九讲:交叉验证 → 用五次模拟考试验证真实水平
  • Linux基础IO(二)
  • upload-labs通关笔记-第14关 文件上传之文件头绕过(图片马)
  • 建筑墙壁红外热成像裂缝潮湿检测数据集VOC+YOLO格式306张2类别
  • 【项目】—高并发内存池
  • AUTOSAR图解==>AUTOSAR_SRS_SAEJ1939
  • day16-17-磁盘管理
  • 流程控制-循环
  • Robot Studio开发入门指南
  • 频分复用信号在信道中的状态
  • 第11天-Python GUI开发实战:Tkinter从入门到项目实践
  • 鸿蒙开发进阶:深入解析ArkTS语言特性与高性能编程实践
  • 【设计模式】基于 Java 语言实现工厂模式
  • 第二届帕鲁杯时间折叠(TimeFold Paradox)
  • 绝缘栅双极型晶体管IGBT的结构与特点
  • 【Git】常用命令大全
  • Git的windows开发与linux开发配置
  • Dify快速上手 MCP,接入高德地图 Server 实战攻略
  • 香港科技大学物理学理学(科学计算与先进材料物理与技术)硕士招生宣讲会——深圳大学
  • 制作一款打飞机游戏52:子弹模式
  • C++显式声明explicit
  • 1G(第一代移动通信系统)详解
  • python 提交 命令到远程windows服务器并获取作业进程id
  • ABAP - SAP与企业微信集成-推送文件到企业微信
  • DeepSeek提示工程Prompt Engineering
  • multipart/* 响应是否必须使用 chunked 编码?
  • 常用UI自动化测试框架
  • 【Python训练营打卡】day31 @浙大疏锦行
  • 本征半导体与杂质半导体
  • Ubuntu操作系统里面安装Docker Compose