FastMCP:为大语言模型构建强大的上下文和工具服务
FastMCP:为大语言模型构建强大的上下文和工具服务
在人工智能快速发展的今天,大语言模型(LLM)已经成为许多应用的核心。然而,如何让这些模型更好地与外部世界交互,获取实时信息,执行特定任务,一直是开发者面临的挑战。模型上下文协议(Model Context Protocol,简称MCP)应运而生,它为LLM提供了一种标准化的方式来访问外部数据和功能。而FastMCP则是一个高效、简洁的Python库,让开发者能够轻松构建符合MCP规范的服务器和客户端。
本文将深入介绍FastMCP的核心功能、架构设计和实际应用,帮助开发者快速掌握这一强大工具,为大语言模型构建更智能、更实用的应用。
1. FastMCP简介
1.1 什么是MCP协议
模型上下文协议(Model Context Protocol)是一种专为大语言模型设计的标准化协议,它允许LLM以安全、一致的方式与外部系统交互。MCP协议常被描述为"AI的USB-C接口",提供了一种统一的方式连接LLM与它们可以使用的资源。
MCP协议的核心功能包括:
- 资源(Resources):类似于GET端点,用于将信息加载到LLM的上下文中
- 工具(Tools):类似于POST端点,用于执行代码或产生副作用
- 提示(Prompts):可重用的LLM交互模板
- 上下文(Context):提供额外的交互功能,如日志记录和进度报告
1.2 FastMCP的优势
FastMCP是MCP协议的高级Python实现,它大大简化了创建MCP服务器和客户端的过程。与直接使用底层MCP SDK相比,FastMCP具有以下优势:
- 高效开发:高级接口意味着更少的代码和更快的开发速度
- 简洁设计:最小化样板代码,专注于业务逻辑
- Python风格:API设计符合Python开发者的习惯
- 完整实现:提供MCP规范的全面实现
1.3 FastMCP 2.0的新特性
FastMCP 2.0是该项目的活跃开发版本,相比于贡献给官方MCP SDK的1.0版本,它增加了许多强大的新功能:
- 强大的客户端功能
- 服务器代理和组合
- OpenAPI/FastAPI集成
- 更多高级特性
2. Servers模块:构建MCP服务器
Servers模块是FastMCP的核心,提供了创建和管理MCP服务器的基础设施。
2.1 FastMCP服务器基础
创建一个基本的FastMCP服务器非常简单:
from fastmcp import FastMCP# 创建一个FastMCP服务器实例
mcp = FastMCP(name="MyServer")# 启动服务器
if __name__ == "__main__":mcp.run()
您还可以添加更多元数据来描述您的服务器:
from fastmcp import FastMCP# 创建带有元数据的服务器
mcp = FastMCP(name="WeatherServer",description="提供天气预报和历史天气数据",version="1.0.0",contact={"name": "开发团队", "email": "dev@example.com"}
)if __name__ == "__main__":mcp.run()
2.2 Tools:为LLM提供功能
Tools(工具)是FastMCP中最常用的功能之一,它允许LLM执行特定的操作或函数。使用@mcp.tool()
装饰器可以轻松将Python函数转换为LLM可调用的工具:
from fastmcp import FastMCPmcp = FastMCP(name="CalculatorServer")@mcp.tool()
def add(a: float, b: float) -> float:"""将两个数字相加。Args:a: 第一个数字b: 第二个数字Returns:两个数字的和"""return a + b@mcp.tool()
def multiply(a: float, b: float) -> float:"""将两个数字相乘。Args:a: 第一个数字b: 第二个数字Returns:两个数字的乘积"""return a * bif __name__ == "__main__":mcp.run()
FastMCP支持异步工具函数,这对于需要I/O操作的任务特别有用:
import asyncio
from fastmcp import FastMCPmcp = FastMCP(name="AsyncServer")@mcp.tool()
async def fetch_data(url: str) -> dict:"""从指定URL异步获取数据。Args:url: 要获取数据的URLReturns:获取的数据字典"""# 模拟异步网络请求await asyncio.sleep(1)return {"url": url, "status": "success", "data": "示例数据"}
工具函数还可以使用上下文对象来访问额外功能:
from fastmcp import FastMCP
from fastmcp.server import Contextmcp = FastMCP(name="ContextServer")@mcp.tool()
async def log_message(ctx: Context, message: str) -> bool:"""记录消息并返回成功状态。Args:ctx: FastMCP上下文对象message: 要记录的消息Returns:操作是否成功"""# 使用上下文发送日志ctx.info(f"收到消息: {message}")return True
2.3 Resources:提供上下文数据
Resources(资源)用于向LLM提供数据和上下文信息。与工具不同,资源主要用于读取数据而非执行操作:
from fastmcp import FastMCPmcp = FastMCP(name="DocumentServer")@mcp.resource()
def company_info() -> str:"""提供公司基本信息。"""return """公司名称: 示例科技有限公司成立时间: 2020年主营业务: 人工智能解决方案员工人数: 100+"""@mcp.resource()
def pricing_policy() -> dict:"""返回产品定价策略。"""return {"basic_plan": {"price": 99, "features": ["基础功能", "电子邮件支持"]},"pro_plan": {"price": 199, "features": ["所有基础功能", "高级功能", "优先支持"]},"enterprise": {"price": "联系销售", "features": ["定制解决方案", "专属支持团队"]}}
资源也可以接受参数,这使得它们更加灵活:
@mcp.resource()
def user_profile(user_id: int) -> dict:"""获取指定用户的个人资料。Args:user_id: 用户IDReturns:用户个人资料"""# 在实际应用中,这里会从数据库获取用户信息users = {1: {"name": "张三", "email": "zhang@example.com", "role": "管理员"},2: {"name": "李四", "email": "li@example.com", "role": "用户"},}if user_id in users:return users[user_id]else:return {"error": "用户不存在"}
2.4 Prompts:创建提示模板
Prompts(提示)允许您创建可重用的提示模板,这些模板可以被参数化并用于标准化LLM交互:
from fastmcp import FastMCP
from fastmcp.types import Messagemcp = FastMCP(name="CustomerServiceBot")@mcp.prompt()
def greeting(customer_name: str) -> list[Message]:"""创建一个个性化的问候提示。Args:customer_name: 客户名称Returns:包含问候消息的提示"""return [{"role": "system", "content": "你是一位专业的客户服务代表,语气友好且乐于助人。"},{"role": "user", "content": f"你好,我是{customer_name},我需要一些帮助。"}]@mcp.prompt()
def product_inquiry(product_name: str, specific_question: str = None) -> list[Message]:"""创建产品咨询提示。Args:product_name: 产品名称specific_question: 具体问题(可选)Returns:包含产品咨询的提示"""content = f"我想了解关于{product_name}的信息。"if specific_question:content += f" 具体来说,{specific_question}"return [{"role": "system", "content": "你是产品专家,提供准确、简洁的产品信息。"},{"role": "user", "content": content}]
2.5 Context:访问服务器功能
Context(上下文)对象提供了在工具和资源函数内部访问FastMCP服务器功能的方法:
from fastmcp import FastMCP
from fastmcp.server import Contextmcp = FastMCP(name="ContextDemoServer")@mcp.tool()
async def process_task(ctx: Context, task_name: str, complexity: int) -> dict:"""处理一个任务并报告进度。Args:ctx: FastMCP上下文对象task_name: 任务名称complexity: 任务复杂度(1-10)Returns:任务处理结果"""# 发送信息日志ctx.info(f"开始处理任务: {task_name}")# 报告进度total_steps = complexityfor step in range(1, total_steps + 1):# 更新进度ctx.progress(step / total_steps, f"完成步骤 {step}/{total_steps}")# 如果任务复杂,发送详细日志if complexity > 5:ctx.debug(f"步骤 {step} 详细信息: 正在处理中...")# 任务完成,发送成功日志ctx.info(f"任务 {task_name} 已完成")return {"task": task_name,"status": "completed","complexity_level": complexity}
上下文对象提供的主要功能包括:
- 日志记录(debug、info、warning、error)
- 进度报告
- 资源访问
- 请求元数据访问
2.6 Proxy Servers:代理远程服务器
Proxy Servers(代理服务器)允许一个FastMCP服务器实例作为另一个MCP服务器的前端:
from fastmcp import FastMCP, Client# 假设我们有一个远程MCP服务器运行在这个URL
remote_url = "https://api.example.com/mcp"# 创建一个客户端连接到远程服务器
client = Client(remote_url)# 从客户端创建代理服务器
proxy_server = FastMCP.from_client(client=client,name="LocalProxy",description="本地代理到远程MCP服务"
)if __name__ == "__main__":# 在本地运行代理服务器proxy_server.run()
代理服务器的主要用途包括:
- 为远程MCP服务器提供不同的传输方式
- 集成不同实现的MCP服务器
- 创建服务器网关
2.7 Composition:组合多个服务器
Composition(组合)功能允许您将多个FastMCP服务器组合成一个更大的应用:
from fastmcp import FastMCP# 创建主服务器
main_server = FastMCP(name="MainApplication")# 创建工具服务器
tools_server = FastMCP(name="ToolsServer")@tools_server.tool()
def utility_function(text: str) -> str:return f"处理结果: {text.upper()}"# 创建数据服务器
data_server = FastMCP(name="DataServer")@data_server.resource()
def get_config() -> dict:return {"api_version": "v2", "timeout": 30}# 将工具服务器和数据服务器导入到主服务器
main_server.import_server(tools_server, prefix="tools")
main_server.import_server(data_server, prefix="data")if __name__ == "__main__":main_server.run()
FastMCP支持两种组合方式:
- 静态导入:使用
import_server
方法一次性复制组件 - 动态挂载:使用
mount
方法创建实时委托链接
# 动态挂载服务器
main_server.mount(auth_server, prefix="auth")
main_server.mount(content_server, prefix="content")
3. Deployment模块:部署MCP服务器
Deployment模块提供了多种方式来运行和部署FastMCP服务器。
3.1 Running the Server:运行服务器
最基本的运行方式是使用run()
方法:
from fastmcp import FastMCPmcp = FastMCP(name="SimpleServer")@mcp.tool()
def hello(name: str) -> str:return f"你好,{name}!"if __name__ == "__main__":# 使用默认设置运行服务器mcp.run()
您可以配置多种运行选项:
if __name__ == "__main__":# 使用HTTP传输并指定端口mcp.run(transport="http",host="0.0.0.0",port=8080,log_level="info")
FastMCP支持多种传输协议:
- HTTP:标准HTTP传输
- SSE:服务器发送事件传输
- STDIO:标准输入/输出传输(用于命令行工具)
3.2 ASGI Integration:与ASGI框架集成
FastMCP可以轻松集成到现有的ASGI应用中,如Starlette和FastAPI:
from fastmcp import FastMCP
from starlette.applications import Starlette
from starlette.routing import Route, Mount
from starlette.responses import JSONResponse# 创建FastMCP服务器
mcp = FastMCP(name="APIServer")@mcp.tool()
def greet(name: str) -> str:return f"你好,{name}!"# 创建Starlette路由
async def homepage(request):return JSONResponse({"message": "欢迎访问API服务器"})# 获取MCP的ASGI应用
mcp_app = mcp.http_app()# 创建Starlette应用并挂载MCP
app = Starlette(routes=[Route("/", homepage),Mount("/mcp", app=mcp_app)
])# 使用uvicorn运行
# uvicorn myapp:app
与FastAPI集成:
from fastmcp import FastMCP
from fastapi import FastAPI# 创建FastMCP服务器
mcp = FastMCP(name="FastAPIIntegration")@mcp.tool()
def analyze_text(text: str) -> dict:word_count = len(text.split())char_count = len(text)return {"word_count": word_count,"character_count": char_count,"summary": f"文本包含{word_count}个单词,{char_count}个字符"}# 创建FastAPI应用
app = FastAPI(title="集成示例")@app.get("/")
def read_root():return {"message": "欢迎访问API"}# 挂载MCP到FastAPI
app.mount("/mcp", mcp.http_app())
ASGI集成的主要用途包括:
- 向现有网站或API添加MCP功能
- 在特定URL路径下挂载MCP服务器
- 结合多种服务在单一应用中
3.3 Authentication:服务器认证
FastMCP利用底层MCP SDK的OAuth 2.0支持提供认证功能:
from fastmcp import FastMCP# 创建带有认证的服务器
mcp = FastMCP(name="SecureServer",# 配置认证(这里使用简化示例,实际使用时需参考MCP认证文档)auth={"type": "oauth2","flows": {"clientCredentials": {"tokenUrl": "https://auth.example.com/token","scopes": {"read": "读取权限","write": "写入权限"}}}}
)@mcp.tool()
def secure_operation(data: str) -> str:return f"安全处理: {data}"
3.4 CLI:命令行界面
FastMCP提供了一个命令行界面,使您可以轻松运行和管理服务器:
# 直接运行服务器
fastmcp run server.py# 以开发模式运行(带MCP检查器)
fastmcp dev server.py# 安装到Claude桌面应用
fastmcp install server.py# 查看版本信息
fastmcp version
CLI还支持依赖管理:
# 使用指定依赖运行
fastmcp run server.py --with pandas,numpy# 使用可编辑依赖运行
fastmcp run server.py --with-editable ./my_package
4. Clients模块:与MCP服务器交互
Clients模块提供了与MCP服务器交互的客户端功能。
4.1 Client Overview:客户端概述
基本的客户端使用方式:
import asyncio
from fastmcp import Clientasync def main():# 连接到MCP服务器async with Client("http://localhost:8080") as client:# 调用工具result = await client.tools.call("add", a=5, b=3)print(f"计算结果: {result}")# 读取资源weather = await client.resources.read("current_weather", city="北京")print(f"天气信息: {weather}")if __name__ == "__main__":asyncio.run(main())
客户端还支持回调处理:
import asyncio
from fastmcp import Clientasync def progress_callback(progress: float, message: str):print(f"进度: {progress*100:.1f}% - {message}")async def main():async with Client("http://localhost:8080") as client:# 注册回调client.register_progress_callback(progress_callback)# 调用可能产生进度更新的工具result = await client.tools.call("process_large_file", filename="data.csv")print(f"处理结果: {result}")
4.2 Transports:客户端传输
FastMCP客户端支持多种传输方式:
import asyncio
from fastmcp import Client
from fastmcp.client.transports import StreamableHttpTransportasync def main():# 创建HTTP传输transport = StreamableHttpTransport(base_url="http://localhost:8080")# 使用指定传输创建客户端async with Client(transport=transport) as client:result = await client.tools.call("hello", name="世界")print(result)
对于测试,可以使用内存传输:
import asyncio
from fastmcp import FastMCP, Client
from fastmcp.client.transports import FastMCPTransport# 创建服务器
mcp = FastMCP(name="TestServer")@mcp.tool()
def echo(message: str) -> str:return f"回声: {message}"async def main():# 创建内存传输transport = FastMCPTransport(mcp=mcp)# 使用内存传输创建客户端async with Client(transport=transport) as client:result = await client.tools.call("echo", message="测试消息")print(result) # 输出: 回声: 测试消息
FastMCP支持的主要传输类型包括:
- StreamableHttpTransport:用于HTTP连接(推荐用于远程服务器)
- SSETransport:用于SSE连接(旧版选项)
- FastMCPTransport:用于内存中测试
- UvxStdioTransport/NpxStdioTransport:用于本地服务器
5. Patterns模块:高级使用模式
Patterns模块提供了一系列高级使用模式和集成方案。
5.1 Decorating Methods:装饰方法模式
在类中使用FastMCP装饰器需要特别注意:
from fastmcp import FastMCPmcp = FastMCP(name="ClassMethodsDemo")class Calculator:def __init__(self, precision: int = 2):self.precision = precision# 不要直接装饰实例方法def add_wrong(self, a: float, b: float) -> float:"""这种方式会导致错误,因为装饰器在实例存在前捕获方法"""return round(a + b, self.precision)# 正确方式:使用静态方法或类方法@staticmethod@mcp.tool()def add(a: float, b: float, precision: int = 2) -> float:"""正确方式:使用静态方法并将实例属性作为参数传递"""return round(a + b, precision)# 另一种方式:工厂函数@classmethoddef register_methods(cls, server: FastMCP):"""使用工厂方法注册实例方法"""calculator = cls()@server.tool()def multiply(a: float, b: float) -> float:return round(a * b, calculator.precision)return calculator# 注册方法
calc = Calculator.register_methods(mcp)
5.2 HTTP Requests:访问HTTP请求信息
在FastMCP服务器中访问HTTP请求信息:
from fastmcp import FastMCP
from fastmcp.server.dependencies import get_http_request
from starlette.requests import Requestmcp = FastMCP(name="HTTPRequestDemo")@mcp.tool()
async def user_agent_info(request: Request = get_http_request()) -> dict:"""返回有关客户端的信息。Args:request: HTTP请求对象(自动注入)Returns:客户端信息"""return {"user_agent": request.headers.get("user-agent", "未知"),"client_ip": request.client.host if request.client else "未知","request_path": request.url.path,"query_params": dict(request.query_params)}
5.3 OpenAPI:从OpenAPI生成服务器
FastMCP可以从OpenAPI规范自动生成MCP服务器:
import httpx
from fastmcp import FastMCP# 创建API客户端
api_client = httpx.AsyncClient(base_url="https://api.example.com")# 加载OpenAPI规范
openapi_spec = {"openapi": "3.0.0","info": {"title": "示例API", "version": "1.0.0"},"paths": {"/users": {"get": {"summary": "获取用户列表","operationId": "getUsers","responses": {"200": {"description": "成功响应","content": {"application/json": {}}}}}},"/users/{userId}": {"get": {"summary": "获取用户详情","operationId": "getUserById","parameters": [{"name": "userId","in": "path","required": True,"schema": {"type": "integer"}}],"responses": {"200": {"description": "成功响应","content": {"application/json": {}}}}}}}
}# 从OpenAPI规范创建MCP服务器
mcp = FastMCP.from_openapi(openapi_spec=openapi_spec,client=api_client
)
5.4 FastAPI:从FastAPI应用生成服务器
FastMCP可以从FastAPI应用自动生成MCP服务器:
from fastapi import FastAPI, Path
from fastmcp import FastMCP# 创建FastAPI应用
app = FastAPI(title="用户API")@app.get("/users")
async def get_users():"""获取所有用户列表"""return [{"id": 1, "name": "张三"},{"id": 2, "name": "李四"}]@app.get("/users/{user_id}")
async def get_user(user_id: int = Path(..., description="用户ID")):"""获取特定用户信息"""users = {1: {"id": 1, "name": "张三", "email": "zhang@example.com"},2: {"id": 2, "name": "李四", "email": "li@example.com"}}if user_id in users:return users[user_id]return {"error": "用户不存在"}# 从FastAPI应用创建MCP服务器
mcp = FastMCP.from_fastapi(app)
5.5 Contrib Modules:贡献模块
FastMCP包含一个contrib
包,其中包含社区贡献的扩展模块:
from fastmcp import FastMCP
from fastmcp.contrib import my_module # 假设存在这样的贡献模块mcp = FastMCP(name="ContribDemo")# 使用贡献模块的功能
my_module.setup(mcp)
5.6 Testing:测试MCP服务器
FastMCP提供了测试MCP服务器的工具和模式:
import pytest
from fastmcp import FastMCP, Client# 创建要测试的服务器
@pytest.fixture
def mcp_server():mcp = FastMCP(name="TestServer")@mcp.tool()def add(a: float, b: float) -> float:return a + b@mcp.resource()def config() -> dict:return {"version": "1.0.0"}return mcp# 测试工具功能
async def test_add_tool(mcp_server):async with Client(mcp_server) as client:result = await client.tools.call("add", a=5, b=3)assert result == 8# 测试资源功能
async def test_config_resource(mcp_server):async with Client(mcp_server) as client:config = await client.resources.read("config")assert config["version"] == "1.0.0"
6. 实际应用场景
6.1 天气查询服务
下面是一个完整的天气查询服务示例,展示了FastMCP的多种功能:
import asyncio
import httpx
from fastmcp import FastMCP
from fastmcp.server import Context# 创建天气服务器
mcp = FastMCP(name="WeatherService",description="提供全球城市的天气预报和历史天气数据"
)# 模拟天气API客户端
class WeatherAPI:async def get_current_weather(self, city: str):# 实际应用中,这里会调用真实的天气APIawait asyncio.sleep(1) # 模拟网络延迟# 返回模拟数据weather_data = {"北京": {"temp": 25, "condition": "晴朗", "humidity": 40},"上海": {"temp": 28, "condition": "多云", "humidity": 65},"广州": {"temp": 30, "condition": "雨", "humidity": 80},}return weather_data.get(city, {"error": "城市不存在"})async def get_forecast(self, city: str, days: int = 3):# 模拟天气预报await asyncio.sleep(1.5)if city not in ["北京", "上海", "广州"]:return {"error": "城市不存在"}forecast = []base_temp = 25 if city == "北京" else 28 if city == "上海" else 30for day in range(1, days + 1):forecast.append({"day": day,"temp": base_temp + day - 1,"condition": "晴朗" if day % 3 == 0 else "多云" if day % 3 == 1 else "雨"})return forecast# 创建API客户端实例
weather_api = WeatherAPI()@mcp.tool()
async def current_weather(ctx: Context, city: str) -> dict:"""获取指定城市的当前天气。Args:ctx: FastMCP上下文city: 城市名称(如:北京、上海、广州)Returns:当前天气信息"""ctx.info(f"正在获取{city}的天气信息...")try:weather_data = await weather_api.get_current_weather(city)if "error" in weather_data:ctx.warning(f"无法获取{city}的天气信息")return weather_datactx.info(f"成功获取{city}的天气信息")return {"city": city,"temperature": f"{weather_data['temp']}°C","condition": weather_data['condition'],"humidity": f"{weather_data['humidity']}%"}except Exception as e:ctx.error(f"获取天气信息时出错: {str(e)}")return {"error": f"服务错误: {str(e)}"}@mcp.tool()
async def weather_forecast(ctx: Context, city: str, days: int = 3) -> dict:"""获取指定城市的天气预报。Args:ctx: FastMCP上下文city: 城市名称(如:北京、上海、广州)days: 预报天数(1-7)Returns:天气预报信息"""# 验证参数if days < 1 or days > 7:ctx.warning("预报天数必须在1-7之间")days = max(1, min(days, 7))ctx.info(f"正在获取{city}未来{days}天的天气预报...")try:# 显示进度ctx.progress(0.3, "连接天气服务...")forecast_data = await weather_api.get_forecast(city, days)ctx.progress(0.7, "处理预报数据...")if "error" in forecast_data:ctx.warning(f"无法获取{city}的天气预报")return {"city": city, "error": forecast_data["error"]}# 格式化预报数据formatted_forecast = []for day in forecast_data:formatted_forecast.append({"day": f"第{day['day']}天","temperature": f"{day['temp']}°C","condition": day['condition']})ctx.progress(1.0, "预报数据准备完成")ctx.info(f"成功获取{city}的{days}天天气预报")return {"city": city,"forecast_days": days,"forecast": formatted_forecast}except Exception as e:ctx.error(f"获取天气预报时出错: {str(e)}")return {"error": f"服务错误: {str(e)}"}@mcp.resource()
def supported_cities() -> list:"""返回支持的城市列表。"""return ["北京", "上海", "广州"]@mcp.resource()
def weather_tips() -> dict:"""提供不同天气条件下的建议。"""return {"晴朗": "天气晴朗,适合户外活动,记得防晒。","多云": "天气多云,温度适宜,适合各类活动。","雨": "有雨,外出请携带雨具,注意路滑。"}@mcp.prompt()
def weather_report_template(city: str) -> list:"""创建天气报告提示模板。"""return [{"role": "system", "content": "你是一位专业的天气播报员,提供准确、简洁的天气信息。"},{"role": "user", "content": f"请为{city}提供一份简短的天气报告,包括温度、天气状况和建议。"}]if __name__ == "__main__":mcp.run()
6.2 与FastAPI集成的Web应用
下面是一个将FastMCP与FastAPI集成的任务管理系统示例:
from fastapi import FastAPI, Depends, HTTPException, Path, Query
from fastmcp import FastMCP
from pydantic import BaseModel
from typing import List, Optional
import uvicorn# 创建FastAPI应用
app = FastAPI(title="任务管理API",description="使用FastAPI和FastMCP构建的任务管理系统"
)# 数据模型
class Task(BaseModel):id: inttitle: strdescription: Optional[str] = Nonecompleted: bool = Falseclass TaskCreate(BaseModel):title: strdescription: Optional[str] = None# 模拟数据库
tasks_db = {1: Task(id=1, title="学习FastMCP", description="阅读文档并尝试示例", completed=False),2: Task(id=2, title="构建MCP服务器", description="创建一个简单的工具服务器", completed=True),
}# FastAPI路由
@app.get("/tasks", response_model=List[Task], tags=["任务"])
async def get_tasks(completed: Optional[bool] = Query(None, description="按完成状态筛选")):"""获取所有任务或按完成状态筛选任务"""if completed is None:return list(tasks_db.values())return [task for task in tasks_db.values() if task.completed == completed]@app.get("/tasks/{task_id}", response_model=Task, tags=["任务"])
async def get_task(task_id: int = Path(..., description="任务ID")):"""获取特定任务详情"""if task_id not in tasks_db:raise HTTPException(status_code=404, detail="任务不存在")return tasks_db[task_id]@app.post("/tasks", response_model=Task, status_code=201, tags=["任务"])
async def create_task(task: TaskCreate):"""创建新任务"""task_id = max(tasks_db.keys()) + 1 if tasks_db else 1new_task = Task(id=task_id, title=task.title, description=task.description)tasks_db[task_id] = new_taskreturn new_task@app.put("/tasks/{task_id}/complete", response_model=Task, tags=["任务"])
async def complete_task(task_id: int = Path(..., description="任务ID")):"""将任务标记为已完成"""if task_id not in tasks_db:raise HTTPException(status_code=404, detail="任务不存在")tasks_db[task_id].completed = Truereturn tasks_db[task_id]@app.delete("/tasks/{task_id}", status_code=204, tags=["任务"])
async def delete_task(task_id: int = Path(..., description="任务ID")):"""删除任务"""if task_id not in tasks_db:raise HTTPException(status_code=404, detail="任务不存在")del tasks_db[task_id]return None# 创建FastMCP服务器
mcp = FastMCP.from_fastapi(app)# 添加额外的MCP功能
@mcp.tool()
async def task_statistics() -> dict:"""获取任务统计信息。Returns:任务统计数据"""total = len(tasks_db)completed = sum(1 for task in tasks_db.values() if task.completed)pending = total - completedreturn {"total_tasks": total,"completed_tasks": completed,"pending_tasks": pending,"completion_rate": f"{(completed / total * 100) if total > 0 else 0:.1f}%"}@mcp.resource()
def task_categories() -> list:"""获取任务分类建议。"""return ["工作", "学习", "个人", "健康", "家庭", "娱乐", "财务", "其他"]@mcp.prompt()
def task_reminder_template(task_id: int) -> list:"""创建任务提醒提示模板。"""if task_id not in tasks_db:return [{"role": "system", "content": "你是一位任务助手。"},{"role": "user", "content": f"我想获取ID为{task_id}的任务提醒,但该任务不存在。"}]task = tasks_db[task_id]return [{"role": "system", "content": "你是一位友好的任务提醒助手,提供简短、积极的提醒。"},{"role": "user", "content": f"请为以下任务创建一个提醒消息:\n\n标题:{task.title}\n描述:{task.description or '无'}\n状态:{'已完成' if task.completed else '未完成'}"}]# 挂载MCP到FastAPI
app.mount("/mcp", mcp.http_app())# 运行服务器
if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=8000)
7. 总结
FastMCP是一个强大而灵活的Python库,它大大简化了MCP服务器和客户端的创建过程。通过提供高级、Pythonic的接口,FastMCP使开发者能够专注于业务逻辑,而不是底层协议细节。
主要优势包括:
- 简洁的API设计:最小化样板代码,提高开发效率
- 完整的功能集:支持工具、资源、提示和上下文等MCP核心功能
- 灵活的部署选项:支持多种运行方式和与现有框架的集成
- 强大的客户端功能:提供与MCP服务器交互的简单方式
- 丰富的高级模式:支持服务器组合、代理和各种集成方案
无论您是想为大语言模型提供数据访问、功能执行,还是创建复杂的AI应用,FastMCP都是一个值得考虑的工具。它不仅简化了开发过程,还提供了丰富的功能和灵活的集成选项,使您能够充分发挥大语言模型的潜力。
随着MCP协议的不断发展和FastMCP的持续改进,我们可以期待看到更多创新的AI应用和服务。现在正是开始探索这一强大工具的好时机!
相关文章:
FastMCP:为大语言模型构建强大的上下文和工具服务
FastMCP:为大语言模型构建强大的上下文和工具服务 在人工智能快速发展的今天,大语言模型(LLM)已经成为许多应用的核心。然而,如何让这些模型更好地与外部世界交互,获取实时信息,执行特定任务&am…...
TC3xx学习笔记-UCB BMHD使用详解(二)
文章目录 前言Confirmation的定义Dual UCB: Confirmation StatesDual UCB: Errored State or ECC Error in the UCB Confirmation CodesECC Error in the UCB ContentDual Password UCB ORIG and COPY Re-programming UCB_BMHDx_ORIG and UCB_BMHDx_COPY (x 0-3)BMHD Protecti…...
【Docker】docker compose和docker swarm区别
Docker Swarm 和 Docker Compose 的核心区别: 1. 定位不同 Docker Compose 单机多容器编排:在单个主机上管理多个容器,适合本地开发、测试环境。单节点部署:所有容器运行在同一 Docker 引擎实例上。 Docker Swarm 集群管理工具&…...
Power BI Desktop开发——矩阵相关操作
本篇文章使用2025年5月17日从微软商店下载的最新版Power BI Desktop 目录 1.设置矩阵网格整体大小 2.设置矩阵网格行高 3.设置矩阵网格列宽 4.隐藏矩阵网格的某一列 5.隐藏矩阵网格的某一行 6.设置矩阵网格居中展示 7.号图表的显示设置 8.调整行标题的缩进 9.设置矩阵…...
系统架构设计(九):分布式架构与微服务
基础定义 架构类型定义分布式架构指将系统部署在多个服务器节点上,通过网络协作完成整体功能。强调物理上的分布与任务协作。微服务架构一种分布式架构模式,将系统按照业务维度拆分为多个小型自治服务,每个服务可独立开发、部署、伸缩。 核…...
Linux服务器安全如何加固?禁用不必要的服务与端口如何操作?
保护Linux服务器的安全性对于确保系统的稳定性和数据的保密性至关重要。加固Linux服务器的安全性包括禁用不必要的服务和端口,以减少潜在的攻击面。本文将探讨如何加固Linux服务器的安全性,具体介绍如何禁用不必要的服务和端口,从而提高服务器…...
AgentCPM-GUI,清华联合面壁智能开源的端侧GUI智能体模型
AgentCPM-GUI是什么 AgentCPM-GUI 是由清华大学与面壁智能团队联合开发的一款开源端侧图形用户界面(GUI)代理,专为中文应用进行优化。基于 MiniCPM-V 模型(80 亿参数),该系统能够接收智能手机的屏幕截图&a…...
如何用AI优化简历:自动读取与精华浓缩
在求职过程中,一份出色的简历往往是成功的关键。然而,许多求职者在撰写简历时往往面临诸多挑战,比如如何让简历更突出、如何让招聘者快速了解自己的核心优势等。随着人工智能技术的发展,AI不仅可以帮助我们优化简历内容࿰…...
Jackson使用详解
JSON Jackson是java提供处理json数据序列化和反序列的工具类,在使用Jackson处理json前,我们得先掌握json。 JSON数据类型 类型示例说明字符串(String)"hello"双引号包裹,支持转义字符(如 \n&a…...
Node.js 源码概览
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它的源码结构相当庞大且复杂。下面我将为你讲解 Node.js 源码的主要结构和关键组成部分。 源码结构 Node.js 的主要源码目录结构如下: node/ ├── lib/ # JavaScript 核心模…...
简单神经网络(ANN)实现:从零开始构建第一个模型
本文将手把手带你用 Python Numpy 实现一个最基础的人工神经网络(Artificial Neural Network, ANN)。不依赖任何深度学习框架,适合入门理解神经网络的本质。 一、项目目标 构建一个三层神经网络(输入层、隐藏层、输出层…...
Conda 完全指南:从环境管理到工具集成
Conda 完全指南:从环境管理到工具集成 在数据科学、机器学习和 Python 开发领域,环境管理一直是令人头疼的问题。不同项目依赖的库版本冲突、Python 解释器版本不兼容等问题频繁出现,而 Conda 的出现彻底解决了这些痛点。作为目前最流行的跨…...
防范Java应用中的恶意文件上传:确保服务器的安全性
防范Java应用中的恶意文件上传:确保服务器的安全性 在当今数字化时代,Java 应用无处不在,而文件上传功能作为许多应用的核心组件,却潜藏着巨大的安全隐患。恶意文件上传可能导致服务器被入侵、数据泄露甚至服务瘫痪,因…...
CSS- 4.2 相对定位(position: relative)
本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 点…...
Face Over 84.0| 利用AI技术交换照片或视频中的面孔,制作有趣内容
Face Over是一款充满创造力和乐趣的应用程序,它利用AI技术帮助用户交换照片或视频中的面孔,预测未来宝宝的模样,并将照片制作成动画。无论您是想制作有趣的模因、口型同步视频还是探索未来家庭成员的模样,这款应用程序都能满足您的…...
怎么在excel单元格1-5行中在原来内容前面加上固定一个字?
环境: WPS 2024 问题描述: 怎么在excel单元格1-5行中在原来内容前面加上固定一个字? 解决方案: 1.在Excel中,如果您想在单元格的内容前面添加一个固定的字,可以通过以下几种方法实现: 方法…...
AI:人形机器人一定是人的形状吗?
本文将从技术角度分析人形机器人是否必须是人的形状,以及人形与非人形机器人在适用场合、优缺点上的差异。以下是详细解答: 人形机器人一定是人的形状吗? 不,人形机器人(Humanoid Robot)在技术上通常指外…...
26、思维链Chain-of-Thought(CoT)论文笔记
思维链Chain-of-Thought(CoT) **1、研究背景与核心目标****2、思维链提示的方法设计**2.1 COT方法2.2 传统方法 3、实验设计与关键数据集3.1 算术推理3.2 常识推理3.3 符号推理 4、关键实验结果1. 算术推理:思维链提示显著提升多步问题解决率…...
golang中的反射示例
文章目录 前言一、通过反射获取底层类型 reflect.typeOf()二、反射获取底层的值 reflect.ValueOf()三、通过反射设置底层值四 、进阶结构体反射示例 前言 反射就像是给程序装上了显微镜,运行时随时查看底层类型以及底层值,根据需要动态读写或调用方法。…...
NX二次开发——设置对象的密度(UF_MODL_set_body_density)
在前几篇博客中我们已经探讨了如何设置实体的密度。在装配环境中,同样可以为组件设置密度。虽然不能直接对组件进行密度设置,但可以通过一种间接方式实现:在装配环境下,利用 UF_ASSEM_set_work_part_quietly() 函数以静默方式将组…...
基于朴素贝叶斯与 LSTM 的假新闻检测模型对比分析
一、引言 在信息爆炸的时代,假新闻的传播对社会产生了诸多负面影响。如何快速、准确地识别假新闻成为了重要的研究课题。本文将对比传统机器学习算法(朴素贝叶斯)与深度学习模型(LSTM)在假新闻检测任务中的性能表现&am…...
共享内存【Linux操作系统】
文章目录 共享内存共享内存的原理共享内存相关函数和系统调用--systemV系统调用:shmget系统调用:shmctl系统调用:shmat系统调用:shmdt系统调用:ftok 共享内存相关函数和系统调用--POSIXshm_open-- 创建或打开共享内存对…...
Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析
1. 引言 在 Android 系统中,ActivityManagerService (AMS)、WindowManagerService (WMS) 和 PackageManagerService (PMS) 是三个最核心的系统服务,它们分别管理着应用的生命周期、窗口显示和应用包管理。 但你是否知道,这些服务并不是独立…...
arduino平台读取鼠标光电传感器
鼠标坏掉了,大抵是修不好了。(全剧终—) 但是爱动手的小明不会浪费这个鼠标,确认外观没有明显烧毁痕迹后,尝试从电路板上利用光电传感器进行位移的测量,光电传感器(型号:FCT3065&am…...
EXO分布式部署deepseek r1
EXO 是一个支持分布式 AI 计算的框架,可以用于在多个设备(包括 Mac Studio)上运行大语言模型(LLM)。以下是联调 Mac Studio 512GB 的步骤: 安装 EXO • 从 EXO GitHub 仓库 下载源码或使用 git clone 获取…...
机器学习 KNN算法
KNN算法 1. sklearn机器学习概述2. KNN算法-分类1 样本距离判断2 KNN 算法原理3 KNN缺点4 API5 sklearn 实现KNN示例6 模型保存与加载葡萄酒(load_wine)数据集KNN算法(1)wine.feature_names:(2)wine.target_names(3)KNN算法实现 1. sklearn机器学习概述 获取数据、数据处理、特…...
强化学习赋能医疗大模型:构建闭环检索-反馈-优化系统提升推理能力
引言 人工智能技术在医疗领域的应用正经历前所未有的发展,特别是在大型语言模型(LLMs)技术的推动下,医疗大模型(Medical Large Models)展现出巨大的潜力。这些模型不仅能够理解复杂的医学术语和概念,还能通过自然语言与用户交互,为医疗专业人士和患者提供有价值的信息和建…...
深入解析Spring Boot与JUnit 5的集成测试实践
深入解析Spring Boot与JUnit 5的集成测试实践 引言 在现代软件开发中,测试是确保代码质量和功能正确性的关键环节。Spring Boot作为目前最流行的Java Web框架之一,提供了强大的支持来简化测试流程。而JUnit 5作为最新的JUnit版本,引入了许多…...
哈希的原理、实现
目录 引言 一、哈希概念 二、哈希函数 三、哈希冲突解决方法 四、unordered系列关联式容器(以unordered_map为例) 五、哈希的应用 完整代码 六、总结 引言 在计算机科学领域,哈希是一种非常重要的数据结构和算法思想,广…...
端口443在git bash向github推送时的步骤
端口443在git bash向github推送时的步骤 你的环境可能因防火墙限制无法使用默认的 SSH 端口(22),因此需要改用 SSH over HTTPS(端口 443) 进行 Git 推送。 github与git bash绑定问题详见博主先前写过的参考博文&#…...
Ankr:Web3基础设施的革新者
在Web3技术蓬勃发展的今天,去中心化基础设施的重要性日益凸显。Ankr作为这一领域的佼佼者,凭借其强大的分布式云计算能力和创新的技术解决方案,正在成为推动Web3发展的关键力量。本文将深入探讨Ankr的技术亮点、应用场景以及其在区块链生态中…...
配置git从公网能访问-基于frp
git从公网能访问 一个小小的疏忽带来了一下午上午的工作量起因与上下文与结论主要收获1。公网主机的防火墙需要至少三条3。gitlab的http端口和ssh端口,需要分为两个3。不要用nginx来解析二级域名 测试指令最终的成功的指令是: 用到的指令ssh1. 生成 SSH …...
HarmonyOS:重构万物互联时代的操作系统范式
HarmonyOS:重构万物互联时代的操作系统范式 引言:操作系统的新纪元 在数字化转型的深水区,操作系统作为数字世界的基石正在经历前所未有的变革。当全球科技巨头还在移动终端操作系统领域激烈角逐时,华为推出的HarmonyOS以分布式…...
告别“知识孤岛”:RAG赋能网络安全运营
一、背景 在网络安全运营工作中,我们积累了大量的内部知识内容,涵盖了威胁情报、事件响应流程、安全策略、合规性要求等多个方面。然而,这些知识虽然数量庞大、内容丰富,却因形式多样、结构分散,难以让每一位成员真正…...
A级、B级弱电机房数据中心建设运营汇报方案
该方案围绕A 级、B 级弱电机房数据中心建设与运营展开,依据《数据中心设计规范》等标准,施工范围涵盖 10 类机房及配套设施,采用专业化施工团队与物资调配体系,强调标签规范、线缆隐藏等细节管理。运营阶段建立三方协同运维模式,针对三级故障制定30 分钟至 1 小时响应机制…...
C 语言学习笔记(数组)
C 语言基础:第 08天笔记 内容提要 数组 排序算法:冒泡排序二维数组字符数组 数组 冒泡排序 排序思想(向前冒泡): 一次排好一个数,针对n个数,最差情况需要n - 1次就可以排好每次排序假定第一…...
jvm安全点(二)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞
1. 信号处理与桩代码(Stub) 当线程访问安全点轮询页(Polling Page)时: 触发 SIGSEGV 信号:访问只读的轮询页会引发 SIGSEGV 异常。信号处理函数:pd_hotspot_signal_handl…...
uni-app 开发HarmonyOS的鸿蒙影视项目分享:从实战案例到开源后台
最近,HBuilderX 新版本发布,带来了令人兴奋的消息——uni-app 现在支持 Harmony Next 平台的 App 开发。这对于开发者来说无疑是一个巨大的福音,意味着使用熟悉的 Vue 3 语法和开发框架,就可以为鸿蒙生态贡献自己的力量。 前言 作…...
【赵渝强老师】在PostgreSQL中访问Oracle
在PostgreSQL数据库中,oracle_fdw是PostgreSQL数据库支持的外部扩展。通过使用oracle_fdw扩展可以读取到Oracle数据库中的数据。它是一种非常方便且常见的PostgreSQL与Oracle的同步数据的方法。使用oracle_fdw扩展需要依赖Oracle的Instance Client环境。 视频讲解如…...
板凳-------Mysql cookbook学习 (二)
生成一个包含cookbook数据库中的表备份的名为backup.sql的dump文件。 sql C:\Users\lenovo>mysqldump -u root -p --default-character-setutf8mb4 cookbook > D:\sql\Mysql_learning\backup.sql mysqldump 不是内部或外部命令,也不是可运行的程序 或批处理文…...
sudo apt update是什么意思呢?
非常好的问题! ✅ sudo apt update 是什么意思? 它的作用是: 更新你的 Ubuntu 系统中软件列表的信息(但不安装软件) 就像你每天先去超市了解今天上架了哪些新商品(只是“查看”而不是“买”)&a…...
.NET Core 中 Swagger 配置详解:常用配置与实战技巧
随着微服务架构和 RESTful API 的广泛应用,API 文档的管理和自动化生成成为了开发中的重要部分。Swagger(现为 OpenAPI)是一款功能强大的工具,它可以自动生成 API 文档,并提供交互式 UI,帮助开发者、测试人…...
spring cache使用指南
Spring cache Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现。 例如:EHCache,Caffeine,Redi…...
9.DMA
目录 DMA —为 CPU 减负 DMA 的简介和使用场景 DMA 的例子讲解 STM32 的 DMA 框图和主要特性 编辑 DMA 的通道的对应通道外设 – DMA 和哪些外设使用 编辑编辑ADC_DR 寄存器地址的计算 常见的数据滤波方法 ADCDMA 的编程 DMA —为 CPU 减负 DMA 的简介和使用场…...
Python自学笔记3 常见运算符
常用运算符 加减法 python的自动数据类型转换 整形转为浮点型 实数转为复数 数字类型不能和浮点数类型相加减 乘除法 数据转换基本同加减法, 但字符串可以和整数相加减,作用是字符串的自我复制 反斜杠 成员运算符 判断一个元素是不是一个序列的成员…...
【C/C++】C++中constexpr与const的深度对比
文章目录 C中constexpr与const的深度对比1. 编译期确定性2. 更严格的优化保证3. 适用范围更广4. 类型安全与错误检查5. 现代 C 的演进方向何时使用 const?constexpr应用场景1. 配置常量与全局参数2. 数据验证与业务规则检查3. 数学计算与业务逻辑优化4. 模板元编程与…...
劳特巴赫trace32负载率测试
按照下图步骤点击即可...
牛客OJ在线编程常见输入输出练习--Java版
目录 一、链接 二、题目 一、链接 牛客输入输出链接:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 二、题目 1.只有输出 public class Main {public static void main(String[] args) {System.out.println("H…...
STM32 | FreeRTOS 递归信号量
递归信号量 一、概述 互斥量的使用比较单一,因为它是信号量的一种,并且它是以锁的形式存在。在初始化的时候,互斥量处于开锁的状态,而被任务持有的时候则立刻转为闭锁的状态。 递归类型的互斥量可以被拥有者重复获取。拥有互斥量…...
STM32 | 软件定时器
01 一、概述 软件定时器是用程序模拟出来的定时器,可以由一个硬件定时器模拟出成千上万个软件定时器,这样程序在需要使用较多定时器的时候就不会受限于硬件资源的不足,这是软件定时器的一个优点,即数量不受限制。但由于软件定…...