Fix case-insensitive handling of text MIME types for FileResource

在 MCP Python SDK v2.x 中, FileResource 对 MIME 类型(如 Text/Markdown 、 TEXT/plain )做了大小写不敏感处理,已修复“混合大小写 text/* 被当作二进制”的问题。若你仍遇到混合大小写 MIME 类型被当作 blob 返回,优先升

快速结论:在 MCP Python SDK v2.x 中,FileResource 对 MIME 类型(如 Text/MarkdownTEXT/plain)做了大小写不敏感处理,已修复“混合大小写 text/* 被当作二进制”的问题。若你仍遇到混合大小写 MIME 类型被当作 blob 返回,优先升级到 SDK v2.0.0 或更高版本,并检查是否走的是 streamable HTTP server 的 Content-Type 头比较路径(该处仍待修复)。

适用环境:Issue 确认的环境为 MCP Python SDK v2.x(测试提交 3a6f299)、Python 3.12.13;修复随 v2.0.0 发布。

最快修复方案:将 MCP Python SDK 升级到 v2.0.0 或更高版本。该版本已用 encoding 字段替代 is_binary,并在 text/* 判断前对 MIME 类型做小写化处理。

注意事项:v2.0.0 仅修复了 FileResource 侧;streamable HTTP server 中对 Content-Type 头的比较(源码 streamable_http.py 第 488–491 行附近)仍区分大小写,相关修复在 PR #2918 中,尚未合并。若你的场景依赖 HTTP 头判断,不能只靠升级解决。

问题场景

当使用 MCP Python SDK 的 FileResource 时,如果传入混合大小写或大写的文本 MIME 类型(例如 Text/MarkdownTEXT/plain),资源会被错误地判断为二进制,导致文本内容以字节形式返回,破坏下游消费者对文本内容的处理。

报错原文

Fix case-insensitive handling of text MIME types for FileResource

# Root cause
The current logic checks whether the MIME type starts with `text/` directly, without normalizing the value first. Because the comparison is case-sensitive, uppercase or mixed-case text media types do not match and are misclassified as binary.

# Why it matters
This can cause text resources to be read and returned as bytes instead of text when the caller provides a non-lowercase `text/*` MIME type.

原因分析

根本原因是 FileResource 判断 MIME 类型是否以 text/ 开头时使用了大小写敏感的比较,未先对 MIME 值做小写化(lowercase)归一化。这可能与 RFC 9110 §8.3.1 的规定不一致(媒体类型不区分大小写)。

具体表现:application/jsonApplication/JSONAPPLICATION/JSON 应等价,但旧逻辑只接受小写的 text/ 前缀,导致 Text/Markdown 这类混合大小写值被误判为二进制。

环境排查

  • 确认 MCP Python SDK 版本是否为 v2.0.0 或更高(修复已随 v2.0.0 发布)。
  • 确认调用方传入的 MIME 类型字符串的实际大小写形式(如 Text/Markdown 而非 text/markdown)。
  • 若问题发生在 HTTP server 端,检查 Content-Type 头部是否包含混合大小写值,以及是否走的是 streamable_http.py_check_content_type 逻辑(该路径在 PR #2918 修复前仍有问题)。
  • 确认 Python 版本:Issue 中记录的是 Python 3.12.13,但问题本身与 Python 版本无关。

解决步骤

  1. 将 MCP Python SDK 升级到 v2.0.0 或更高版本,验证 FileResource 对混合大小写 MIME 类型的处理。
  2. 在代码中确认 FileResource 实例的 encoding 字段(v2.0.0 引入)能正确识别文本类型;旧逻辑使用 is_binary 字段。
  3. 在调用 FileResource 时,确保传入的 mime_type 参数与期望一致,或在传入前统一调用 .lower(),但升级后可不再需要人工归一化。
  4. 如果问题仍存在于 streamable HTTP server 的 Content-Type 判断(源码在 src/mcp/server/streamable_http.py 第 488–491 行附近),只能等待 PR #2918 合并,或自行在代码中对该处比较逻辑增加 .lower() 处理。

验证方法

运行类似 Issue 中的示例代码:用 FileResource 创建 mime_type="Text/Markdown" 的资源,断言 is_binary is False(v1.x)或检查 encoding 字段(v2.x)。若程序通过且返回文本内容而非字节,说明修复生效。也可以对多种混合大小写值(Text/PlainTEXT/MARKDOWN 等)做回归测试。

对于 HTTP server 场景,可发请求并检查 Content-TypeApplication/JSON 时是否被正确处理——在 PR #2918 合并前,该场景可能仍会失败。

参考来源

modelcontextprotocol/python-sdk #3131

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 18580

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注