TGViewer
GitHub开源观察|开源项目·热门仓库·开发者 GitHub开源观察|开源项目·热门仓库·开发者 @githubtrendinghub · 666 subscribers
Post #662 6
FastMCP 类型检查漏洞:mypy 用户被坑,CI 却全绿

FastMCP(27k stars)的 Context.elicit 方法声明了六个 @overload 存根,但每个存根的函数体只有 ...,说明文字被放在了函数体之后。这导致这些字符串不是真正的 docstring,而是类体中的裸表达式语句,会中断 mypy 的 overload 链。

mypy 只能识别六个重载中的第一个——恰好是库自身标记为弃用的 response_type: None 形式。pyright 和 ty 不受影响,而 FastMCP 自己的 CI 用的正是 ty,所以问题被顺利发布。作者尝试了五种调用写法,在 mypy 下全部失败,pyright 下全部通过。

更严重的是,response_type=None 会编译成空 JSON schema,意味着自动接受的客户端产生的数据与人工点击批准在网络上无法区分。作者此前已用真实探测证明,一个删除工具在 confirm=False 时能走完完整删除路径。修复方案是要求明确的确认值(如 ["cancel", "confirm"]),而不是把"已接受"当作信号。

修复本身很小:把每个字面量移入存根函数体,变成真正的 docstring,+15/-24 行,无运行时和 API 变化。已合并到 4.x 主线,但尚未进入任何 release。v3.4.6(08-05 发布)仍带此问题,且仓库没有 3.x 维护分支,固定 fastmcp>=3.4.5,<4 的用户会一直用到有问题的版本。

作者还记录了一个插曲:PR 被机器人以"缺少 issue 链接"为由 15 秒内自动关闭,又被另一个机器人贴上 too-long 标签,最终未经任何修改直接合并,标签至今还在。项目负责人随后在 CLAUDE.md 中加了一行:"Review closed contributor PRs. External PRs may be closed as part of the issue-link workflow, so closure alone is not a negative signal."


核心教训:绿色 CI 只证明你运行的那个检查器同意你的代码,不证明代码正确。三个类型检查器看同一份文件,只有一个发现了问题。维护类型化 Python 库的开发者,值得在非阻塞任务里跑第二个检查器——不必修复它发现的所有问题,但至少得能看见。

GitHub
GitHub

#GitHub #开源 #FastMCP #mypy #pyright #Python #类型检查 #MCP
@GitHubTrendingHub
More from @githubtrendinghub
  1. Sep 30, 2026WSL Containers:在 Windows 里原生跑 Linux 容器 微软把 WSL 容器(WSLC)从公开预览转为正式可用,开发者不必再装独立工具,就能在 WSL 环境里…
  2. Sep 30, 2026DBX:25 MB 的跨平台数据库客户端 轻量级跨平台数据库管理工具,支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、达梦等 100+ 数据库,提…
  3. Sep 30, 2026Openship:自带 CI/CD 的自托管部署平台 指向一个仓库,它自动完成构建、发布、路由和 TLS 终结,省掉自己搭部署流水线的麻烦。适合想把应用部署到自己服务器或云上的开发…
  4. Sep 30, 2026ReClip:自托管的视频音频下载器,带网页界面 粘贴链接就能把 YouTube、TikTok、Instagram、Twitter/X 等 1000+ 站点的视频存成 MP4 或…
  5. Sep 30, 2026OpenShell:给自主 AI Agent 用的安全私有运行时 NVIDIA 开源,让 Agent 能读文件、装包、调 API、用凭证,但不会拿到你数据、密钥和网络的完全访问权。…
  6. Sep 29, 2026openSUSE Leap 16.1:不可变模式并入主安装器 openSUSE 把不可变系统并入 Leap 主安装器,Leap Micro 不再单独发版,6.3 和 7.0 取消。…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →