Skip to content

Mirror the Skybridge widget shape so Claude renders the MCP Apps - #174

Merged
OptimNow merged 1 commit into
mainfrom
fix/widget-skybridge-parity
Aug 20, 2026
Merged

Mirror the Skybridge widget shape so Claude renders the MCP Apps#174
OptimNow merged 1 commit into
mainfrom
fix/widget-skybridge-parity

Conversation

@OptimNow

Copy link
Copy Markdown
Owner

Context. The widgets never rendered in Claude despite spec-conformant HTML and a valid ui.domain (validation passes, no error logged, tool called, MCP Apps runtime engages, frame never shows). Meanwhile the two Skybridge-built companion connectors (ai-pricing-hub-mcp, ai-roi-calculator-mcp) DO render their widgets in Claude as plain custom connectors - user-confirmed with a screenshot on 2026-08-20. So the gate is implementation shape, not the Connectors Directory.

What Skybridge emits that we did not, mirrored in this PR:

  1. A ui.csp block ({resourceDomains, connectDomains} = the canonical connector origin) in the SEP-1865 widget resource meta.
  2. An apps-sdk variant of each widget resource: ui://cloud-finops/apps-sdk/<name>, mime text/html+skybridge, meta openai/widgetDomain + openai/widgetCSP.
  3. The tool meta's openai/outputTemplate now points at the apps-sdk variant; ui.resourceUri / ui/resourceUri keep the SEP-1865 resource.

Same self-contained HTML behind both URIs - the bridge negotiates at runtime.

Validation: 102 tests pass (wiring tests pin the dual-resource shape). Actual rendering needs the release train: merge, redeploy Alpic, then a Desktop render test with the connector. If it renders, the remaining Skybridge delta (per-request dynamic ui.domain) can stay unimplemented; if not, that is the next experiment.

The Skybridge-built companion connectors (ai-pricing-hub,
ai-roi-calculator) render their widgets in Claude as plain custom
connectors; this server, spec-conformant with a valid ui.domain, stayed
text-only. Three observable deltas in what Skybridge emits, mirrored
here: a ui.csp block ({resourceDomains, connectDomains}) in the widget
resource meta, an apps-sdk variant of each widget resource (mime
text/html+skybridge, openai/widgetDomain + openai/widgetCSP meta), and
the tool meta's openai/outputTemplate pointing at that variant while
ui.resourceUri keeps the SEP-1865 resource. Same self-contained HTML
behind both URIs.

Needs an Alpic redeploy plus a Desktop render test to validate - the
tests pin the shape, not the rendering.
@OptimNow
OptimNow merged commit beb012f into main Aug 20, 2026
7 checks passed
@OptimNow
OptimNow deleted the fix/widget-skybridge-parity branch August 20, 2026 14:40
OptimNow added a commit that referenced this pull request Aug 20, 2026
…s) (#172)

* Add the coverage heat map to the README

scripts/render-coverage-heatmap.py renders the waste-playbook coverage
(category x provider) as assets/playbook-coverage.svg - OptimNow-accent
intensity ramp, dashed cells for the known gaps, footer pointing at the
public backlog in docs/ROADMAP.md. Embedded in README.md so users see
the coverage shape, gaps included, before installing: publishing the
holes deliberately is cheaper than users discovering them by empty
query. Same CI discipline as the markdown matrix (--check fails on
drift); the new-playbook checklist item now regenerates both.

* Add the FCP capability heat map and reframe coverage as three surfaces

scripts/render-fcp-heatmap.py renders the 22 FinOps Framework capabilities
from the committed fcp-coverage.md (primary / secondary-only / deferred gap)
as assets/fcp-coverage.svg, CI-gated like the playbook map. The README
coverage section now presents both maps and names the third, behavioural
surface (the maintainer-side probe battery), because a field test showed
the playbook map alone reads as the skill's whole coverage - it is only
the runbook catalogue. The playbook SVG title and footer now say so too.

CLAUDE.md: record the 2026-08-20 Desktop render test - valid ui.domain,
tool called, no validation error, still no widget - closing the question
left open on 2026-08-19: ui.domain is necessary but not sufficient, the
Connectors Directory review remains the gate.

* Fix invalid XML in the FCP heat map and correct the MCP Apps conclusion

The FCP domain names contain '&' (Understand Usage & Cost) and the SVG
text nodes were not XML-escaped, so the committed fcp-coverage.svg failed
to parse in any renderer. Escape domain, capability and note strings.

CLAUDE.md: same-day evidence overturned the earlier conclusion - the
Skybridge-built companion connectors render their widgets in Claude as
plain custom connectors, so the gate is implementation shape, not the
Connectors Directory. Record the three Skybridge deltas to mirror.

* Bring the MCP Apps lesson up to date with PRs #174/#175
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant