只需5分钟,教你用Python搭建MCP Server 精华

发布于 2025-4-10 06:36
浏览
0收藏

大语言模型(LLMs)能力强大,能生成各类文本,精准回答知识疑问,还可用于机器翻译、代码编写等场景。然而,大语言模型也存在明显短板,无法获取实时数据,在面对需最新信息的问题时,难以给出准确答案。

为攻克这一难题,Anthropic 推出了模型上下文协议(Model Context Protocol,简称 MCP)。这一标准将大语言模型与实时工具、APIs 和自定义资源相连,拓展其能力,让它能处理更多实时信息任务,补齐短板。

本文教大家如何搭建 MCP 服务器,以 Claude 为例,赋予获取英超实时动态的能力。

一、赋能 Claude:获取英超实时动态 

在实际应用场景中,大语言模型在体育赛事信息获取方面存在不足,尽管网络上足球比赛动态易于搜索,但大语言模型却无法提供相应内容,这给用户带来诸多不便。以 Claude 为例,当用户询问英超最新比赛结果或近期统计数据时,它的表现并不理想:

只需5分钟,教你用Python搭建MCP Server-AI.x社区

为解决这个问题,我们创建一个MCP服务器,为大语言模型提供合适回复这些提示所需的信息。

二、设置 

需要先安装几个Python软件包,才能让MCP服务器启动并运行。

创建一个全新的虚拟环境来进行安装:

python -m venv venv

激活该环境:

source venv/bin/activate

从这里安装UV软件包,用来部署服务器并安装FastMCP。

FastMCP是非常实用的Python软件包,能够简化构建和部署MCP服务器的过程。它承担了大部分繁重的工作,并且具备直观(而且很Python风格!)的接口。

uv pip install fastmcp

最后,创建一个新的Python文件来编写服务器代码。将其命名为​​server.py​​。

touch server.py

三、数据源 

使用来自​​football-data.org​​​的足球数据。需要在这个平台上获取API密钥,并将API密钥存储在​​.env​​文件中。

要创建的工具和资源将基于其API的结构。

在文件中添加以下几行代码。

from dotenv import load_dotenv
load_dotenv()

# API配置
BASE_URL = "https://api.football-data.org/v4"
HEADERS = {
    'X-Auth-Token': os.getenv('FOOTBALL_API_KEY')
}

四、MCP服务器 

MCP服务器为模型提供三种主要的功能:工具(Tools)、资源(Resources)和提示(Prompts)。

资源和工具非常相似,都能让大语言模型根据用户输入采取某种形式的行动。

二者的主要区别在于启动方式。资源由应用程序控制,而工具由模型控制。这意味着大语言模型本身可以查看可用工具列表,并决定在特定场景中使用什么工具来完成给定的请求。另一方面,资源既可以由用户手动选择,也可以由大语言模型自动选择,具体取决于客户端应用程序。

提示本质上是可重复使用的模板,你可以在服务器上针对工具、资源等常见用例进行预编程。

本文只使用工具,因为我们希望模型根据用户提示来决定使用什么工具。

创建4个工具,当模型收到与英超足球动态相关的提示时,它可以从中选择。

  1. 英超联赛排名工具
  2. 球队赛程工具
  3. 球队比赛结果工具
  4. 联赛比赛结果工具

这些工具涵盖了涉及英超联赛动态的最常见用例。如果你有需要,可以轻松扩展服务器以添加更多工具。

现在,实际编写这些工具的代码。

在文件中添加以下几行代码来初始化FastMCP。

from fastmcp import FastMCP

mcp = FastMCP("Premier League Updates", dependencies=["requests", "python-dotenv"])

注意,在初始化时添加了一些依赖项。这能让FastMCP知道服务器有哪些依赖项,并在启动服务器时自动加载。

在FastMCP中创建工具的语法非常简单,基本上就是用​​tool()​​装饰器注解的Python函数。

为简单起见,以下函数进行了截取。

我们为英超联赛排名工具创建一个函数。这个函数将获取最新的英超联赛排名,并返回包含球队及其统计数据的JSON格式数据。

@mcp.tool()
def get_premier_league_table():
    """
    获取当前英超联赛排名
    :return: 包含当前英超联赛排名的JSON响应
    """

    url = f"{BASE_URL}/competitions/PL/standings"
    response = requests.get(url, headers=HEADERS)
    data = response.json()
    
   ...

    return {'standings': standings}

我们再创建三个工具,分别用于获取球队即将到来的赛程、之前的比赛结果以及联赛的最新比赛结果。

@mcp.tool()
def get_team_fixtures(team_id: str) -> dict:
    """
    获取特定球队即将到来的赛程
    :param team_id: 球队的ID
    :return: 包含球队接下来5场赛程的JSON响应
    """
    url = f"{BASE_URL}/teams/{team_id}/matches"
    params = {
       'status': 'SCHEDULED',
        'limit': 5
    }
    response = requests.get(url, headers=HEADERS, params=params)
    data = response.json()
    
   ...
    
    return {'fixtures': cleaned_fixtures}

@mcp.tool()
def get_team_results(team_id: str) -> dict:
    """
    获取特定球队近期的比赛
    :param team_id: 球队的ID
    :return: 包含球队最近5场比赛的JSON响应
    """
    url = f"{BASE_URL}/teams/{team_id}/matches"
    params = {
       'status': 'FINISHED',
        'limit': 5
    }
    response = requests.get(url, headers=HEADERS, params=params)
    data = response.json()
    
   ...
    
    return {'results': cleaned_results}

@mcp.tool()
def get_latest_league_results() -> dict:
    """
    获取英超联赛的最新比赛结果
    :return: 包含英超联赛最近比赛的JSON响应
    """
    url = f"{BASE_URL}/competitions/PL/matches"
    params = {
       'status': 'FINISHED',
        'limit': 10, 
        'competitions': 'PL'
    }
    response = requests.get(url, headers=HEADERS, params=params)
    data = response.json()
    
   ...
    
    return {'latest_results': cleaned_results}

这样就设置好了所有主要工具。

注意,​​get_team_results​​​和​​get_team_fixtures​​​函数需要一个​​team_id​​​参数。我们不硬编码​​team_id​​​的选择,而是可以创建一个额外的工具,为模型提供它需要传递给这些函数的​​team_id​​。

@mcp.tool()
def get_team_ids():
    """
    返回一个包含球队名称及其对应ID的字典
    """
    return {
        'arsenal': 57,
        'aston villa': 58,
        'bournemouth': 1044,
        'brentford': 402,
        'brighton': 397,
        'chelsea': 61,
        'crystal palace': 354,
        'everton': 62,
        'fulham': 63,
        'liverpool': 64,
       'manchester city': 65,
       'manchester united': 66,
        'newcastle': 67,
        'nottingham forest': 351,
        'tottenham': 73,
        'west ham': 563,
        'wolves': 76,
       'southampton': 340,
        'ipswich town': 349,
        'leicester city': 338
    }

这使我们可以将解析用户请求中的球队名称的工作交给模型。由于大语言模型非常擅长理解自然语言,无论用户输入的球队名称拼写如何,模型都能识别出用户提到的球队。例如,“Manchester United”、“Man United”、“Man U”、“Man Utd”甚至“the Red Devils”,模型都应该选择ID为66的球队。在这种情况下,这特别有用,因为体育团队通常会用昵称来称呼。

五、测试 

在部署服务器之前,可以在开发模式下测试服务器,以确保所有工具都按预期工作。为此,在终端中输入以下命令:

fastmcp dev server.py

这会启动一个Web界面,可以在其中测试工具、监控服务器性能并查看任何错误消息。在将服务器部署到客户端之前,这对于调试服务器非常有用。

只需5分钟,教你用Python搭建MCP Server-AI.x社区

六、部署 

现在开始部署到客户端。FastMCP已经内置了与Claude桌面应用的集成。要进行安装,在终端中运行以下命令:

fastmcp install server.py

服务器已上线。

重新启动Claude桌面应用程序,你应该会在文本框下方看到一个小工具图标。服务器上所有可用的工具都将显示在这里。

只需5分钟,教你用Python搭建MCP Server-AI.x社区

现在已经创建了MCP服务器,让Claude能够访问英超联赛的最新比赛结果和统计数据,让我们用之前的提示来测试一下,看看表现如何:

只需5分钟,教你用Python搭建MCP Server-AI.x社区

只需5分钟,教你用Python搭建MCP Server-AI.x社区

如你所见,刚刚创建的MCP服务器现在使Claude能够获取最新信息,并针对有关英超足球的提示提供准确的回复。

这个设置展示了MCP如何弥合静态知识与动态的现实世界信息之间的差距。只需几个工具和一些简单的设置,就可以大幅增强大语言模型在特定实时任务中的实用性。

本文转载自​​AI科技论谈​​,作者:AI科技论谈

1
收藏
回复
举报
回复
相关推荐