模型上下文协议(MCP): 带有动手实践的简明教程

模型上下文协议(MCP): 带有动手实践的简明教程

什么是 MCP? 如何创建一个 MPC 服务器, 通过 Claude 桌面从网站上获取新闻?

AI世界在不断发展, 我们几乎每天都能听到最新的新闻. 我们现在需要学习的是 MCP(模型上下文协议). 在了解它是什么及其用途之前, 我们先来看看协议的含义.

什么是协议(Protocol)?

在计算机世界中, 协议是决定两个系统如何相互通信的一系列规则. 协议规范计算机网络、互联网通信和软件系统之间的数据传输.

例如

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

现在, 我们可以继续了解 MCP 及其功能.

什么是MCP?

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

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

为什么使用 MCP?

MCP 的功能与 API 相似, 但具有更广泛的使用潜力. 传统的API需要为每个集成单独实施, 而使用 MCP 的单个集成可访问许多不同的数据源和工具.

换句话说, AI模型不仅可以接收数据, 还可以触发某些操作.

MCP 的架构

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

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

连接生命周期

  1. 初始化

modelcontextprotocol.io/docs/concep...

  • 客户端向服务器发送初始化请求, 其中包含自己的协议版本和功能.
  • 服务器以自己的协议版本和功能做出响应.
  • 客户端发送初始化通知.
  • 连接建立, 信息交换开始.
  1. 信息交换
  • 连接建立后, 客户端和服务器之间可以发送请求和响应信息, 也可以传输单向信息.
  1. 终止
  • 客户端或服务器可终止连接.

MCP 的主要功能

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

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

动手实践

在这个项目中, 我们将创建一个从网站上获取最新消息的结构.

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

ruby 复制代码
curl -LsSf https://astral.sh/uv/install.sh | sh

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

完成上述操作后, 别忘了重启终端.

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

  • 第一条命令是在当前目录下创建一个项目文件.
  • 第二条命令允许你进入该文件目录.
vbscript 复制代码
uv init mcp-server-project
cd mcp-server-project 

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

bash 复制代码
# 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文件.

python 复制代码
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() 装饰器来指定这是一个工具. 在这个函数中加入 docstring 对模型理解工具的工作原理非常重要.
  8. 我们的 MCP 服务器通过mcp.run(transport="stdio")运行, 但我们不会通过 vscode 运行服务器.

Claude桌面可以直接运行我们准备好的 MCP 服务器, 因此我们将使用Claude桌面. 你可以从这里下载: claude.ai/download.

然后打开设置, 进入开发者设置. 点击Edit Config.

当我们点击Edit Config 时, 它会为我们打开一个文件夹. 在这个文件夹中, 我们用文本编辑器打开claude_desktop_config.json文件. 我们将在这里输入服务器信息.

该文件包含 claude 将如何运行我们的服务器. 有几点需要注意:

  1. mcp-server-project 是我们创建的项目文件的名称. 如果创建的文件名不同, 可以更改.
  2. 你应在命令部分添加 uv 软件包管理器所在的路径. 在这一部分, 文件中只写了uv, 但对我来说并不是这样, 所以我给出了路径. 你可以在终端运行which uv命令来查找路径.
  3. 你也可以将 args 中的路径改为自己的项目路径. 为此, 你可以在终端中的该目录下运行pwd命令, 获取完整路径.
  4. 保存并关闭文件.
json 复制代码
{
    "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桌面后, 如果出现问题, 右上方会弹出错误提示. 你需要点击并检查日志文件, 然后解决错误. 如果没有收到错误信息, 就应该看到红色方框中的锤子.

点击锤子后, 会显示可用的 MCP 工具, 如下图所示.

我们来到测试部分, 我问了一个问题 "Elon Musk的最新消息是什么?" 屏幕上显示, 它要求我允许使用该工具. 在这里, Claude明白他需要使用工具.

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

恭喜你, 你已经使用 Python 建立了一个简单的 MCP 服务器. 我使用了一个简单的场景来学习它是如何工作的, 并向你展示. 当然, 这些都可以扩展.

好吧, 今天的内容就分享到这里啦!

一家之言, 欢迎拍砖!

Happy Coding! Stay GOLDEN!

相关推荐
五更琉璃07 小时前
十分钟完全理解MCP
mcp
围巾哥萧尘7 小时前
「MCP系列」轻松上手:三步快速完成 MCP 运行环境搭建指南🧣
mcp
AI大模型15 小时前
COZE实战部署(一)—— 扣子任务空间调配和实现
agent·coze·mcp
堆栈future20 小时前
揭秘 Google A2A 协议:赋能智能体协作的未来
llm·agent·mcp
小雷FansUnion3 天前
深入理解MCP架构:智能服务编排、上下文管理与动态路由实战
人工智能·架构·大模型·mcp
CoderLiu3 天前
用这个MCP,只给大模型一个figma链接就能直接导出图片,还能自动压缩上传?
前端·llm·mcp
吴佳浩3 天前
Python入门指南-AI番外-MCP完整教程:从零开始学会Model Context Protocol
人工智能·python·mcp
聚客AI3 天前
🚀拒绝试错成本!企业接入MCP协议的避坑清单
人工智能·掘金·日新计划·mcp
ZNineSun3 天前
MCP+Cursor入门
ai·cursor·mcp
大模型真好玩3 天前
准确率飙升!Graph RAG如何利用知识图谱提升RAG答案质量(四)——微软GraphRAG代码实战
人工智能·python·mcp