只需5分鐘,教你用Python搭建MCP Server 精華
大語言模型(LLMs)能力強(qiáng)大,能生成各類文本,精準(zhǔn)回答知識疑問,還可用于機(jī)器翻譯、代碼編寫等場景。然而,大語言模型也存在明顯短板,無法獲取實(shí)時數(shù)據(jù),在面對需最新信息的問題時,難以給出準(zhǔn)確答案。
為攻克這一難題,Anthropic 推出了模型上下文協(xié)議(Model Context Protocol,簡稱 MCP)。這一標(biāo)準(zhǔn)將大語言模型與實(shí)時工具、APIs 和自定義資源相連,拓展其能力,讓它能處理更多實(shí)時信息任務(wù),補(bǔ)齊短板。
本文教大家如何搭建 MCP 服務(wù)器,以 Claude 為例,賦予獲取英超實(shí)時動態(tài)的能力。
一、賦能 Claude:獲取英超實(shí)時動態(tài)
在實(shí)際應(yīng)用場景中,大語言模型在體育賽事信息獲取方面存在不足,盡管網(wǎng)絡(luò)上足球比賽動態(tài)易于搜索,但大語言模型卻無法提供相應(yīng)內(nèi)容,這給用戶帶來諸多不便。以 Claude 為例,當(dāng)用戶詢問英超最新比賽結(jié)果或近期統(tǒng)計數(shù)據(jù)時,它的表現(xiàn)并不理想:
為解決這個問題,我們創(chuàng)建一個MCP服務(wù)器,為大語言模型提供合適回復(fù)這些提示所需的信息。
二、設(shè)置
需要先安裝幾個Python軟件包,才能讓MCP服務(wù)器啟動并運(yùn)行。
創(chuàng)建一個全新的虛擬環(huán)境來進(jìn)行安裝:
python -m venv venv
激活該環(huán)境:
source venv/bin/activate
從這里安裝UV軟件包,用來部署服務(wù)器并安裝FastMCP。
FastMCP是非常實(shí)用的Python軟件包,能夠簡化構(gòu)建和部署MCP服務(wù)器的過程。它承擔(dān)了大部分繁重的工作,并且具備直觀(而且很Python風(fēng)格?。┑慕涌凇?/p>
uv pip install fastmcp
最后,創(chuàng)建一個新的Python文件來編寫服務(wù)器代碼。將其命名為??server.py?
?。
touch server.py
三、數(shù)據(jù)源
使用來自??football-data.org?
??的足球數(shù)據(jù)。需要在這個平臺上獲取API密鑰,并將API密鑰存儲在??.env?
?文件中。
要創(chuàng)建的工具和資源將基于其API的結(jié)構(gòu)。
在文件中添加以下幾行代碼。
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服務(wù)器
MCP服務(wù)器為模型提供三種主要的功能:工具(Tools)、資源(Resources)和提示(Prompts)。
資源和工具非常相似,都能讓大語言模型根據(jù)用戶輸入采取某種形式的行動。
二者的主要區(qū)別在于啟動方式。資源由應(yīng)用程序控制,而工具由模型控制。這意味著大語言模型本身可以查看可用工具列表,并決定在特定場景中使用什么工具來完成給定的請求。另一方面,資源既可以由用戶手動選擇,也可以由大語言模型自動選擇,具體取決于客戶端應(yīng)用程序。
提示本質(zhì)上是可重復(fù)使用的模板,你可以在服務(wù)器上針對工具、資源等常見用例進(jìn)行預(yù)編程。
本文只使用工具,因為我們希望模型根據(jù)用戶提示來決定使用什么工具。
創(chuàng)建4個工具,當(dāng)模型收到與英超足球動態(tài)相關(guān)的提示時,它可以從中選擇。
- 英超聯(lián)賽排名工具
- 球隊賽程工具
- 球隊比賽結(jié)果工具
- 聯(lián)賽比賽結(jié)果工具
這些工具涵蓋了涉及英超聯(lián)賽動態(tài)的最常見用例。如果你有需要,可以輕松擴(kuò)展服務(wù)器以添加更多工具。
現(xiàn)在,實(shí)際編寫這些工具的代碼。
在文件中添加以下幾行代碼來初始化FastMCP。
from fastmcp import FastMCP
mcp = FastMCP("Premier League Updates", dependencies=["requests", "python-dotenv"])
注意,在初始化時添加了一些依賴項。這能讓FastMCP知道服務(wù)器有哪些依賴項,并在啟動服務(wù)器時自動加載。
在FastMCP中創(chuàng)建工具的語法非常簡單,基本上就是用??tool()?
?裝飾器注解的Python函數(shù)。
為簡單起見,以下函數(shù)進(jìn)行了截取。
我們?yōu)橛⒊?lián)賽排名工具創(chuàng)建一個函數(shù)。這個函數(shù)將獲取最新的英超聯(lián)賽排名,并返回包含球隊及其統(tǒng)計數(shù)據(jù)的JSON格式數(shù)據(jù)。
@mcp.tool()
def get_premier_league_table():
"""
獲取當(dāng)前英超聯(lián)賽排名
:return: 包含當(dāng)前英超聯(lián)賽排名的JSON響應(yīng)
"""
url = f"{BASE_URL}/competitions/PL/standings"
response = requests.get(url, headers=HEADERS)
data = response.json()
...
return {'standings': standings}
我們再創(chuàng)建三個工具,分別用于獲取球隊即將到來的賽程、之前的比賽結(jié)果以及聯(lián)賽的最新比賽結(jié)果。
@mcp.tool()
def get_team_fixtures(team_id: str) -> dict:
"""
獲取特定球隊即將到來的賽程
:param team_id: 球隊的ID
:return: 包含球隊接下來5場賽程的JSON響應(yīng)
"""
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響應(yīng)
"""
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:
"""
獲取英超聯(lián)賽的最新比賽結(jié)果
:return: 包含英超聯(lián)賽最近比賽的JSON響應(yīng)
"""
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}
這樣就設(shè)置好了所有主要工具。
注意,??get_team_results?
??和??get_team_fixtures?
??函數(shù)需要一個??team_id?
??參數(shù)。我們不硬編碼??team_id?
??的選擇,而是可以創(chuàng)建一個額外的工具,為模型提供它需要傳遞給這些函數(shù)的??team_id?
?。
@mcp.tool()
def get_team_ids():
"""
返回一個包含球隊名稱及其對應(yīng)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”,模型都應(yīng)該選擇ID為66的球隊。在這種情況下,這特別有用,因為體育團(tuán)隊通常會用昵稱來稱呼。
五、測試
在部署服務(wù)器之前,可以在開發(fā)模式下測試服務(wù)器,以確保所有工具都按預(yù)期工作。為此,在終端中輸入以下命令:
fastmcp dev server.py
這會啟動一個Web界面,可以在其中測試工具、監(jiān)控服務(wù)器性能并查看任何錯誤消息。在將服務(wù)器部署到客戶端之前,這對于調(diào)試服務(wù)器非常有用。
六、部署
現(xiàn)在開始部署到客戶端。FastMCP已經(jīng)內(nèi)置了與Claude桌面應(yīng)用的集成。要進(jìn)行安裝,在終端中運(yùn)行以下命令:
fastmcp install server.py
服務(wù)器已上線。
重新啟動Claude桌面應(yīng)用程序,你應(yīng)該會在文本框下方看到一個小工具圖標(biāo)。服務(wù)器上所有可用的工具都將顯示在這里。
現(xiàn)在已經(jīng)創(chuàng)建了MCP服務(wù)器,讓Claude能夠訪問英超聯(lián)賽的最新比賽結(jié)果和統(tǒng)計數(shù)據(jù),讓我們用之前的提示來測試一下,看看表現(xiàn)如何:
如你所見,剛剛創(chuàng)建的MCP服務(wù)器現(xiàn)在使Claude能夠獲取最新信息,并針對有關(guān)英超足球的提示提供準(zhǔn)確的回復(fù)。
這個設(shè)置展示了MCP如何彌合靜態(tài)知識與動態(tài)的現(xiàn)實(shí)世界信息之間的差距。只需幾個工具和一些簡單的設(shè)置,就可以大幅增強(qiáng)大語言模型在特定實(shí)時任務(wù)中的實(shí)用性。
本文轉(zhuǎn)載自??AI科技論談??,作者:AI科技論談
