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

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


推荐您阅读本系列第一篇,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 BeautifulSoup


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 解析 HTML
        soup = BeautifulSoup(html_content, 'html.parser')

        # 提取纯文本 (去除 HTML 标签)
        text_content = soup.get_text(separator='\n', strip=True)

        return text_content

    except 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 BeautifulSoup

mcp = 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 解析 HTML
        soup = BeautifulSoup(html_content, 'html.parser')

        # 提取纯文本 (去除 HTML 标签)
        text_content = soup.get_text(separator='\n', strip=True)
        return text_content

    except 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_model

api_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_response


if __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的回答,可以看到是工具调用后作为上下文的
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

非常大模型

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

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

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

打赏作者

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

抵扣说明:

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

余额充值