different-ai/openwork · error · McpAppHostError

unsupported_transport

unsupported_transport

Error message

MCP Apps currently require a configured remote HTTP MCP server.

What it means

withRemoteClient resolves the configured remote MCP URL for the MCP App host and throws unsupported_transport when none is configured. OpenWork's MCP Apps slice only supports apps served by a configured remote HTTP MCP server; stdio/local-only transports are not supported for Apps.

Source

Thrown at apps/server/src/mcp-app-host.ts:171

  }
}

function clientOptions() {
  return {
    capabilities: {
      extensions: {
        [MCP_APP_EXTENSION]: { mimeTypes: [MCP_APP_MIME_TYPE] },
      },
    },
  };
}

async function withRemoteClient<T>(
  config: Record<string, unknown>,
  run: (client: Client) => Promise<T>,
): Promise<T> {
  const url = remoteUrl(config);
  if (!url) throw new McpAppHostError("unsupported_transport", "MCP Apps currently require a configured remote HTTP MCP server.");
  try {
    await assertLocalManagedMcpUrl(url.toString());
  } catch (error) {
    if (error instanceof LocalManagedMcpPrivateUrlError) {
      throw new McpAppHostError("unsafe_server_url", error.message);
    }
    throw error;
  }
  const guardedFetch = createLocalManagedMcpGuardedFetch();
  const requestInit = {
    headers: stringHeaders(config.headers),
  };
  const attempts = [
    () => new StreamableHTTPClientTransport(url, { requestInit, fetch: guardedFetch }),
    () => new SSEClientTransport(url, { requestInit, fetch: guardedFetch }),
  ];
  let lastError: unknown;
  for (const createTransport of attempts) {

View on GitHub (pinned to 2b7df46e8a)

Solutions

  1. Configure the MCP connection with a remote HTTP server URL (streamable HTTP endpoint).
  2. Replace the stdio/local server with a hosted HTTP MCP endpoint that serves the app resources.
  3. Verify the url key exists in the connection's config JSON and is a valid absolute URL.
  4. If the app must run locally, host it behind a local HTTP MCP server exposed at a loopback URL the config points to.

Example fix

// before
'{ "mcpServers": { "my-app": { "command": "node", "args": ["server.js"] } } }'
// after
'{ "mcpServers": { "my-app": { "url": "https://mcp.example.com/mcp" } } }'
Defensive patterns

Strategy: validation

Validate before calling

const cfg = mcpServerConfig(name)
if (typeof (cfg as { url?: unknown }).url !== 'string' || !/^https?:\/\//.test(cfg.url)) {
  throw new Error(`MCP server '${name}' must have a remote HTTP url to use MCP Apps`)
}

Type guard

function hasRemoteHttpUrl(config: Record<string, unknown>): config is { url: string } {
  const url = config.url
  return typeof url === 'string' && URL.canParse(url)
}

Try / catch

try {
  const apps = await host.apps(connection)
} catch (e) {
  if (e instanceof McpAppHostError && e.code === 'unsupported_transport') {
    showSetupHint('configure a remote HTTP MCP server to use Apps')
  } else throw e
}

Prevention

When it happens

Trigger: Listing apps, matching, resolving a connect resource, or calling an app tool when the MCP connection config has no remote HTTP URL (missing url field, stdio command config, or empty remoteUrl).

Common situations: User added a local stdio MCP server and expects MCP Apps to work; connection configured via command args instead of HTTP endpoint; url field typo'd or empty in the server config.

Related errors


AI-assisted analysis of different-ai/openwork@2b7df46e8a (2026-09-01). Data as JSON: /api/errors/44820f6295434a90. Report an issue: GitHub.