Doramagic 项目包 · 项目说明书
fastapi_mcp 项目
将你的 FastAPI 端点作为 Model Context Protocol(MCP)工具对外暴露,并支持鉴权!
Overview and Getting Started
FastAPI-MCP 是一个将 FastAPI 应用自动转换为 Model Context Protocol (MCP) 服务器的扩展库。它并非简单的 OpenAPI → MCP 转换器,而是作为 FastAPI 的原生扩展深度集成,能够在不分离服务的前提下把 FastAPI 端点暴露为 MCP 工具,并复用 FastAPI 现有的依赖注入、鉴权与文档。资料来源:READ...
继续阅读本节完整说明和来源证据。
项目概述
FastAPI-MCP 是一个将 FastAPI 应用自动转换为 Model Context Protocol (MCP) 服务器的扩展库。它并非简单的 OpenAPI → MCP 转换器,而是作为 FastAPI 的原生扩展深度集成,能够在不分离服务的前提下把 FastAPI 端点暴露为 MCP 工具,并复用 FastAPI 现有的依赖注入、鉴权与文档。资料来源:README.md:25-35
库的对外公共入口位于 fastapi_mcp/__init__.py,导出三个核心符号:FastApiMCP、AuthConfig 与 OAuthMetadata。版本号通过 importlib.metadata.version("fastapi-mcp") 动态读取,本地开发时回退到 0.0.0.dev0。资料来源:fastapi_mcp/__init__.py:1-22
核心特性
- 认证内建:可直接复用 FastAPI 的
Depends()依赖对 MCP 端点进行鉴权。资料来源:README.md:42-50 - FastAPI 原生:通过 ASGI 接口与同一进程内的 FastAPI 通信,避免 MCP → API 的额外 HTTP 跳数。资料来源:README.md:62-70
- 零/极简配置:仅需传入
FastAPI实例即可工作。 - 保留模式与文档:请求/响应 Pydantic 模型与 Swagger 文档会透传至 MCP 工具描述。
- 灵活部署:可挂载于同一应用,也可独立部署(参见
examples/04_separate_server_example.py)。
FastApiMCP 构造器支持以下参数(节选自 fastapi_mcp/server.py):
| 参数 | 类型 | 默认值 / 说明 |
|---|---|---|
fastapi | FastAPI | 必填,源 FastAPI 应用 |
name / description | Optional[str] | 默认取 app.title / app.description |
describe_all_responses | bool | False:是否列出全部响应模式 |
describe_full_response_schema | bool | False:是否展开为完整 JSON Schema |
http_client | Optional[httpx.AsyncClient] | 自定义调用客户端 |
include_operations / exclude_operations | Optional[List[str]] | 按 operationId 过滤(互斥) |
include_tags / exclude_tags | Optional[List[str]] | 按 tag 过滤(互斥) |
auth_config | Optional[AuthConfig] | MCP 认证配置 |
headers | List[str] | ["authorization"]:HTTP 头透传白名单 |
资料来源:fastapi_mcp/server.py:21-95
安装与要求
- Python 3.10+(推荐 3.12)。资料来源:README.md:84-86
- 包管理与开发工具:uv。
- 项目遵循 SemVer,贡献流程详见
CONTRIBUTING.md。资料来源:CONTRIBUTING.md:9-20
快速开始
最小化集成模式(参考 examples/01_basic_usage_example.py):
from fastapi import FastAPI
from fastapi_mcp import FastApiMCP
app = FastAPI()
# ... 在此处定义路由与 Pydantic 模型 ...
mcp = FastApiMCP(app)
mcp.mount_http() # v0.4.0+ 推荐使用 Streamable HTTP
examples/ 目录提供了 7 个示例脚本,覆盖基础用法、模式描述定制、端点过滤、独立部署、运行时再注册、自定义 MCP 路由器与 HTTP 超时配置等场景。资料来源:examples/README.md:1-10
架构与数据流
工具的生成与执行主流程如下:
flowchart LR
A[FastAPI App] --> B[get_openapi]
B --> C[resolve_schema_references]
C --> D[convert_openapi_to_mcp_tools]
D --> E[MCP Tool List + operation_map]
E --> F[Tool Call 请求]
F --> G[path / query / body 组装]
G --> H[httpx / ASGI 调用]
H --> Aconvert_openapi_to_mcp_tools 在 fastapi_mcp/openapi/convert.py 中实现:先通过 resolve_schema_references 解析所有 $ref 引用,再按 HTTP 方法(get/post/put/delete/patch)生成 mcp.types.Tool 与 operation_map;执行阶段根据 operation_map 把参数分发到 path / query / header / body,最终调用 FastApiMCP.__call__ 发起请求。资料来源:fastapi_mcp/openapi/convert.py:9-30
辅助函数 clean_schema_for_display 会从展示用的 Schema 中移除 allOf、anyOf、oneOf、nullable、discriminator、readOnly、writeOnly、xml、externalDocs 等对 LLM 帮助不大的字段。OAuth 元数据遵循 RFC 8414,由 fastapi_mcp/types.py 中定义的 OAuthMetadata 模型承载,并在 fastapi_mcp/auth/proxy.py 中通过代理或自定义方式对外暴露。资料来源:fastapi_mcp/types.py:23-65
已知问题与社区反馈
v0.4.0 引入 Streamable HTTP 传输并弃用旧的 mount() 方法,建议迁移到 mount_http() 或保留 mount_sse()。资料来源:CHANGELOG.md:9-18
社区报告的典型问题(与本概览相关):
- 自引用
$ref触发RecursionError:递归 Pydantic 模型在resolve_schema_references()中崩溃(Issue #287)。 Optional[List[X]]模式被破坏:clean_schema_for_display()删除anyOf后未提升items,导致{type:"array"}不合法(Issue #304)。mount_http()未触发 lifespan:与 FastAPI lifespan 上下文管理器交互异常(Issue #256)。- 多 Worker 会话 404:Stateful Session 需共享会话存储才能跨进程工作(Issue #208、#189)。
- Union 模式失真:Python
set顺序不确定,使投影出的type字段被随机选中(Issue #307)。
See Also
System Architecture and Transport Layer
fastapimcp 是一个将 FastAPI 应用自动暴露为 Model Context Protocol (MCP) 工具服务器的开源库。其核心设计理念是 FastAPI-first:将 MCP 服务器视为 FastAPI 应用的原生扩展,而非一个独立的 OpenAPI → MCP 转换器。该库通过 ASGI 接口直接与 FastAPI 应用通信,避免了外部 HTTP ...
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述与设计目标
fastapi_mcp 是一个将 FastAPI 应用自动暴露为 Model Context Protocol (MCP) 工具服务器的开源库。其核心设计理念是 FastAPI-first:将 MCP 服务器视为 FastAPI 应用的原生扩展,而非一个独立的 OpenAPI → MCP 转换器。该库通过 ASGI 接口直接与 FastAPI 应用通信,避免了外部 HTTP 调用带来的额外开销 资料来源:README.md。
FastApiMCP 类是整个库的入口。它接收一个 FastAPI 实例,自动从 OpenAPI schema 中提取端点并转换为 MCP tools,同时支持灵活的部署模式(挂载到同一应用或独立部署)。0.4.0 版本引入了 Streamable HTTP 传输,并废弃了旧的 mount() 方法 资料来源:CHANGELOG.md。
系统架构
下图展示了 fastapi_mcp 的核心组件及其相互关系:
graph TB
A[FastAPI App] -->|get_openapi| B[OpenAPI Schema]
B --> C[convert_openapi_to_mcp_tools]
C --> D[operation_map: tools]
E[MCP Client / LLM] -->|HTTP / SSE| F[Transport Layer]
F --> G[FastApiMCP Server]
G -->|tool invocation| H[Tool Dispatcher]
H -->|path/query/header/body params| I[ASGI Transport]
I -->|direct call| A
G -->|OAuth metadata| J[Auth Proxy]
J -->|custom provider| K[OAuth Provider]
F --> F1[mount_http: Streamable HTTP]
F --> F2[mount_sse: SSE legacy]
style F1 fill:#90EE90
style F2 fill:#FFB6C1整个系统由以下几层组成:
- Schema 转换层:
fastapi_mcp/openapi/模块负责将 FastAPI 的 OpenAPI schema 转换为 MCP 工具描述。其中convert.py中的convert_openapi_to_mcp_tools会遍历每个 operation,生成工具的描述、参数(path/query/header/body)以及响应 schema 资料来源:fastapi_mcp/openapi/convert.py。utils.py中的resolve_schema_references与clean_schema_for_display用于解析$ref与清理对 LLM 不友好的内部字段 资料来源:fastapi_mcp/openapi/utils.py。 - 传输层(Transport Layer):由
fastapi_mcp/transport/包提供,包括 HTTP 与 SSE 两种实现。__init__.py暴露FastApiHttpSessionManager(HTTP)与FastApiSseTransport(SSE)供FastApiMCP内部使用 资料来源:fastapi_mcp/__init__.py。 - 服务器核心(
FastApiMCP):作为 FastAPI 子应用挂载,接收 MCP 请求并通过operation_map查找对应端点。call_tool方法会从 arguments 中提取 path/query/header 参数并替换到 URL 模板中,然后调用下游 FastAPI 端点 资料来源:fastapi_mcp/server.py。 - 认证代理层:
fastapi_mcp/auth/proxy.py实现 OAuth 2.1 metadata 代理,可选择自定义 metadata 或代理到上游 OAuth provider 资料来源:fastapi_mcp/auth/proxy.py。
传输层详解
Streamable HTTP 传输(推荐)
mount_http() 方法实现了 MCP Streamable HTTP 规范 资料来源:CHANGELOG.md。FastApiHttpSessionManager 负责管理有状态的 HTTP 会话(0.4.0 引入 Stateful Session Management)。用户可通过 auth_config 参数提供 AuthConfig,库会自动注册 OAuth metadata endpoint 资料来源:fastapi_mcp/auth/proxy.py。
SSE 传输(向后兼容)
mount_sse() 方法保留了对旧 MCP 客户端的支持。FastApiSseTransport 实现了 Server-Sent Events 协议,但社区已经多次反映 SSE 在新版 MCP 规范中被弃用(参见 Issue #133 与 Issue #61)。当前 SSE 仍可用,但官方强烈推荐迁移到 HTTP 传输。
头部转发与 ASGI 通信
FastApiMCP.__init__ 中的 headers 参数(默认 ["authorization"])定义了一个白名单,只有列表中的 HTTP 头部会被从 MCP 请求转发到下游 API 调用 资料来源:fastapi_mcp/server.py。底层通过 ASGI transport 直接调用 FastAPI 应用,不发起外部 HTTP 请求,从而获得最低延迟与最高安全性。
配置选项
下表列出 FastApiMCP 构造函数的主要参数(资料来源:fastapi_mcp/server.py):
| 参数 | 类型 | 默认值 | 作用 |
|---|---|---|---|
fastapi | FastAPI | — | 必填,要暴露的 FastAPI 应用 |
name | Optional[str] | app.title | MCP 服务器名 |
description | Optional[str] | app.description | MCP 服务器描述 |
describe_all_responses | bool | False | 是否在工具描述中包含全部响应 schema |
describe_full_response_schema | bool | False | 是否包含完整 JSON Schema 而非示例 |
http_client | Optional[httpx.AsyncClient] | None | 自定义 HTTP 客户端 |
include_operations | Optional[List[str]] | None | 仅暴露指定 operation ID |
exclude_operations | Optional[List[str]] | None | 排除指定 operation ID |
include_tags / exclude_tags | Optional[List[str]] | None | 按 tag 过滤 |
auth_config | Optional[AuthConfig] | None | OAuth 2.1 认证配置 |
headers | List[str] | ["authorization"] | 允许转发的 HTTP header 白名单 |
已知问题与注意事项
根据社区反馈(Issue #256),使用 mount_http() 时 FastAPI 的 lifespan 上下文管理器可能未被触发,部署到生产环境前应验证启动钩子。多 worker 部署下 HTTP 会话默认仅在进程内存储,会出现 Issue #189 中描述的"404 session not found"问题,社区正在投票是否引入共享 session store(Issue #208)。
此外,resolve_schema_references 在遇到自引用 Pydantic 模型时会触发 RecursionError(Issue #287),而 clean_schema_for_display 会剥离 anyOf 并丢失 Optional[List[X]] 的 items 字段(Issue #304)。使用复杂递归模型或可选列表类型时需注意这些边界情况。FastAPI 流式响应(StreamingResponse)目前不被支持(Issue #77)。
See Also
- Basic Usage Example — 基础集成示例
- Configure HTTP Timeout — HTTP 超时配置
- Custom MCP Router — 高级路由定制
- 官方文档站:fastapi-mcp.tadata.com
来源:https://github.com/tadata-org/fastapi_mcp / 项目说明书
Authentication and Authorization
FastAPI-MCP 在认证与授权方面采用"双轨制"设计:业务端点沿用 FastAPI 原生的 Depends() 依赖注入体系;面向 MCP 客户端的 OAuth 2.1 流程则由库内置的代理端点承担。该设计将"调用者是谁"与"调用者能做什么"两个关注点解耦,使开发者无需为 MCP 通道额外维护一套独立的身份验证基础设施。资料来源:[README.md:1-15]()。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
FastAPI-MCP 在认证与授权方面采用"双轨制"设计:业务端点沿用 FastAPI 原生的 Depends() 依赖注入体系;面向 MCP 客户端的 OAuth 2.1 流程则由库内置的代理端点承担。该设计将"调用者是谁"与"调用者能做什么"两个关注点解耦,使开发者无需为 MCP 通道额外维护一套独立的身份验证基础设施。资料来源:README.md:1-15。
库内认证相关能力主要由以下三部分组成:
| 模块 | 角色 |
|---|---|
FastApiMCP.__init__ 中的 auth_config / headers 参数 | 启用并配置 OAuth 2.1 流程,声明转发白名单 |
fastapi_mcp.auth.proxy | 注册 OAuth 元数据 / 授权 / 动态注册代理路由 |
fastapi_mcp.types.AuthConfig | 集中描述 OAuth 颁发者、客户端与作用域等参数 |
业务端点:FastAPI 原生认证
FastApiMCP 不在工具调用链路上"重新发明"身份验证。工具执行时通过 ASGI 传输直接进入原 FastAPI 应用,因此开发者既有的 Depends(get_current_user)、API Key Header 校验、Cookie 会话等机制都会被自动沿用。资料来源:README.md:1-10("Authentication built in, using your existing FastAPI dependencies!")。
在调用上下文中,库还提供 HTTPRequestInfo 用于向实际端点传递请求方法、路径、Header、Cookie 与查询参数,便于业务侧 Depends 还原原始请求。资料来源:fastapi_mcp/types.py:18-23。
通道端点:MCP OAuth 2.1 代理
触发条件
当用户在 FastApiMCP 构造时传入 auth_config 时,_setup_auth_2025_03_26 会被调用,依次按以下优先级挂载 OAuth 端点:资料来源:fastapi_mcp/server.py:137-178。
- 若
auth_config.custom_oauth_metadata存在,则通过setup_oauth_custom_metadata直接以静态元数据响应metadata_path。资料来源:fastapi_mcp/auth/proxy.py:60-86。 - 否则若
auth_config.setup_proxies为真,则同时挂载:元数据代理 (setup_oauth_metadata_proxy)、授权代理 (setup_oauth_authorize_proxy),并按需挂载"伪动态注册"端点 (setup_oauth_fake_dynamic_register_endpoint)。资料来源:fastapi_mcp/auth/proxy.py:88-180。
流程示意
sequenceDiagram
participant C as MCP Client (e.g. mcp-remote)
participant F as FastAPI / MCP App
participant P as OAuth Provider
C->>F: GET /.well-known/oauth-authorization-server
F-->>C: Proxied OAuthMetadata (RFC 8414)
C->>F: POST /oauth/register (可选)
F-->>C: Echo 预注册 client_id / secret
C->>F: GET /oauth/authorize
F->>P: 转发 authorize_url,附 audience / default_scope 兜底
P-->>C: 颁发 authorization_code
C->>F: 携带 Bearer Token 调用工具
F->>F: 通过 headers 白名单转发 Token 到原 FastAPI Depends`AuthConfig` 关键字段
下表汇总了 AuthConfig 的常用字段及其作用:资料来源:fastapi_mcp/types.py:80-180。
| 字段 | 含义 |
|---|---|
issuer | OAuth 颁发者标识,参与构造元数据 URL |
client_id / client_secret | 预注册的客户端凭据,回显给动态注册请求 |
authorize_url | 授权端点,授权代理将请求转发至此 |
audience | 客户端未携带 audience 时使用的兜底值 |
default_scope | 客户端未携带 scope 时使用的兜底值,修复 #123 |
metadata_path | 元数据端点路径,默认 /oauth-authorization-server |
setup_proxies | 是否启用内置代理端点 |
setup_fake_dynamic_register_endpoint | 是否回显预注册凭据以兼容 mcp-remote |
HTTP Header 转发与 `headers` 白名单
FastApiMCP.__init__ 提供 headers: List[str] = ["authorization"] 参数,作为"允许从 MCP 请求转发到底层 HTTP 调用"的 Header 白名单。"authorization" 默认即在白名单中,使 Bearer Token 能够直接落到 FastAPI 的 Depends 体系。资料来源:fastapi_mcp/server.py:55-66。
社区 Issue #181 引入了对 Header 转发的可配置能力,v0.3.6 起该参数被正式暴露。资料来源:CHANGELOG.md:30-35。
典型用法:Auth0 集成
examples/09_auth_example_auth0.py 演示了与 Auth0 集成的端到端流程:通过 BaseSettings 读取 AUTH0_DOMAIN / AUTH0_AUDIENCE / AUTH0_CLIENT_ID / AUTH0_CLIENT_SECRET,构造 auth0_jwks_url 与 auth0_oauth_metadata_url,并在 lifespan 中预取 JWKS 公钥以供业务依赖使用。资料来源:examples/09_auth_example_auth0.py:1-60。
常见注意事项
include_operations/exclude_operations、include_tags/exclude_tags互斥校验会在auth_config之前抛出ValueError,需注意初始化顺序。资料来源:fastapi_mcp/server.py:68-78。- 多 worker 部署时,会话存储默认位于进程内(参考 Issue #208 / #189);如需跨实例共享会话,应引入外部会话存储后再启用有状态 HTTP 传输。资料来源:CHANGELOG.md:1-15`。
- v0.4.0 起
mount()已弃用,新代码应使用mount_http(),避免 OAuth 端点挂载在错误的传输之上。资料来源:CHANGELOG.md:5-15。
参见
- Transport 选型与多 worker 部署
- OpenAPI 转换与工具描述
- 示例索引(
examples/README.md)
来源:https://github.com/tadata-org/fastapi_mcp / 项目说明书
Schema Conversion and Advanced Configuration
fastapimcp 的核心职责之一是将 FastAPI 自动生成的 OpenAPI 文档转换为 MCP(Model Context Protocol)工具,从而允许大语言模型客户端发现并调用这些端点。该转换过程涵盖 schema 引用解析、显示用 schema 清洗、参数类型推断以及示例生成等多个阶段,并由 FastApiMCP 构造器暴露的高级配置项控制最终输出形态(资...
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述与目标
fastapi_mcp 的核心职责之一是将 FastAPI 自动生成的 OpenAPI 文档转换为 MCP(Model Context Protocol)工具,从而允许大语言模型客户端发现并调用这些端点。该转换过程涵盖 schema 引用解析、显示用 schema 清洗、参数类型推断以及示例生成等多个阶段,并由 FastApiMCP 构造器暴露的高级配置项控制最终输出形态(资料来源:fastapi_mcp/server.py)。
下面介绍 schema 转换的内部流水线,以及常见的进阶配置选项与已知的边界情况。
Schema 转换流水线
convert_openapi_to_mcp_tools() 是整个转换的入口,它接收 FastAPI 通过 get_openapi() 生成的 schema,并返回 MCP Tool 列表与用于调用时的 operation_map(资料来源:fastapi_mcp/openapi/convert.py)。
flowchart LR
A[FastAPI App] --> B[get_openapi]
B --> C[resolve_schema_references]
C --> D[convert_openapi_to_mcp_tools]
D --> E[clean_schema_for_display]
D --> F[get_single_param_type_from_schema]
D --> G[generate_example_from_schema]
E --> H[MCP Tool 列表]
F --> H
G --> H
H --> I[FastApiMCP 工具注册]引用解析:`resolve_schema_references()`
该函数递归扫描 schema 树,将所有 #/components/schemas/ModelName 形式的 $ref 内联展开为目标模型的定义副本,并在合并后删除 $ref 键(资料来源:fastapi_mcp/openapi/utils.py:resolve_schema_references)。这种「一次性全部内联」的策略虽然能简化后续遍历,但也意味着 schema 树会显著膨胀。
类型推断:`get_single_param_type_from_schema()`
OpenAPI 允许通过 anyOf 表达 Optional 类型的字段(T | None)。该函数从 anyOf 集合中提取非 null 的首个类型作为 MCP 输入 schema 的顶层 type(资料来源:fastapi_mcp/openapi/utils.py:get_single_param_type_from_schema)。
显示清洗:`clean_schema_for_display()`
在向 LLM 描述工具的输出 schema 时,库会调用该函数删除 allOf、anyOf、oneOf、nullable、discriminator、readOnly、writeOnly、xml、externalDocs 等字段,以减少模型推理时的噪声(资料来源:fastapi_mcp/openapi/utils.py:clean_schema_for_display)。
示例生成:`generate_example_from_schema()`
当未启用 describe_full_response_schema 时,库会基于 schema 推导一个最小可用的示例:对象类型递归生成属性示例,数组类型生成包含单个元素的列表,字符串根据 format 返回日期/邮箱/URI 示例等(资料来源:fastapi_mcp/openapi/utils.py:generate_example_from_schema)。
FastApiMCP 高级配置项
FastApiMCP.__init__() 提供了多组用于裁剪和细化工具输出的参数。下表汇总了与 schema 转换最相关的选项(资料来源:fastapi_mcp/server.py:__init__)。
| 配置参数 | 默认值 | 作用 |
|---|---|---|
describe_all_responses | False | 控制工具描述中是否列出所有可能的响应 schema,而非仅成功响应 |
describe_full_response_schema | False | 控制是否将完整的 JSON Schema 嵌入工具描述,而非仅展示单个示例 |
include_operations / exclude_operations | None | 按 operationId 精确过滤暴露的端点,二者不可同时使用 |
include_tags / exclude_tags | None | 按 OpenAPI tag 过滤暴露的端点 |
headers | ["authorization"] | 允许从 MCP 请求转发到后端 API 的 HTTP 头白名单 |
auth_config | None | OAuth 元数据/动态注册代理配置,详见 fastapi_mcp/auth/proxy.py |
http_client | None | 自定义 httpx.AsyncClient,常用于调整超时与连接池 |
响应描述粒度
describe_full_response_schema=True 会让 convert_openapi_to_mcp_tools() 在 tool_description 中追加 Output Schema JSON 块,便于 LLM 严格按字段构造返回值。结合 describe_all_responses=True 则会输出所有状态码分支的 schema(资料来源:examples/02_full_schema_description_example.py)。
端点过滤
通过 include_operations / exclude_operations 或 include_tags / exclude_tags,开发者可以显式控制哪些 FastAPI 端点被暴露为 MCP 工具;这是处理大量内部端点时的最佳实践(资料来源:examples/03_custom_exposed_endpoints_example.py)。
HTTP 客户端调优
虽然 FastApiMCP 内部默认复用 ASGI 接口,但在「独立部署」场景下会走 HTTP 回环。此时通过传入自定义 httpx.AsyncClient 可调整超时与重试策略(资料来源:examples/07_configure_http_timeout_example.py)。
已知局限与社区反馈
由于 schema 转换基于 Pydantic/JSON Schema 的多种语法,存在以下已报告的边界情况:
- 自引用模型导致栈溢出:当 Pydantic 模型中存在递归类型(例如
class Node(BaseModel): children: List[Node])时,resolve_schema_references()会无限递归并抛出RecursionError(社区问题 #287)。 Optional[List[X]]字段丢失items:clean_schema_for_display()删除anyOf时没有把数组分支的items提升到顶层,导致生成的 JSON Schema 不合法(社区问题 #304)。- 非
None联合类型推断错误:当字段为T | U(两者均为非空类型)时,get_single_param_type_from_schema()仅从 Pythonset中任意返回一个"type",会被 MCP 服务端校验器拒绝(社区问题 #307)。
规避建议:在使用自引用或复杂联合类型时,可通过 exclude_operations 暂时屏蔽受影响的端点,或在 Pydantic 模型中使用 Field(description=...) 显式提供 LLM 友好的描述,以降低转换误差的影响。
See Also
- README.md — 项目概览与安装指南
- CHANGELOG.md — 版本演进历史(含 v0.4.0 的 transport 重构)
- fastapi_mcp/server.py —
FastApiMCP主类与所有配置项 - fastapi_mcp/openapi/utils.py — schema 工具函数实现
- fastapi_mcp/auth/proxy.py — OAuth 代理与动态客户端注册实现
来源:https://github.com/tadata-org/fastapi_mcp / 项目说明书
失败模式与踩坑日记
保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。
可能阻塞安装或首次运行。
可能影响升级、迁移或版本选择。
可能增加新用户试用和生产接入成本。
可能增加新用户试用和生产接入成本。
Pitfall Log / 踩坑日志
项目:tadata-org/fastapi_mcp
摘要:发现 14 个潜在踩坑项,其中 4 个为 high/blocking;最高优先级:安装坑 - 来源证据:[BUG] RecursionError in resolve_schema_references() with self-referencing $ref schemas。
1. 安装坑 · 来源证据:[BUG] RecursionError in resolve_schema_references() with self-referencing $ref schemas
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:[BUG] RecursionError in resolve_schema_references() with self-referencing $ref schemas
- 对用户的影响:可能阻塞安装或首次运行。
- 证据:community_evidence:github | https://github.com/tadata-org/fastapi_mcp/issues/287 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
2. 配置坑 · 来源证据:[BUG] MCP session 404 in multi worker production environment
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:[BUG] MCP session 404 in multi worker production environment
- 对用户的影响:可能影响升级、迁移或版本选择。
- 证据:community_evidence:github | https://github.com/tadata-org/fastapi_mcp/issues/189 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
3. 配置坑 · 来源证据:[BUG] lifespan context manager not triggered when using mount_http() in fastapi-mcp 0.4.0
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:[BUG] lifespan context manager not triggered when using mount_http() in fastapi-mcp 0.4.0
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 证据:community_evidence:github | https://github.com/tadata-org/fastapi_mcp/issues/256 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
4. 配置坑 · 来源证据:clean_schema_for_display() strips anyOf and loses items for Optional[List[X]] parameters
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:clean_schema_for_display() strips anyOf and loses items for Optional[List[X]] parameters
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 证据:community_evidence:github | https://github.com/tadata-org/fastapi_mcp/issues/304 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
5. 安装坑 · 来源证据:MCPSafe deep scan: 32 medium findings, score 71/100 — badge available
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:MCPSafe deep scan: 32 medium findings, score 71/100 — badge available
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 证据:community_evidence:github | https://github.com/tadata-org/fastapi_mcp/issues/305 | 来源类型 github_issue 暴露的待验证使用条件。
6. 配置坑 · 可能修改宿主 AI 配置
- 严重度:medium
- 证据强度:source_linked
- 发现:项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主,或安装命令涉及用户配置目录。
- 对用户的影响:安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。
- 证据:capability.host_targets | https://github.com/tadata-org/fastapi_mcp | host_targets=mcp_host, claude, cursor
7. 配置坑 · 来源证据:Suggestion: MCPWatch observability example for fastapi_mcp users
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Suggestion: MCPWatch observability example for fastapi_mcp users
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 证据:community_evidence:github | https://github.com/tadata-org/fastapi_mcp/issues/303 | 来源类型 github_issue 暴露的待验证使用条件。
8. 配置坑 · 来源证据:[BUG] Union types of two real types (non-null) rejected at MCP-server jsonschema validator with misleading "is not of t…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:[BUG] Union types of two real types (non-null) rejected at MCP-server jsonschema validator with misleading "is not of type 'X'"
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 证据:community_evidence:github | https://github.com/tadata-org/fastapi_mcp/issues/307 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
9. 能力坑 · 能力判断依赖假设
- 严重度:medium
- 证据强度:source_linked
- 发现:README/documentation is current enough for a first validation pass.
- 对用户的影响:假设不成立时,用户拿不到承诺的能力。
- 证据:capability.assumptions | https://github.com/tadata-org/fastapi_mcp | README/documentation is current enough for a first validation pass.
10. 维护坑 · 维护活跃度未知
- 严重度:medium
- 证据强度:source_linked
- 发现:未记录 last_activity_observed。
- 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
- 证据:evidence.maintainer_signals | https://github.com/tadata-org/fastapi_mcp | last_activity_observed missing
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 证据:downstream_validation.risk_items | https://github.com/tadata-org/fastapi_mcp | no_demo; severity=medium
12. 安全/权限坑 · 存在评分风险
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:风险会影响是否适合普通用户安装。
- 证据:risks.scoring_risks | https://github.com/tadata-org/fastapi_mcp | no_demo; severity=medium
13. 维护坑 · issue/PR 响应质量未知
- 严重度:low
- 证据强度:source_linked
- 发现:issue_or_pr_quality=unknown。
- 对用户的影响:用户无法判断遇到问题后是否有人维护。
- 证据:evidence.maintainer_signals | https://github.com/tadata-org/fastapi_mcp | issue_or_pr_quality=unknown
14. 维护坑 · 发布节奏不明确
- 严重度:low
- 证据强度:source_linked
- 发现:release_recency=unknown。
- 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
- 证据:evidence.maintainer_signals | https://github.com/tadata-org/fastapi_mcp | release_recency=unknown
来源:Doramagic 发现、验证与编译记录