
只需5分钟,教你用Python搭建MCP Server 精华
大语言模型(LLMs)能力强大,能生成各类文本,精准回答知识疑问,还可用于机器翻译、代码编写等场景。然而,大语言模型也存在明显短板,无法获取实时数据,在面对需最新信息的问题时,难以给出准确答案。
为攻克这一难题,Anthropic 推出了模型上下文协议(Model Context Protocol,简称 MCP)。这一标准将大语言模型与实时工具、APIs 和自定义资源相连,拓展其能力,让它能处理更多实时信息任务,补齐短板。
本文教大家如何搭建 MCP 服务器,以 Claude 为例,赋予获取英超实时动态的能力。
一、赋能 Claude:获取英超实时动态
在实际应用场景中,大语言模型在体育赛事信息获取方面存在不足,尽管网络上足球比赛动态易于搜索,但大语言模型却无法提供相应内容,这给用户带来诸多不便。以 Claude 为例,当用户询问英超最新比赛结果或近期统计数据时,它的表现并不理想:
为解决这个问题,我们创建一个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个工具,当模型收到与英超足球动态相关的提示时,它可以从中选择。
- 英超联赛排名工具
- 球队赛程工具
- 球队比赛结果工具
- 联赛比赛结果工具
这些工具涵盖了涉及英超联赛动态的最常见用例。如果你有需要,可以轻松扩展服务器以添加更多工具。
现在,实际编写这些工具的代码。
在文件中添加以下几行代码来初始化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界面,可以在其中测试工具、监控服务器性能并查看任何错误消息。在将服务器部署到客户端之前,这对于调试服务器非常有用。
六、部署
现在开始部署到客户端。FastMCP已经内置了与Claude桌面应用的集成。要进行安装,在终端中运行以下命令:
fastmcp install server.py
服务器已上线。
重新启动Claude桌面应用程序,你应该会在文本框下方看到一个小工具图标。服务器上所有可用的工具都将显示在这里。
现在已经创建了MCP服务器,让Claude能够访问英超联赛的最新比赛结果和统计数据,让我们用之前的提示来测试一下,看看表现如何:
如你所见,刚刚创建的MCP服务器现在使Claude能够获取最新信息,并针对有关英超足球的提示提供准确的回复。
这个设置展示了MCP如何弥合静态知识与动态的现实世界信息之间的差距。只需几个工具和一些简单的设置,就可以大幅增强大语言模型在特定实时任务中的实用性。
本文转载自AI科技论谈,作者:AI科技论谈
