模型上下文协议 ( MCP):Python 端到端教程及动手项目

人工智能的世界日新月异,我们几乎每天都会醒来听到新的消息。现在我们需要学习的是MCP(模型上下文协议)。在了解它的含义和用途之前,我们先来了解一下这个协议的含义。

什么是协议?

在计算机世界中,协议是一组用于确定两个系统如何相互通信的规则。协议规范了计算机网络、互联网通信以及软件系统之间的数据传输。

例如:

  • HTTP(超文本传输协议):允许网站与浏览器通信。
  • TCP/IP(传输控制协议/互联网协议):定义互联网上的数据包如何路由。
  • JSON-RPC(远程过程调用):允许以 JSON 格式交换数据的协议。

现在我们可以讨论 MCP 及其功能。

什么是模型上下文协议(MCP)?

模型上下文协议 (MCP) 是一种开放协议,它使大型语言模型 (LLM) 能够以标准化方式与外部数据源和工具集成。该协议由 Anthropic 开发,使 AI 模型能够轻松地与各种工具和数据源无缝协作。

MCP 可以类比为 USB-C 端口,后者已成为设备连接的全球标准。正如 USB-C 为不同设备提供了一个通用的连接点,MCP 也使 AI 系统能够以标准方式与数据和工具进行通信。

为什么要使用 MCP?

MCP 的功能与 API 类似,但应用范围更广。传统 API 需要为每个集成单独实现,而 MCP 的单一集成即可访问众多不同的数据源和工具。

MCP 还提供双向沟通。换句话说,AI模型不仅可以接收数据,还可以触发某些动作。

MCP的架构

MCP 基于简单的客户端-服务器架构。一个应用程序可以同时连接多个 MCP 服务器。该架构由以下组件组成:

  • MCP 主机:应用程序充当 MCP 主机来访问数据或工具。
  • MCP 客户端:主机内的客户端与 MCP 服务器建立一对一连接。
  • MCP 服务器:轻量级,通过 MCP 提供特定功能,并可连接本地或远程数据源。
  • 本地数据源: MCP 服务器可以访问的数据,例如文件和数据库。
  • 远程服务: MCP 服务器可以访问的基于互联网的外部 API。

连接生命周期

  1. 初始化
  • 客户端向服务器发送初始化请求,其中包含其自己的协议版本和功能。
  • 服务器以其自己的协议版本和功能进行响应。
  • 客户端发送初始化通知。
  • 连接已建立并且消息交换开始。

2. 消息交换

  • 一旦建立连接,客户端和服务器之间就可以发送请求和响应消息,也可以传输单向消息。

3. 终止

  • 客户端或服务器可以终止连接。

MCP 的主要功能

MCP 使用 JSON-RPC 2.0 消息格式在客户端和服务器之间进行通信。该协议的一些突出特点如下:

  • 资源:呈现给用户或 AI 模型的数据和内容。
  • 提示:为用户准备的预定义消息和工作流程。
  • 工具:AI模型可以运行的功能。

实践项目

在这个项目中,我们将创建一个从网站带来最新消息的结构。

在文档中,他们建议使用uv 包管理器而不是pip。因此,你可以打开终端,使用下面的第一个命令将其下载到 MacOs 和 Linux 系统。你可以使用第二个命令将其下载到 Windows 系统。

curl -LsSf https://astral.sh/uv/install.sh | sh 

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

完成此操作后,请不要忘记重新启动终端。

然后,我们将为项目创建一个目录。为此,请在要创建项目的目录中打开终端并运行以下命令。

  • 第一个命令在您所在的目录中创建一个项目文件。
  • 第二条命令允许你进入这个文件目录。
uv init mcp-server-project 

cd mcp-server-project

然后我们将创建一个虚拟环境并安装我们的软件包。为此,我们使用 uv 包管理器。

# cretae virtual env
uv venv

# activate for macos/linux
source .venv/bin/activate

# activate for windows
.venv\Scripts\activate

# install libraries 
uv add "mcp[cli]" httpx bs4 dotenv

现在我们需要在 vscode 中打开我们创建的文件夹,打开之后我们在左侧看到我们的文件结构已经准备好了。

在这里我们将更新main.py文件。

from mcp.server.fastmcp import FastMCP
from dotenv import load_dotenv
import httpx
import os
from bs4 import BeautifulSoup
import json

load_dotenv()

# initialize server
mcp = FastMCP("tech_news")

USER_AGENT = "news-app/1.0"

NEWS_SITES = {
    "arstechnica": "https://arstechnica.com"
}

async def fetch_news(url: str):
    """It pulls and summarizes the latest news from the specified news site."""
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, timeout=30.0)
            soup = BeautifulSoup(response.text, "html.parser")
            paragraphs = soup.find_all("p")
            text = " ".join([p.get_text() for p in paragraphs[:5]]) 
            return text
        except httpx.TimeoutException:
            return "Timeout error"

@mcp.tool()  
async def get_tech_news(source: str):
    """
    Fetches the latest news from a specific tech news source.

    Args:
    source: Name of the news source (for example, "arstechnica" or "techcrunch").

    Returns:
    A brief summary of the latest news.
    """
    if source not in NEWS_SITES:
        raise ValueError(f"Source {source} is not supported.")

    news_text = await fetch_news(NEWS_SITES[source])
    return news_text

if __name__ == "__main__":
    mcp.run(transport="stdio")

上述代码用于从指定站点检索最新新闻。具体操作步骤如下。

  1. 首先,我们进行必要的导入。
  2. 此代码中未使用任何 API,但如果您使用 API,则可以使用load_dotenv()来获取密钥。
  3. 我们使用 FastMCP 初始化我们的服务器
  4. “news-app/1.0”是我们给出的应用程序名称。
  5. NEW_SITES包含要从中检索新闻的网站。您可以根据需要在此处添加更多网站。
  6. fetch_news ()函数从指定站点检索新闻。
  7. get_tech_news()函数就是我们这里的工具。我们通过在该函数中添加@mcp .tool()装饰器来指明它是一个工具。在这个函数中添加文档字符串对于模型理解该工具的工作原理至关重要。
  8. 我们的 MCP 服务器使用mcp.run(transport=”stdio”)运行。但我们不会通过 vscode 运行该服务器。

Claude Desktop 可以直接运行我们准备好的 MCP Server,所以我们将使用 Claude Desktop。您可以从这里下载:
https://claude.ai/download。

然后我们打开设置并进入开发者设置。在这里我们点击编辑配置。

当我们点击编辑 配置,它会为我们打开一个文件夹。从这个文件夹中,我们可以播放
claude_desktop_config.json
使用文本编辑器创建一个文件。我们将在这里输入服务器信息。

此文件包含 Claude 将如何运行我们的服务器。有几点需要注意:

  1. mcp-server-project是我们创建的项目文件的名称。如果您创建时使用了其他名称,可以更改此名称。
  2. 您应该将 uv 包管理器所在的路径添加到命令部分。文档中只写了“uv” ,但我无法通过这种方式运行,所以我直接给出了路径。您可以在终端中运行“which uv”命令来查找路径。
  3. 您也可以将 args 中的路径更改为您自己的项目路径。为此,您可以在终端中的此目录中运行“pwd”命令并获取完整路径。
  4. 您可以保存并关闭该文件。
{
    "mcpServers": {
        "mcp-server-project": {
            "command": "/Users/busekoseoglu/.local/bin/uv",
            "args": [
                "--directory",
                "/Users/busekoseoglu/Desktop/PROJELER/LLM Portfolio/mcp-server-project",
                "run",
                "main.py"
            ]
        }
    }
}

我们已经完成了服务器配置,现在可以在 Claude 桌面版上尝试一下了。打开 Claude 桌面版时,如果出现问题,您会在右上角看到错误弹窗。您需要点击并检查日志文件,然后解决错误。如果没有收到错误信息,您应该会在红色方块中看到锤子图标。

当您单击 Hammer 时,它会显示如下所示的可用 MCP 工具。

我们来到测试区,我问了个问题:“Ars Technica 有什么最新消息?”屏幕上,它请求我允许使用该工具。这时 Claude 明白了,他需要使用一个工具。

在获得许可后,它使用我的工具检索答案并将最新消息返回给我。

恭喜,您已经使用 Python 搭建了一个简单的 MCP 服务器。我设计了一个简单的场景,以便您了解它的工作原理并进行演示。当然,这些场景可以扩展。

原文链接:,转发请注明来源!