在用Gradio开发个MCP Client 最后介绍了基于Gradio chatbot的MCP 客户端,今天会继续使用它。
另外今天介绍一种MCP Server的实现,不同于只改一行代码让你的Gradio应用秒变MCP Server的方法,借助了FastAPI-MCP轻松将FastAPI 端点转为MCP。
FastAPI-MCP
将您的FastAPI端点作为模型上下文协议(MCP)工具公开,并附带认证功能!
功能特性
• 内置认证:直接复用您现有的 FastAPI 依赖项! • 原生 FastAPI 支持:不仅仅是 OpenAPI → MCP 的转换工具 • 零配置/极简配置:只需指向您的 FastAPI 应用,即可自动运行 • 保留模型结构:完整支持请求模型与响应模型的 Schema • 文档无缝迁移:所有端点的说明文档(如 Swagger 所示)均会保留 • 灵活部署:可将 MCP 服务挂载到现有应用,或独立部署 • ASGI 通信:直接基于 FastAPI 的 ASGI 接口实现高效数据传输
安装
pip install fastapi-mcp
todo.py
# fastapi version todo
from datetime import datetime
from typing importList, Optional
from uuid import UUID, uuid4
from fastapi import FastAPI, HTTPException, status
from fastapi.middleware.cors import CORSMiddleware
from fastapi_mcp import FastApiMCP
from pydantic import BaseModel
app = FastAPI(title="Todo API")
# Enable CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Todo model
classTodoCreate(BaseModel):
title: str
description: Optional[str] = None
completed: bool = False
classTodo(TodoCreate):
id: UUID
created_at: datetime
updated_at: datetime
# In-memory database
todos = []
@app.post("/todos/", response_model=Todo, status_code=status.HTTP_201_CREATED)
asyncdefcreate_todo(todo: TodoCreate):
"""Create a new todo item"""
new_todo = Todo(
id=uuid4(),
created_at=datetime.now(),
updated_at=datetime.now(),
**todo.model_dump(),
)
todos.append(new_todo)
return new_todo
@app.get("/todos/", response_model=List[Todo])
asyncdefget_todos():
"""Get all todo items"""
return todos
@app.get("/todos/{todo_id}", response_model=Todo)
asyncdefget_todo(todo_id: UUID):
"""Get a specific todo item by ID"""
for todo in todos:
if todo.id == todo_id:
return todo
raise HTTPException(status_code=404, detail="Todo not found")
@app.put("/todos/{todo_id}", response_model=Todo)
asyncdefupdate_todo(todo_id: UUID, todo_update: TodoCreate):
"""Update a todo item"""
for i, todo inenumerate(todos):
if todo.id == todo_id:
updated_todo = Todo(
id=todo.id,
created_at=todo.created_at,
updated_at=datetime.now(),
**todo_update.model_dump(),
)
todos[i] = updated_todo
return updated_todo
raise HTTPException(status_code=404, detail="Todo not found")
@app.delete("/todos/{todo_id}", status_code=status.HTTP_204_NO_CONTENT)
asyncdefdelete_todo(todo_id: UUID):
"""Delete a todo item"""
for i, todo inenumerate(todos):
if todo.id == todo_id:
todos.pop(i)
return
raise HTTPException(status_code=404, detail="Todo not found")
# Add MCP server
mcp = FastApiMCP(app, name="Todo API MCP", description="MCP server for Todo API")
mcp.mount()
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
上面代码由AI生成,仅供演示需要, 从上面代码可以看到, 就是在FastAPI版本的todo CRUD的基础上增加了转MCP的代码,
from fastapi_mcp import FastApiMCP
# Add MCP server
mcp = FastApiMCP(app, name="Todo API MCP", description="MCP server for Todo API")
mcp.mount()
就是说最小只需要四行就可以轻松把一个FastAPI实现的API 转为MCP Server。
视频演示效果
结论
• FastAPI-MCP 让开发MCP Server更轻松 • 基于Gradio 聊天机器人的MCP客户端更好用 • 多个MCP 工具协调变得非常方便
文章转载自alitrack,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




