From de8048cb6d38cba26016b72a53402636ac09f4d8 Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Mon, 19 Jan 2026 19:11:42 +0000 Subject: [PATCH] feat(qr-server): use Python SDK meta parameter for resource CSP metadata (#303) * update qr-server w/ python sdk fix * feat(qr-server): use Python SDK meta parameter for resource CSP metadata - Update qr-server to use the new meta parameter on @mcp.resource decorator instead of manually overriding the read_resource handler - Add ui.resourceUri to tool meta alongside legacy ui/resourceUri for forward compatibility - Simplify server.py by removing the custom _read_resource_with_meta handler - Add qr-server to grid screenshot generation tests - Update grid-cell.png screenshot This leverages the Python SDK's native support for resource metadata, eliminating the need for low-level handler manipulation. Co-Authored-By: Claude --------- Co-authored-by: Claude --- examples/qr-server/grid-cell.png | Bin 40202 -> 27772 bytes examples/qr-server/server.py | 59 +++++--------------- tests/e2e/generate-grid-screenshots.spec.ts | 2 + 3 files changed, 15 insertions(+), 46 deletions(-) diff --git a/examples/qr-server/grid-cell.png b/examples/qr-server/grid-cell.png index 0d54384ba17fd108beca2bb1ea5407a9266fd39d..281729bd4a53aea2ed8ae09152b4b038676c3734 100644 GIT binary patch literal 27772 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 diff --git a/examples/qr-server/server.py b/examples/qr-server/server.py index f6618c0..baac4d0 100755 --- a/examples/qr-server/server.py +++ b/examples/qr-server/server.py @@ -2,7 +2,7 @@ # /// script # requires-python = ">=3.10" # dependencies = [ -# "mcp>=1.9.0", +# "mcp @ git+https://github.com/modelcontextprotocol/python-sdk@main", # "qrcode[pil]>=8.0", # "uvicorn>=0.34.0", # "starlette>=0.46.0", @@ -30,7 +30,10 @@ PORT = int(os.environ.get("PORT", "3108")) mcp = FastMCP("QR Code Server", port=PORT, stateless_http=True) -@mcp.tool(meta={"ui/resourceUri": WIDGET_URI}) +@mcp.tool(meta={ + "ui":{"resourceUri": WIDGET_URI}, + "ui/resourceUri": WIDGET_URI, # legacy support +}) def generate_qr( text: str = "https://modelcontextprotocol.io", box_size: int = 10, @@ -72,53 +75,17 @@ def generate_qr( return [types.ImageContent(type="image", data=b64, mimeType="image/png")] -# Register widget resource using FastMCP decorator (returns HTML string) -@mcp.resource(WIDGET_URI, mime_type="text/html;profile=mcp-app") +# IMPORTANT: all the external domains used by app must be listed +# in the meta.ui.csp.resourceDomains - otherwise they will be blocked by CSP policy +@mcp.resource( + WIDGET_URI, + mime_type="text/html;profile=mcp-app", + meta={"ui": {"csp": {"resourceDomains": ["https://unpkg.com"]}}}, +) def widget() -> str: + """Widget HTML resource with CSP metadata for external dependencies.""" return Path(__file__).parent.joinpath("widget.html").read_text() - -# Override the read_resource handler to inject _meta into the response -# This is needed because FastMCP doesn't support custom _meta on resources -_low_level_server = mcp._mcp_server - - -async def _read_resource_with_meta(req: types.ReadResourceRequest): - """Custom handler that injects CSP metadata for the widget resource.""" - uri = str(req.params.uri) - html = Path(__file__).parent.joinpath("widget.html").read_text() - - if uri == WIDGET_URI: - # NOTE: Must use model_validate with '_meta' key (not 'meta') due to Pydantic alias behavior - content = types.TextResourceContents.model_validate({ - "uri": WIDGET_URI, - "mimeType": "text/html;profile=mcp-app", - "text": html, - # IMPORTANT: all the external domains used by app must be listed - # in the _meta.ui.csp.resourceDomains - otherwise they will be blocked by CSP policy - "_meta": {"ui": {"csp": {"resourceDomains": ["https://unpkg.com"]}}} - }) - return types.ServerResult( - types.ReadResourceResult(contents=[content]) - ) - - # Fallback for other resources (shouldn't happen for this server) - return types.ServerResult( - types.ReadResourceResult( - contents=[ - types.TextResourceContents( - uri=uri, - mimeType="text/plain", - text="Resource not found" - ) - ] - ) - ) - - -# Replace the handler after FastMCP has registered its own -_low_level_server.request_handlers[types.ReadResourceRequest] = _read_resource_with_meta - if __name__ == "__main__": if "--stdio" in sys.argv: # Claude Desktop mode diff --git a/tests/e2e/generate-grid-screenshots.spec.ts b/tests/e2e/generate-grid-screenshots.spec.ts index a127e70..b44ccc8 100644 --- a/tests/e2e/generate-grid-screenshots.spec.ts +++ b/tests/e2e/generate-grid-screenshots.spec.ts @@ -54,6 +54,8 @@ const SERVERS = [ }, { key: "map-server", name: "Map Server", dir: "map-server" }, { key: "pdf-server", name: "PDF Server", dir: "pdf-server" }, + { key: "qr-server", name: "QR Code Server", dir: "qr-server" }, + { key: "say-server", name: "Say Demo", dir: "say-server" }, { key: "scenario-modeler", name: "SaaS Scenario Modeler",