目的:
在本地使用fastmcp開發一個mcp,然后注冊到阿里云的百煉里面。實現在百煉里面創建智能體的時候直接引用自己開發的MCP
已完成:本地環境安裝
待完成:
1.根據需求實現一個MCP中可以調用某應用的多個API即 @mcp.tool()、@mcp.prompt()、接入大模型實現根據問題自動選擇合適的tool
2.將MCP使用UVX部署到阿里云函數計算中,并在百煉中注冊MCP。
3.創建百煉Agent,調用MCP,驗證結果
一、環境準備
1.安裝 Node.js 和 UV
打開cmd,并輸入下面代碼安裝node.js:
選擇
winget install OpenJS.NodeJS
驗證:node --version
管理員身份運行 PowerShell 執行以下命令安裝 uv:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
如果一直卡在這個界面可能是因為沒有安裝python環境,要先安裝python環境。因為uv 的核心功能是管理 Python 環境、依賴包和執行 Python 代碼,其本身并不包含 Python 解釋器,必須依賴已安裝的 Python 來運行。
安裝python解釋器和開發軟件pycharm
1.下載python解釋器,因為阿里云的函數計算最高支持3.12的,所以這里我們也下載3.12版本。官網地址:https://www.python.org/getit/
選擇3.12.10,64位下載,或者直接訪問這個鏈接https://www.python.org/ftp/python/3.12.10/python-3.12.10-amd64.exe
驗證安裝結果,cmd輸入python
2.安裝pycharm
訪問這個鏈接,直接下載:https://www.jetbrains.com/pycharm/download
安裝完成之后,再次運行PowerShell 命令
關閉窗口后重新打開驗證:uv --version
2.安裝fastmcp
fastmcp官網地址:https://gofastmcp.com/getting-started/welcome
在本地先創建一個文件夾用來做項目管理,這里我新建一個D:\art\fastmcp
1.然后在這個目錄下進入cmd,執行以下命令新建一個項目:
uv init 01_env_test
2.進入項目目錄:
cd 01_env_test
3.使用 Python 內置模塊創建虛擬環境
python -m venv .venv
4.激活虛擬環境
.\.venv\Scripts\activate
初始化之后就可以在目錄下看到以下文件:
5.在這個目錄下打開cmd,執行命令安裝fastmcp
uv add fastmcp
查看安裝結果:
二、運行Demo
1.打開項目,驗證環境是否正常
打開Pycharm,選擇打開項目,然后選擇D:\art\fastmcp\01_env_test 這個目錄
找到main函數,運行下,看下環境是否正常
導入from fastmcp import FastMCP,檢查導入是否正常
把原來的代碼注釋掉,粘貼下面這段代碼
from fastmcp import FastMCPmcp = FastMCP("Demo 🚀")@mcp.tool
def add(a: int, b: int) -> int:"""Add two numbers"""return a + bif __name__ == "__main__":mcp.run()
點擊左下角打開命令行也可以查看版本信息
fastmcp version
2.創建一個服務端和客戶端的Demo
新建一個服務端的文件:my_server.py
寫一個函數,并使用 @mcp.tool 裝飾器將其注冊到服務器中
這里demo寫的是輸入一個string的名字,返回一個Hello +輸入的名字
from fastmcp import FastMCPmcp = FastMCP("My MCP Server")@mcp.tool
def greet(name: str) -> str:return f"Hello, {name}!"
官方也寫了一個在本文件中測試的代碼。完整代碼如下,調用鏈路就是運行后先運行call_tool方法,然后帶著參數調用了greet方法,最后返回了一個字符串拼接。
import asyncio
from fastmcp import FastMCP, Clientmcp = FastMCP("My MCP Server")@mcp.tool()
def greet(name: str) -> str:return f"Hello, {name}!"client = Client(mcp)async def call_tool(name: str):async with client:result = await client.call_tool("greet", {"name": name})print(result)asyncio.run(call_tool("666"))if __name__ == "__main__":mcp.run()
測試完之后顯示正常輸出,然后就把創建客戶端這個刪掉,還是保留最開始的代碼,不過下面新增一個main,讓他可以運行就行,等下用命令行的方式讓他運行起來,然后單獨在寫一個客戶端來調用這個服務端,修改后的代碼是:
新建一個客戶端:my_client.py
import asyncio
from fastmcp import Clientclient = Client("my_server.py")async def call_tool(name: str):async with client:result = await client.call_tool("greet", {"name": name})print(result)asyncio.run(call_tool("666"))
調用測試,回到下面命令行這里,點擊加號新增一個窗口,等下一個運行服務端,一個運行客戶端來調用。
在第一個窗口運行以下代碼啟動服務端:
uv run my_server.py
在第二個窗口運行以下代碼啟動客戶端調用:
uv run my_client.py
這里可以按照預期顯示正確的結果。