大家好,我是何三,80后老猿,独立开发者
今天我要分享一个令人兴奋的技术突破——如何让你的FastAPI应用摇身一变成为MCP服务器,为大型语言模型(LLM)提供访问私有数据和执行特定操作的能力。这项技术由Anthropic公司设计,堪称大模型领域的"USB接口",将彻底改变我们与AI交互的方式。
什么是MCP?为什么它如此重要?
MCP(Model Context Protocol)是Anthropic公司设计的一项标准协议,用于规范大模型与外部系统的对接方式。简单来说,它就像硬件领域的USB或Type-C接口,为AI大脑提供了连接"手脚"的标准方式。
当前大模型面临的最大限制是什么?它们拥有强大的"大脑",但缺乏"手脚"——无法直接访问企业内部或个人私有数据,也无法执行具体操作。比如,大模型连发邮件这样简单的任务都完成不了,因为它无法获取你的邮箱账号和密码。
MCP协议的出现完美解决了这个问题。通过MCP,大模型可以: - 访问浏览器 - 操作数据库 - 控制鼠标键盘 - 与机器人交互 - 执行各种原本无法完成的任务
FastAPI与MCP的完美结合
FastAPI作为Python生态中最受欢迎的现代Web框架之一,以其高性能、易用性和强大的类型提示系统著称。现在,我们可以将FastAPI应用轻松转换为MCP服务器,为大模型提供丰富的API服务。
FastAPI的核心优势
在深入MCP集成前,让我们快速回顾FastAPI的主要特性: 1. 高性能:基于Starlette和Pydantic,性能媲美NodeJS和Go 2. 异步支持:原生支持async/await,轻松处理高并发 3. 自动文档:自动生成Swagger UI和ReDoc文档 4. 数据验证:利用Pydantic进行强大的输入数据验证 5. 依赖注入:灵活处理认证、数据库连接等依赖项 6. 类型提示:提高代码可读性和开发效率
这些特性使FastAPI成为构建MCP服务器的理想选择。
实战:将FastAPI应用转为MCP服务器
下面我将通过一个完整示例,展示如何将FastAPI应用改造为MCP服务器。这个示例将允许大模型查询服务器上的桌面文件列表。
环境准备
首先安装必要的依赖:
pip install fastapi uvicorn mcp
创建FastAPI-MCP服务器
新建一个file_server.py
文件,添加以下代码:
import os
from fastapi import FastAPI
from mcp.server.fastmcp import FastMCP
app = FastAPI()
mcp = FastMCP(app) # 将FastAPI应用包装为MCP服务器
@mcp.tool()
def get_desktop_files():
"""获取桌面上的文件列表"""
return os.listdir(os.path.expanduser("~/Desktop"))
@app.get("/")
async def root():
return {"message": "FastAPI-MCP Server is running!"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
这段代码做了几件重要的事情:
1. 创建标准的FastAPI应用
2. 使用FastMCP
包装器将应用转为MCP服务器
3. 通过@mcp.tool()
装饰器暴露get_desktop_files
函数给MCP客户端
4. 保留了FastAPI原有的路由功能
配置MCP客户端
在Cursor等支持MCP的客户端中,我们需要配置MCP服务器连接。编辑MCP配置文件(通常是mcp.json
):
{
"mcpServers": {
"desktopfiles": {
"command": "python file_server.py"
}
}
}
测试MCP功能
启动服务器后,在支持MCP的客户端(如Cursor)中,你可以直接询问: "我的桌面上有哪些文件?"
客户端会自动发现MCP服务器提供的get_desktop_files
工具,并调用它获取结果。
进阶:构建更强大的MCP服务
上面的例子展示了基础功能,现在我们来看一个更复杂的示例,结合FastAPI的异步特性和MCP的强大能力。
异步数据库查询示例
from fastapi import FastAPI
from mcp.server.fastmcp import FastMCP
from typing import List
from pydantic import BaseModel
import asyncpg
app = FastAPI()
mcp = FastMCP(app)
class User(BaseModel):
id: int
name: str
email: str
# 模拟数据库连接池
async def get_db_pool():
return await asyncpg.create_pool(
user="your_user",
password="your_password",
database="your_db",
host="localhost"
)
@mcp.tool()
async def query_users_by_department(department: str) -> List[User]:
"""根据部门查询用户列表
Args:
department: 部门名称,如'技术部'、'市场部'
"""
pool = await get_db_pool()
async with pool.acquire() as conn:
rows = await conn.fetch(
"SELECT id, name, email FROM users WHERE department = $1",
department
)
return [User(**row) for row in rows]
@app.get("/users/{department}")
async def get_users(department: str):
users = await query_users_by_department(department)
return {"users": users}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
这个示例展示了: 1. 使用FastAPI的异步特性执行数据库查询 2. 通过Pydantic模型确保数据格式 3. 同时提供MCP接口和传统REST API 4. 详细的文档字符串帮助大模型理解接口用途
MCP开发最佳实践
根据我的经验,开发MCP服务时应注意以下几点:
-
详尽的文档字符串:MCP服务的备注是给大模型看的,它通过备注理解接口功能。未来程序员写备注将成为重要工作。
-
清晰的类型提示:充分利用Python的类型提示和Pydantic模型,帮助MCP客户端理解数据结构。
-
错误处理:为MCP工具提供友好的错误消息,帮助大模型理解问题所在。
-
安全性:特别注意权限控制,确保MCP接口不会暴露敏感数据或执行危险操作。
-
性能优化:对于耗时操作,考虑使用FastAPI的
BackgroundTasks
或异步执行。
应用场景展望
FastAPI-MCP组合的应用场景极为广泛:
- 企业知识库访问:让大模型安全查询企业内部文档
- 个人数据助理:管理日程、邮件、笔记等个人数据
- 开发助手:直接与开发环境交互,执行代码、调试等任务
- 自动化办公:处理Excel、Word等办公文档
- 物联网控制:通过MCP控制智能家居设备
总结
将FastAPI应用转为MCP服务器是一个简单而强大的技术方案,它能够:
- 利用现有FastAPI基础设施快速构建MCP服务
- 同时支持传统API和MCP接口
- 充分发挥FastAPI的高性能和异步优势
- 通过类型提示和Pydantic确保数据一致性
- 为大型语言模型提供安全可控的私有数据访问能力
随着MCP标准的普及,我们正站在一个新时代的门槛上——AI将不再是被隔离的"大脑",而是能够与现实世界深度交互的智能助手。而FastAPI-MCP的组合,无疑将成为这一变革中的重要技术栈。
如果你对FastAPI-MCP集成有更多问题,或者想分享你的使用经验,欢迎在评论区留言讨论!
🔥 福利时间:关注公众号【何三笔记】,后台回复关键词「20250217」,即可免费领取《清华大学出品DeepSeek使用精髓》系列资料:
- 【清华大学第一版】DeepSeek从入门到精通.pdf
- 【清华大学第二版】DeepSeek赋能职场.pdf
- 【清华大学第三版】普通人如何抓住DeepSeek红利.pdf
- 【清华大学第四版】DeepSeek+DeepResearch:让科研像聊天一样简单.pdf
- 【清华大学第五版】DeepSeek与AI幻觉.pdf