nexu-io/open-design · error · Error
The MCP Apps bridge is unavailable.
Error message
The MCP Apps bridge is unavailable.
What it means
Browser-side error from the MCP Apps brief UI's callConfirm(). The function tries two bridges to invoke the confirm_brief tool: first the standard MCP Apps bridge (when standardBridgeReady AND host capability 'serverTools'), then the legacy `window.openai.callTool` API. If neither is available, it throws — meaning the brief form is being rendered in a context that cannot call host tools at all.
Source
Thrown at apps/daemon/src/mcp-apps/brief-resource.ts:383
function selections() {
const answers = {};
if (!draft || !draft.questionForm) return answers;
for (const item of draft.questionForm.questions || []) {
const selected = form.elements.namedItem(item.id);
const value = selected && selected.value;
if (value) answers[item.id] = [value];
}
return answers;
}
async function callConfirm(argumentsValue) {
if (standardBridgeReady && hostSupports("serverTools")) {
return request("tools/call", { name: "confirm_brief", arguments: argumentsValue });
}
if (window.openai && typeof window.openai.callTool === "function") {
return window.openai.callTool("confirm_brief", argumentsValue);
}
throw new Error(copy().bridgeUnavailable);
}
async function publishConfirmation(payload) {
const activeLocale = effectiveLocale();
const prompt = copy().confirmed + "\\n\\n" + payload.summary + "\\n\\n"
+ (activeLocale === "zh-CN"
? "请根据这份需求继续。"
: activeLocale === "zh-TW"
? "請依照這份需求繼續。"
: activeLocale === "ja"
? "このブリーフに沿って続行してください。"
: "Continue with this brief.");
// Codex exposes its host-native follow-up bridge alongside MCP Apps.
// Prefer it when present so the confirmed brief becomes readable user
// text instead of a context-only turn rendered as "(No content)".
if (window.openai && typeof window.openai.sendFollowUpMessage === "function") {
await window.openai.sendFollowUpMessage({ prompt, scrollToBottom: true });
return clearModelContext();View on GitHub (pinned to 5be4028344)
Solutions
- Render the brief inside an MCP Apps-capable host (the Open Design daemon's MCP server, or Claude Desktop with MCP Apps support).
- If you control the host, implement either the standard bridge (respond to initialize capabilities with serverTools) or expose window.openai.callTool.
- For local preview, drive the brief through the daemon's HTTP API instead of the embedded UI.
- Check the browser console — standardBridgeInitialization failing is the usual root cause.
Defensive patterns
Strategy: validation
Validate before calling
// Inside the brief UI host capability detection (run on load)
function canCallConfirm(): boolean {
return (standardBridgeReady && hostSupports('serverTools'))
|| (typeof window !== 'undefined' && !!window.openai && typeof window.openai.callTool === 'function');
}
if (!canCallConfirm()) {
// Show a banner instead of letting the user reach the submit that would throw.
showBanner('This host cannot confirm briefs. Run inside an MCP Apps-capable host.');
} Try / catch
// Already handled in-source: callConfirm() throws; the submit handler catches and re-applies 'ready' phase.
try {
await callConfirm(args);
} catch (error) {
applyPhase('ready', publicErrorMessage(error, copy().confirmFailed));
return;
} Prevention
- Detect host capabilities on load and disable submit if neither bridge is present.
- Run the brief UI only inside MCP Apps-capable hosts.
- If you maintain a host, declare serverTools and implement tools/call.
When it happens
Trigger: Opening the brief resource HTML in a plain browser tab (no MCP host); running inside a host that does not implement the standard bridge and does not expose window.openai.callTool; the standard bridge failed to initialize (standardBridgeReady is false) and the legacy API is absent.
Common situations: Developer previews the brief HTML standalone during testing; host is an older MCP client without Apps support; an ACP-style host that exposes a different bridge not yet wired in; browser extension blocking window.openai.
Related errors
- The host cannot publish the confirmed brief.
- The host returned an invalid confirmation.
- pluginWorkflowId requires a validated externalPluginContext
- The Open Design brief has expired or is unknown. Call collec
- The Open Design brief nonce is invalid.
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/14972cec5b2aa559.
Report an issue: GitHub.