暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

借助MCP,在聊天框里轻松实现增删改查

alitrack 2025-05-19
154

 

用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 importListOptional
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论