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,导出三个核心符号:FastApiMCPAuthConfigOAuthMetadata。版本号通过 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):

参数类型默认值 / 说明
fastapiFastAPI必填,源 FastAPI 应用
name / descriptionOptional[str]默认取 app.title / app.description
describe_all_responsesboolFalse:是否列出全部响应模式
describe_full_response_schemaboolFalse:是否展开为完整 JSON Schema
http_clientOptional[httpx.AsyncClient]自定义调用客户端
include_operations / exclude_operationsOptional[List[str]]operationId 过滤(互斥)
include_tags / exclude_tagsOptional[List[str]]按 tag 过滤(互斥)
auth_configOptional[AuthConfig]MCP 认证配置
headersList[str]["authorization"]:HTTP 头透传白名单

资料来源:fastapi_mcp/server.py:21-95

安装与要求

快速开始

最小化集成模式(参考 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 --> A

convert_openapi_to_mcp_toolsfastapi_mcp/openapi/convert.py 中实现:先通过 resolve_schema_references 解析所有 $ref 引用,再按 HTTP 方法(get/post/put/delete/patch)生成 mcp.types.Tooloperation_map;执行阶段根据 operation_map 把参数分发到 path / query / header / body,最终调用 FastApiMCP.__call__ 发起请求。资料来源:fastapi_mcp/openapi/convert.py:9-30

辅助函数 clean_schema_for_display 会从展示用的 Schema 中移除 allOfanyOfoneOfnullablediscriminatorreadOnlywriteOnlyxmlexternalDocs 等对 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

资料来源:fastapi_mcp/server.py:21-95

System Architecture and Transport Layer

fastapimcp 是一个将 FastAPI 应用自动暴露为 Model Context Protocol (MCP) 工具服务器的开源库。其核心设计理念是 FastAPI-first:将 MCP 服务器视为 FastAPI 应用的原生扩展,而非一个独立的 OpenAPI → MCP 转换器。该库通过 ASGI 接口直接与 FastAPI 应用通信,避免了外部 HTTP ...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 Streamable HTTP 传输(推荐)

继续阅读本节完整说明和来源证据。

章节 SSE 传输(向后兼容)

继续阅读本节完整说明和来源证据。

章节 头部转发与 ASGI 通信

继续阅读本节完整说明和来源证据。

概述与设计目标

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

整个系统由以下几层组成:

  1. 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.pyutils.py 中的 resolve_schema_referencesclean_schema_for_display 用于解析 $ref 与清理对 LLM 不友好的内部字段 资料来源:fastapi_mcp/openapi/utils.py
  2. 传输层(Transport Layer):由 fastapi_mcp/transport/ 包提供,包括 HTTP 与 SSE 两种实现。__init__.py 暴露 FastApiHttpSessionManager(HTTP)与 FastApiSseTransport(SSE)供 FastApiMCP 内部使用 资料来源:fastapi_mcp/__init__.py
  3. 服务器核心(FastApiMCP:作为 FastAPI 子应用挂载,接收 MCP 请求并通过 operation_map 查找对应端点。call_tool 方法会从 arguments 中提取 path/query/header 参数并替换到 URL 模板中,然后调用下游 FastAPI 端点 资料来源:fastapi_mcp/server.py
  4. 认证代理层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.mdFastApiHttpSessionManager 负责管理有状态的 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 #133Issue #61)。当前 SSE 仍可用,但官方强烈推荐迁移到 HTTP 传输。

头部转发与 ASGI 通信

FastApiMCP.__init__ 中的 headers 参数(默认 ["authorization"])定义了一个白名单,只有列表中的 HTTP 头部会被从 MCP 请求转发到下游 API 调用 资料来源:fastapi_mcp/server.py。底层通过 ASGI transport 直接调用 FastAPI 应用,不发起外部 HTTP 请求,从而获得最低延迟与最高安全性。

配置选项

下表列出 FastApiMCP 构造函数的主要参数(资料来源:fastapi_mcp/server.py):

参数类型默认值作用
fastapiFastAPI必填,要暴露的 FastAPI 应用
nameOptional[str]app.titleMCP 服务器名
descriptionOptional[str]app.descriptionMCP 服务器描述
describe_all_responsesboolFalse是否在工具描述中包含全部响应 schema
describe_full_response_schemaboolFalse是否包含完整 JSON Schema 而非示例
http_clientOptional[httpx.AsyncClient]None自定义 HTTP 客户端
include_operationsOptional[List[str]]None仅暴露指定 operation ID
exclude_operationsOptional[List[str]]None排除指定 operation ID
include_tags / exclude_tagsOptional[List[str]]None按 tag 过滤
auth_configOptional[AuthConfig]NoneOAuth 2.1 认证配置
headersList[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 模型时会触发 RecursionErrorIssue #287),而 clean_schema_for_display 会剥离 anyOf 并丢失 Optional[List[X]]items 字段(Issue #304)。使用复杂递归模型或可选列表类型时需注意这些边界情况。FastAPI 流式响应(StreamingResponse)目前不被支持(Issue #77)。

See Also

来源:https://github.com/tadata-org/fastapi_mcp / 项目说明书

Authentication and Authorization

FastAPI-MCP 在认证与授权方面采用"双轨制"设计:业务端点沿用 FastAPI 原生的 Depends() 依赖注入体系;面向 MCP 客户端的 OAuth 2.1 流程则由库内置的代理端点承担。该设计将"调用者是谁"与"调用者能做什么"两个关注点解耦,使开发者无需为 MCP 通道额外维护一套独立的身份验证基础设施。资料来源:[README.md:1-15]()。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 触发条件

继续阅读本节完整说明和来源证据。

章节 流程示意

继续阅读本节完整说明和来源证据。

章节 AuthConfig 关键字段

继续阅读本节完整说明和来源证据。

概述

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

  1. auth_config.custom_oauth_metadata 存在,则通过 setup_oauth_custom_metadata 直接以静态元数据响应 metadata_path。资料来源:fastapi_mcp/auth/proxy.py:60-86
  2. 否则若 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

字段含义
issuerOAuth 颁发者标识,参与构造元数据 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_urlauth0_oauth_metadata_url,并在 lifespan 中预取 JWKS 公钥以供业务依赖使用。资料来源:examples/09_auth_example_auth0.py:1-60

常见注意事项

  • include_operations / exclude_operationsinclude_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 构造器暴露的高级配置项控制最终输出形态(资...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 引用解析:resolveschemareferences()

继续阅读本节完整说明和来源证据。

章节 类型推断:getsingleparamtypefromschema()

继续阅读本节完整说明和来源证据。

章节 显示清洗:cleanschemafordisplay()

继续阅读本节完整说明和来源证据。

概述与目标

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 时,库会调用该函数删除 allOfanyOfoneOfnullablediscriminatorreadOnlywriteOnlyxmlexternalDocs 等字段,以减少模型推理时的噪声(资料来源: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_responsesFalse控制工具描述中是否列出所有可能的响应 schema,而非仅成功响应
describe_full_response_schemaFalse控制是否将完整的 JSON Schema 嵌入工具描述,而非仅展示单个示例
include_operations / exclude_operationsNoneoperationId 精确过滤暴露的端点,二者不可同时使用
include_tags / exclude_tagsNone按 OpenAPI tag 过滤暴露的端点
headers["authorization"]允许从 MCP 请求转发到后端 API 的 HTTP 头白名单
auth_configNoneOAuth 元数据/动态注册代理配置,详见 fastapi_mcp/auth/proxy.py
http_clientNone自定义 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_operationsinclude_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]] 字段丢失 itemsclean_schema_for_display() 删除 anyOf 时没有把数组分支的 items 提升到顶层,导致生成的 JSON Schema 不合法(社区问题 #304)。
  • None 联合类型推断错误:当字段为 T | U(两者均为非空类型)时,get_single_param_type_from_schema() 仅从 Python set 中任意返回一个 "type",会被 MCP 服务端校验器拒绝(社区问题 #307)。

规避建议:在使用自引用或复杂联合类型时,可通过 exclude_operations 暂时屏蔽受影响的端点,或在 Pydantic 模型中使用 Field(description=...) 显式提供 LLM 友好的描述,以降低转换误差的影响。

See Also

来源:https://github.com/tadata-org/fastapi_mcp / 项目说明书

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

high 来源证据:[BUG] RecursionError in resolve_schema_references() with self-referencing $ref schemas

可能阻塞安装或首次运行。

high 来源证据:[BUG] MCP session 404 in multi worker production environment

可能影响升级、迁移或版本选择。

high 来源证据:[BUG] lifespan context manager not triggered when using mount_http() in fastapi-mcp 0.4.0

可能增加新用户试用和生产接入成本。

high 来源证据:clean_schema_for_display() strips anyOf and loses items for Optional[List[X]] parameters

可能增加新用户试用和生产接入成本。

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 发现、验证与编译记录