Skip to content

Claude Desktop ui.domain mismatch: hash computed with pathname instead of origin #630

@kkkpeckkk

Description

@kkkpeckkk

Bug

When using a Skybridge MCP server with Claude Desktop, the widget fails to load with a ui.domain mismatch error.

Claude computes the expected domain hash from the connector URL (e.g. https://my-app.alpic.live), but Skybridge computes it from the URL with
the pathname appended
(e.g. https://my-app.alpic.live/mcp), resulting in different hashes.

Root cause

In dist/server/server.js around line 252:

const pathname = extra?.requestInfo?.url?.pathname ?? "";
const url = `${serverUrl}${pathname}`;
                                                                                                                                                   
pathname resolves to /mcp, so the hash is computed on https://my-app.alpic.live/mcp instead of https://my-app.alpic.live.                          
                                                                                                                                                   
Expected fix                                                                                                                                       
                
const url = serverUrl;

Error message                                                                                                                                      

ui.domain mismatch: expected "2cb1365d...claudemcpcontent.com" for connector                                                                       
"https://my-app.alpic.live", but got "7a38f52b...claudemcpcontent.com"                                                                             

Steps to reproduce                                                                                                                                 
                
1. Deploy a Skybridge MCP server on Alpic
2. Connect it to Claude Desktop using the Alpic URL
3. Call a widget tool  ui.domain mismatch                                                                                                         
                                                                                                                                                   
Works fine on ChatGPT since it doesn't use this domain check.          

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions