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

  1. Render the brief inside an MCP Apps-capable host (the Open Design daemon's MCP server, or Claude Desktop with MCP Apps support).
  2. If you control the host, implement either the standard bridge (respond to initialize capabilities with serverTools) or expose window.openai.callTool.
  3. For local preview, drive the brief through the daemon's HTTP API instead of the embedded UI.
  4. 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

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


AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12). Data as JSON: /api/errors/14972cec5b2aa559. Report an issue: GitHub.