手把手教你用MCP和Python完成一个小项目

解锁 MCP:AI 与外部世界的高效连接之道。

 微信搜索关注《AI科技论谈》 

人工智能的世界在持续发展,几乎每天我们醒来都会看到新的消息。今天我们带大家了解的是MCP(模型上下文协议,Model Context Protocol)。

一、什么是协议?

在计算机领域,协议是一组规则,它决定了两个系统如何相互通信。协议规范着计算机网络中的数据传输、互联网通信,以及软件系统之间的交互。

例如:

  • HTTP(超文本传输协议,Hypertext Transfer Protocol):用于实现网站与浏览器之间的通信。

  • TCP/IP(传输控制协议/网际协议,Transmission Control Protocol/Internet Protocol):定义了互联网上数据包的路由方式。

  • JSON - RPC(远程过程调用,Remote Procedure Call):一种允许以JSON格式进行数据交换的协议。

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

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

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

三、为什么要使用MCP?

MCP的功能与API(应用程序编程接口)类似,但它的应用潜力更为广泛。传统的API在每次集成时都需要单独进行实现,而通过一次MCP集成就能访问多种不同的数据源和工具。

MCP还支持双向通信。也就是说,人工智能模型不仅能够接收数据,还可以触发特定的操作。

四、MCP的架构

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

  • MCP主机:作为MCP主机的应用程序用于访问数据或工具。

  • MCP客户端:主机内的客户端与MCP服务器建立一对一的连接。

  • MCP服务器:轻量级的服务器,通过MCP提供特定功能,并且可以连接本地或远程数据源。

  • 本地数据源:MCP服务器能够访问的数据,例如文件和数据库。

  • 远程服务:MCP服务器可以访问的基于外部互联网的API。

五、连接生命周期

  1. 初始化

  • 客户端向服务器发送初始化请求,请求中包含自身的协议版本和功能信息。

  • 服务器响应,返回自身的协议版本和功能信息。

  • 客户端发送初始化完成通知。

  • 连接建立,开始消息交换。

  1. 消息交换:连接建立后,客户端和服务器之间可以相互发送请求和响应消息,也可以传输单向消息。

  2. 终止:客户端或服务器都可以终止连接。

六、MCP的核心特性

MCP使用JSON - RPC 2.0消息格式在客户端和服务器之间进行通信。该协议的一些主要特性包括:

  • 资源:提供给用户或人工智能模型的数据和内容。

  • 提示:为用户预先定义的消息和工作流程。

  • 工具:人工智能模型可以运行的功能。

七、实践项目

在这个项目中,我们将构建一个从网站获取最新新闻的架构。

文档中建议使用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包管理器。

# 创建虚拟环境
uv venv
# 在MacOs/Linux系统中激活虚拟环境
source.venv/bin/activate
# 在Windows系统中激活虚拟环境
.venv\Scripts\activate
# 安装库
uv add "mcp[cli]" httpx bs4 dotenv

现在,我们需要在VS Code中打开创建的文件夹。打开后,我们会看到左侧的文件结构已准备就绪。

接下来,我们要更新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()
# 初始化服务器
mcp = FastMCP("tech_news")

USER_AGENT = "news-app/1.0"

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

async def fetch_news(url: str):
    """从指定的新闻网站抓取并总结最新新闻。"""
    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):
    """
    从特定的科技新闻源获取最新新闻。

    参数:
    source:新闻源名称(例如,"arstechnica"或"techcrunch")。

    返回:
    最新新闻的简要摘要。
    """
    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. NEWS_SITES包含了要从中获取新闻的网站。如果你愿意,可以在此处添加更多网站。

  6. fetch_news()函数从指定网站获取新闻。

  7. get_tech_news()函数是我们的工具。通过在函数上添加@mcp.tool()装饰器,我们将其指定为一个工具。函数中的文档字符串对于模型理解该工具的工作方式非常重要。

  8. 我们的MCP服务器通过mcp.run(transport="stdio")运行。不过,我们不会通过VS Code运行服务器。

Claude桌面应用程序可以直接运行我们准备好的MCP服务器,因此我们将使用Claude桌面应用程序。你可以从这里下载: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桌面应用程序后,如果出现问题,你可以在右上角看到错误弹窗。你需要点击并查看日志文件,以解决错误。如果没有收到错误提示,你应该会看到红色方块中的锤子图标。

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

现在进入测试环节,我询问了“Ars Technica上有什么最新新闻?”。屏幕上提示我授权使用该工具。在这里,Claude识别出需要使用工具来获取答案。

授权后,它使用我创建的工具获取答案,并将最新新闻返回给我。

恭喜,你已经使用Python搭建了一个简单的MCP服务器。我通过一个简单的场景来学习其工作原理并展示给你,当然这些应用场景还可以进一步拓展。

推荐书单

《深入浅出机器学习:从数据到AI算法》

《深入浅出机器学习:从数据到大模型》是一本旨在帮助读者系统学习机器学习的著作。本书通过深入浅出的方式,将复杂的机器学习理论和技术讲解得深入浅出。

本书从机器学习的基础开始,为读者提供了对数据处理、特征工程和模型评估等核心概念的全面介绍。读者将学习如何准备和清洗数据,如何选择和构建合适的特征,并学会使用各种评估指标来评估模型性能。

然后,本书深入探讨了常见的机器学习算法和技术。详细解释了线性回归、逻辑回归和神经网络等算法的原理和应用,通过丰富的示例和实践项目,掌握这些算法的实现和调优技巧。

本书聚焦于大规模模型和深度学习,介绍了深度学习的基本原理和常用的深度学习框架,如TensorFlow和PyTorch。读者将学习如何构建深度神经网络,如何进行模型训练和调优,并了解大规模机器学习系统的实现和部署。

5折购买链接:https://item.jd.com/14387333.html

精彩回顾

Python专业级智能体框架Pydantic AI,高效创建生产级智能体

长按访问【IT今日热榜】,发现每日技术热点

在使用IDEA中使用Lombok时,报错"java: 找不到符号 符号: 方法 getCode()"通常是由于Lombok插件未正确安装或配置导致的。以下是解决该问题的步骤: 1. 确保Lombok插件已正确安装: - 打开IDEA,点击"File"(文件)菜单,选择"Settings"(设置)。 - 在弹出的窗口中,选择"Plugins"(插件)。 - 在搜索框中输入"Lombok",确保Lombok插件已安装并启用。 2. 确保项目的依赖中包含Lombok库: - 打开项目的pom.xml文件(如果是Maven项目)或build.gradle文件(如果是Gradle项目)。 - 确保在依赖项中添加了Lombok库的引用,例如: ```xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> ``` 3. 清理并重新构建项目: - 在IDEA中,点击"Build"(构建)菜单,选择"Rebuild Project"(重新构建项目)。 - 等待项目重新构建完成。 如果以上步骤都已经尝试过,但问题仍然存在,可以尝试以下解决方法: 4. 在IDEA中启用Lombok插件的注解处理器: - 打开IDEA,点击"File"(文件)菜单,选择"Settings"(设置)。 - 在弹出的窗口中,选择"Build, Execution, Deployment"(构建、执行、部署)。 - 在左侧菜单中,选择"Compiler"(编译器)。 - 在右侧窗口中,找到"Annotation Processors"(注解处理器)部分。 - 确保"Enable annotation processing"(启用注解处理)选项已勾选。 通过以上步骤,您应该能够解决在IDEA中使用Lombok时报错"java: 找不到符号 符号: 方法 getCode()"的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值