目的:
在本地使用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
这里可以按照预期显示正确的结果。