关于 FastAPI MCP Server + LangChain Client Example
这是一个将 FastAPI 路由转换为 MCP 工具并附带 LangChain Agent 客户端的示例项目,适合学习如何向 MCP 客户端开放 API 并测试工具发现与调用。
主要功能
- 01将 FastAPI 路由公开为工具
- 02通过 HTTP/SSE 发现工具
- 03运行示例 LangChain Agent
- 04配置 Cursor 作为 MCP 客户端
适用场景
- 01试做支持 MCP 的 FastAPI 应用
- 02测试基于路由的工具发现
- 03通过 LangChain Agent 调用工具
MCP 相关
服务端在 `/mcp` 暴露 FastAPI 端点作为 MCP 工具。附带的 LangChain 客户端通过 HTTP/SSE 发现并调用工具,Cursor 也可作为 MCP 客户端连接。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
FastAPI MCP 服务 + LangChain 客户端示例
本示例项目演示如何使用
fastapi-mcp将 FastAPI 端点公开为模型上下文协议(MCP)工具。还包含一个基础的 LangChain Agent(langchain_client.py),它使用langchain-mcp-adapters通过 HTTP/SSE 连接到本地 FastAPI 服务,以发现和使用已公开的工具。
先决条件
开始之前,请确保已安装以下内容:
- Python: 建议使用 3.10 或更高版本。
uv: 本项目使用的 Python 包管理器。(安装说明)- Node.js 和 npm:
npx所需(用于运行可选的 MCP Inspector)。你可以从 nodejs.org 下载 Node.js(其中包含 npm)。 - Git: 用于克隆仓库。
- OpenAI API 密钥: LangChain 客户端示例所需。你需要在
.env文件中设置此密钥。
本项目演示如何设置基础的 FastAPI 应用,并使用 fastapi-mcp 库将其端点公开为模型上下文协议(MCP)工具。项目还包含一个 LangChain Agent 客户端,用于连接并使用这些工具,并介绍如何配置 Cursor 进行连接。
开始使用 / 如何运行
-
克隆仓库:
git clone <your-repo-url> cd <repo-directory> -
安装
uv: 如果尚未安装,请安装uv包管理器(命令见下文的项目设置)。 -
设置环境并安装依赖项:
uv init # If pyproject.toml doesn't exist uv venv # Create virtual environment (.venv) # Install all project dependencies uv pip install fastapi "uvicorn[standard]" fastapi-mcp langchain-mcp-adapters langgraph langchain-openai python-dotenv -
创建
.env文件: 在项目根目录中创建名为.env的文件,并添加你的 OpenAI API 密钥:OPENAI_API_KEY=your_openai_api_key_here -
运行 FastAPI MCP 服务: 打开终端并运行:
uvicorn main:app --reload --port 8000保持此终端处于运行状态。 (或者,你可以在 VS Code / Cursor 中使用
.vscode/launch.json里定义的Python: FastAPI MCP调试配置,在附加调试器的情况下运行服务。) -
运行 LangChain 客户端: 打开_第二个_终端并运行:
uv run python langchain_client.py客户端将连接到服务、发现工具,并使用 Agent 运行查询。
-
(可选)使用 MCP Inspector 测试服务: 运行 LangChain 客户端之前,或者进行更直接的测试时,可以使用官方 MCP Inspector 工具:
- 确保 FastAPI 服务正在运行(步骤 5)。
- 打开另一个终端并运行:
npx @modelcontextprotocol/inspector(npx随 Node.js/npm 一同提供。如果此命令失败,请确保已安装 Node.js,并且可通过 PATH 访问。) - 在 Inspector 界面中,连接到你的服务 URL:
http://127.0.0.1:8000/mcp - 转到“Tools”,点击“List Tools”以查看
read_root__get和greet_user_greet__name__get。 - 选择一个工具,填写参数(例如,greet_user 的
name),然后点击“Run Tool”。
-
(可选)使用 LangChain 客户端测试
greet_user:greet_user端点及langchain_client.py中对应的测试查询(query2)目前处于启用状态。只需运行 LangChain 客户端(步骤 6),并观察执行的第二部分;此处应会尝试向用户 'LangChain' 问好。- (如果想禁用此测试,请注释掉
main.py中的@app.get("/greet/{name}")端点,以及langchain_client.py中的query2部分。)
- (如果想禁用此测试,请注释掉
目标
构建一个具备 MCP 能力的简单 FastAPI 服务,用于学习和测试,可在本地运行,并可连接到 Cursor 编辑器中的 Agent 等 MCP 客户端。
项目设置
- 包管理器: 我们使用了
uv,这是一个用 Rust 编写、速度很快的 Python 包安装和解析工具。- 安装(Windows PowerShell):
irm https://astral.sh/uv/install.ps1 | iex - 初始化项目:
uv init(创建pyproject.toml) - 虚拟环境:
uv venv(创建并管理.venv)
- 安装(Windows PowerShell):
- 依赖项: 使用
uv安装:
这会将 FastAPI、Uvicorn ASGI 服务、# 开发期间使用的具体命令(已包含在“开始使用”部分的合并安装命令中): # uv pip install fastapi "uvicorn[standard]" fastapi-mcp # uv pip install langchain-mcp-adapters langgraph langchain-openai python-dotenvfastapi-mcp、LangChain 组件和python-dotenv安装到.venv虚拟环境中。
应用(main.py)
创建了一个包含以下端点的简单 FastAPI 应用:
/:返回欢迎消息。/greet/{name}:返回个性化问候语(目前已注释掉)。
重要的是,fastapi-mcp 集成是在 FastAPI 路由定义之后完成的:
from fastapi import FastAPI
from fastapi_mcp import FastApiMCP
app = FastAPI(...)
# --- Define FastAPI routes (@app.get, @app.post, etc.) ---
@app.get("/")
async def read_root():
# ... endpoint logic ...
# --- Initialize and mount fastapi-mcp AFTER routes ---
mcp = FastApiMCP(app)
mcp.mount() # Exposes tools under /mcp by default
运行服务
- 直接运行:
uvicorn main:app --reload --port 8000 - 使用调试器(Cursor/VS Code): 在
.vscode中创建了launch.json文件,以便在调试器附加的情况下运行应用。
LangChain 客户端(langchain_client.py)
- 从
.env文件读取OPENAI_API_KEY。 - 使用
langchain-mcp-adapters(MultiServerMCPClient)通过 SSE 连接到运行中的 FastAPI 服务http://127.0.0.1:8000/mcp。 - 自动发现 MCP 服务公开的工具。
- 使用发现的工具和 OpenAI LLM 创建 LangGraph ReAct Agent。
- 通过 Agent 运行示例查询。
Cursor 集成(MCP 客户端)
- 配置: 在项目根目录中创建了
.cursor/mcp.json文件:{ "mcpServers": { "local-fastapi-mcp": { "url": "http://127.0.0.1:8000/mcp" } } } - 启用: 需要在 Cursor 设置中启用服务(按 Ctrl+,搜索“Cursor Settings”,然后转到“MCP”选项卡)。
- 使用: 随后可以在聊天面板中要求 Cursor Agent 使用发现的工具。
重要经验
uv基础用法:uv init、uv venv和uv pip install可快速设置 Python 项目环境。fastapi-mcp初始化顺序: 必须在定义 FastAPI 路由(如@app.get)之后创建FastApiMCP(app)实例并调用mcp.mount(),这些路由才会作为工具公开。否则将无法发现这些工具。- 端口冲突: 后台进程(如
uvicorn)可能会占用端口。在 Windows 上,可以使用netstat -ano | findstr "<PORT>"查找进程 ID(PID),并使用taskkill /F /PID <PID>终止进程。有时需要稍等片刻或重启 IDE,操作系统才能完全释放端口。 - Cursor MCP 配置: 在
.cursor/mcp.json中使用url键,可将 Cursor 连接到基于 HTTP 的 MCP 服务(例如fastapi-mcp提供的服务)。 - Agent 工具调用: Cursor Agent 通常会使用已配置的 MCP 服务;而专用的结对编程 AI 助手会通过自动生成的内部名称(例如
mcp_local-fastapi-mcp_read_root__get)与这些服务交互,而不是使用通用的工具调用函数。建立连接并发现工具后,在聊天中明确要求 Agent“使用该工具……”即可。
深入探索与功能(摘自 fastapi-mcp 文档)
本节概述了 fastapi-mcp 文档中的功能和概念。我们尚未实现这些内容,但了解它们会很有帮助。
身份验证与授权
fastapi-mcp 支持使用 FastAPI 依赖项进行身份验证,也支持 OAuth 2。
基本令牌透传:
-
初始阶段无需特殊的服务配置。
-
MCP 客户端需要发送
Authorization标头。通常可以通过mcp-remote之类的桥接工具来实现:{ "mcpServers": { "remote-example": { "command": "npx", "args": [ "mcp-remote", "http://localhost:8000/mcp", "--header", "Authorization:${AUTH_HEADER}" ] }, "env": { "AUTH_HEADER": "Bearer <your-token>" } } } -
若要在 MCP 服务端_要求_身份验证,请向
AuthConfig添加依赖项:from fastapi import Depends from fastapi_mcp import FastApiMCP, AuthConfig # Assuming verify_auth is your FastAPI dependency that checks the token mcp = FastApiMCP( app, auth_config=AuthConfig( dependencies=[Depends(verify_auth)], ), )
OAuth 2 流程:
- 完整支持 OAuth 2(MCP 规范 2025-03-26)。
- 需要为
AuthConfig配置提供方详细信息(发行方、URL、客户端 ID/密钥)。 - 通常需要设置
setup_proxies=True,以处理标准 OAuth 提供方与 MCP 客户端预期之间的不兼容情况(例如缺少动态注册、范围处理方式不同)。mcp = FastApiMCP( app, auth_config=AuthConfig( issuer=f"https://auth.example.com/", authorize_url=f"https://auth.example.com/authorize", oauth_metadata_url=f"https://auth.example.com/.well-known/oauth-authorization-server", audience="my-audience", client_id="my-client-id", client_secret="my-client-secret", dependencies=[Depends(verify_auth)], setup_proxies=True, # Creates compatibility endpoints ), ) - 使用
mcp-remote通常需要指定固定端口(mcp-remote ... 8080),以便在 OAuth 提供方中配置回调 URL(http://127.0.0.1:8080/oauth/callback)。
工具命名
- MCP 工具名称源自 FastAPI 路由的
operation_id。 - 如果未指定,FastAPI 会自动生成一个(例如
read_user_users__user_id__get)。 - 建议在 FastAPI 路由上设置明确的
operation_id,以使 MCP 工具名称更清晰:@app.get("/users/{user_id}", operation_id="get_user_info") async def read_user(user_id: int): # ...
刷新工具
-
如果在调用
mcp.mount()_之后_添加 FastAPI 路由,这些路由不会自动包含在内。 -
解决方法:定义新路由后再次调用
mcp.setup_server()。app = FastAPI() mcp = FastApiMCP(app) mcp.mount() @app.get("/new/endpoint", operation_id="new_tool") async def new_endpoint(): ... # Refresh the tools mcp.setup_server()
测试
- 可以使用
@modelcontextprotocol/inspector工具测试 MCP 服务:# Run the inspector npx @modelcontextprotocol/inspector # Connect to your server URL (e.g., http://127.0.0.1:8000/mcp) # Use the UI to list and run tools.
部署
-
可以将从一个 FastAPI 应用(
api_app)创建的 MCP 服务挂载到_另一个_FastAPI 应用(mcp_app),以便分开部署:api_app = FastAPI() # ... define API endpoints ... mcp_app = FastAPI() mcp = FastApiMCP(api_app) # Create from api_app mcp.mount(mcp_app) # Mount onto mcp_app # Run separately: # uvicorn main:api_app --port 8001 # uvicorn main:mcp_app --port 8000
自定义
- 可在初始化
FastApiMCP时设置服务名称/描述:mcp = FastApiMCP( app, name="My Custom MCP Name", description="Description for the server." ) - 可自定义工具/架构描述(例如,包含所有可能的响应):
mcp = FastApiMCP( app, describe_all_responses=True, describe_full_response_schema=True ) - 可在初始化
FastApiMCP时使用include_operations、exclude_operations、include_tags、exclude_tags筛选公开的端点。
致谢
本项目在 AI 结对编程工具的协助下开发完成,其中包括集成在 Cursor 中的 Google Gemini 模型,以及用于研究和检索文档的 OpenAI ChatGPT。这些工具在整个过程中发挥了不可或缺的作用。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。
