Claude Desktop: custom URL schemes (non-http) are not opened by the OS
Summary
When an MCP server returns deep link URLs with custom URL schemes (e.g. carebrief://entity/medication/...), clicking them in Claude Desktop's "Open external link" dialog does nothing. The OS never receives the URL.
Context
MCP servers commonly return entity URLs with custom schemes so users can navigate directly into native apps. The MCP spec supports url fields on entities for exactly this purpose.
Steps to reproduce
- Configure an MCP server that returns responses containing custom-scheme URLs (e.g.
carebrief://entity/medication/UUID) - Claude Desktop renders these as clickable markdown links
- Clicking shows the "Open external link" confirmation dialog
- Click "Open link"
- Nothing happens — the native app does not open
Expected behavior
Clicking "Open link" should pass the URL to the OS via shell.openExternal() (Electron), which hands it to the registered URL scheme handler. The native app should open.
Verification
Running open "carebrief://entity/medication/UUID" in Terminal opens the app correctly, confirming:
- The URL scheme is registered with macOS Launch Services
- The app handles the URL and navigates to the entity
The issue is specifically that Claude Desktop's Electron shell does not pass custom URL schemes to the OS.
Impact
This breaks a core MCP interaction pattern: MCP server returns structured data with deep links → user clicks to view in native app. Any MCP server targeting a native app (health records, IDE plugins, design tools, etc.) is affected.
Suggested fix
In Electron, shell.openExternal() supports custom URL schemes. The link click handler likely filters to http:// and https:// only. Allowing registered custom schemes would fix this.
Workaround
Users can copy the URL and run open "carebrief://..." in Terminal, but this defeats the purpose of clickable deep links.
Environment
- Claude Desktop (macOS)
- macOS 26.1
- MCP server: CareBrief Health Records (stdio transport)
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗