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
- Configure the MCP connection with a remote HTTP server URL (streamable HTTP endpoint).
- Replace the stdio/local server with a hosted HTTP MCP endpoint that serves the app resources.
- Verify the url key exists in the connection's config JSON and is a valid absolute URL.
- 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
- Configure MCP servers via url (HTTP) when MCP Apps are needed
- Avoid stdio/command configs for app-serving connections
- Validate connection config contains a parseable absolute URL before connecting
- Document transport requirements for app developers
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
- invalid_resource_uri
- invalid_resource_csp
- unsupported_resource_permissions
- MCP_OAUTH_CONFIGURATION_REQUIRED
- mcp_oauth_configuration_required
AI-assisted analysis of different-ai/openwork@2b7df46e8a (2026-09-01).
Data as JSON: /api/errors/44820f6295434a90.
Report an issue: GitHub.