fix: remove CSP from tool metadata, keep on resource only (#3754)

This commit is contained in:
Jeremiah Lowin 2026-04-03 10:22:33 -04:00 committed by GitHub
commit 333aaddff5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 8 additions and 30 deletions

View file

@ -306,25 +306,10 @@ class FastMCPApp(Provider):
_ensure_prefab_renderer,
)
try:
from prefab_ui.renderer import get_renderer_csp
from fastmcp.apps.config import ResourceCSP
csp = get_renderer_csp()
app_config = AppConfig(
resource_uri=PREFAB_RENDERER_URI,
visibility=["model"],
csp=ResourceCSP(
resource_domains=csp.get("resource_domains"),
connect_domains=csp.get("connect_domains"),
),
)
except ImportError:
app_config = AppConfig(
resource_uri=PREFAB_RENDERER_URI,
visibility=["model"],
)
app_config = AppConfig(
resource_uri=PREFAB_RENDERER_URI,
visibility=["model"],
)
meta: dict[str, Any] = {
"ui": app_config_to_meta_dict(app_config),

View file

@ -108,17 +108,10 @@ def _ensure_prefab_renderer(provider: LocalProvider) -> None:
def _expand_prefab_ui_meta(tool: Tool) -> None:
"""Expand meta["ui"] = True into the full AppConfig dict for a prefab tool."""
from prefab_ui.renderer import get_renderer_csp
from fastmcp.apps.config import AppConfig, app_config_to_meta_dict
from fastmcp.apps.config import AppConfig, ResourceCSP, app_config_to_meta_dict
csp = get_renderer_csp()
app_config = AppConfig(
resource_uri=PREFAB_RENDERER_URI,
csp=ResourceCSP(
resource_domains=csp.get("resource_domains"),
connect_domains=csp.get("connect_domains"),
),
)
meta = dict(tool.meta) if tool.meta else {}
meta["ui"] = app_config_to_meta_dict(app_config)

View file

@ -246,7 +246,8 @@ class TestAppUI:
assert meta is not None
assert meta["ui"]["resourceUri"] == "ui://prefab/renderer.html"
async def test_ui_has_csp(self):
async def test_ui_tool_has_no_csp(self):
"""CSP belongs on the UI resource, not the tool (per MCP Apps spec)."""
app = FastMCPApp("test")
@app.ui()
@ -256,8 +257,7 @@ class TestAppUI:
tools = await app._list_tools()
meta = tools[0].meta
assert meta is not None
csp = meta["ui"].get("csp")
assert csp is not None
assert "csp" not in meta["ui"]
async def test_ui_with_title_and_description(self):
app = FastMCPApp("test")