快速结论:在 MCP Python SDK v2.x 中,FileResource 对 MIME 类型(如 Text/Markdown、TEXT/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/Markdown、TEXT/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/json、Application/JSON、APPLICATION/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 版本无关。
解决步骤
- 将 MCP Python SDK 升级到 v2.0.0 或更高版本,验证
FileResource对混合大小写 MIME 类型的处理。 - 在代码中确认
FileResource实例的encoding字段(v2.0.0 引入)能正确识别文本类型;旧逻辑使用is_binary字段。 - 在调用
FileResource时,确保传入的mime_type参数与期望一致,或在传入前统一调用.lower(),但升级后可不再需要人工归一化。 - 如果问题仍存在于 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/Plain、TEXT/MARKDOWN 等)做回归测试。
对于 HTTP server 场景,可发请求并检查 Content-Type 为 Application/JSON 时是否被正确处理——在 PR #2918 合并前,该场景可能仍会失败。
参考来源
modelcontextprotocol/python-sdk #3131
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: Using the official interface to call the agent application in Ragflow, the parameters in the initial component cannot be passed in](https://www.chat-gpts.plus/wp-content/uploads/2026/08/9617-f9a4f153-768x403.jpg)
![[Question]:GPT-OSS with JSON Structured Output caused error for LLM](https://www.chat-gpts.plus/wp-content/uploads/2026/08/9462-601c3b24-768x403.jpg)
![[Bug]: If you click the pause button before the AI finishes its response, it will stop replying to you.](https://www.chat-gpts.plus/wp-content/uploads/2026/08/9641-3017b443-768x403.jpg)