From baa48571a3b4e6ed2cfaa804f22d3501200c181c Mon Sep 17 00:00:00 2001 From: Max Isbey <224885523+maxisbey@users.noreply.github.com> Date: Fri, 6 Mar 2026 14:39:53 +0000 Subject: [PATCH] fix: remove MIME type validation from MCPServer Resource The regex pattern on Resource.mime_type was the only MIME type validation anywhere in the MCP ecosystem. It rejected valid RFC 2045 MIME types such as quoted parameter values (text/plain; charset="utf-8") and was inconsistent with ResourceTemplate in the same module, the protocol-level types in _types.py, and every other SDK. The MCP spec defines mimeType as an unconstrained optional string. Github-Issue: #1756 --- src/mcp/server/mcpserver/resources/base.py | 6 +----- tests/server/mcpserver/resources/test_resources.py | 8 ++++++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/mcp/server/mcpserver/resources/base.py b/src/mcp/server/mcpserver/resources/base.py index d3ccc425e..d48e0695c 100644 --- a/src/mcp/server/mcpserver/resources/base.py +++ b/src/mcp/server/mcpserver/resources/base.py @@ -23,11 +23,7 @@ class Resource(BaseModel, abc.ABC): name: str | None = Field(description="Name of the resource", default=None) title: str | None = Field(description="Human-readable title of the resource", default=None) description: str | None = Field(description="Description of the resource", default=None) - mime_type: str = Field( - default="text/plain", - description="MIME type of the resource content", - pattern=r"^[a-zA-Z0-9]+/[a-zA-Z0-9\-+.]+(;\s*[a-zA-Z0-9\-_.]+=[a-zA-Z0-9\-_.]+)*$", - ) + mime_type: str = Field(default="text/plain", description="MIME type of the resource content") icons: list[Icon] | None = Field(default=None, description="Optional list of icons for this resource") annotations: Annotations | None = Field(default=None, description="Optional annotations for the resource") meta: dict[str, Any] | None = Field(default=None, description="Optional metadata for this resource") diff --git a/tests/server/mcpserver/resources/test_resources.py b/tests/server/mcpserver/resources/test_resources.py index 93dc438d5..5d36beda8 100644 --- a/tests/server/mcpserver/resources/test_resources.py +++ b/tests/server/mcpserver/resources/test_resources.py @@ -91,6 +91,14 @@ def dummy_func() -> str: # pragma: no cover ) assert resource.mime_type == "application/json" + # RFC 2045 quoted parameter value (gh-1756) + resource = FunctionResource( + uri="resource://test", + fn=dummy_func, + mime_type='text/plain; charset="utf-8"', + ) + assert resource.mime_type == 'text/plain; charset="utf-8"' + @pytest.mark.anyio async def test_resource_read_abstract(self): """Test that Resource.read() is abstract."""