Support deep linking MCP (#1550)

<!-- CURSOR_SUMMARY -->
> [!NOTE]
> Adds support for `dyad://add-mcp-server` deep links that prefill MCP
server settings, and updates deep link context/consumers to use
timestamp-based effects and clearing to avoid repeat handling.
> 
> - **Deep Link Infrastructure**:
> - Introduce `src/ipc/deep_link_data.ts` with zod schema
(`AddMcpServerConfigSchema`) and typed `DeepLinkData`.
> - Extend `DeepLinkContext` with `clearLastDeepLink`, timestamped
events, and auto-navigate to `/settings#tools-mcp` on `add-mcp-server`.
> - **Main Process**:
>   - Handle `dyad://add-mcp-server?name=...&config=...`:
> - Base64-decode and validate `config`; send `deep-link-received` with
typed payload or show error.
> - **Settings UI (MCP)**:
> - In `ToolsMcpSettings`, prefill form from `add-mcp-server` payload
(supports `stdio` command/args and `http` url) and show info toast;
clear deep link after handling.
> - **Connectors/UI**:
>   - Update `TitleBar`, `NeonConnector`, `SupabaseConnector` to:
> - Depend on `lastDeepLink?.timestamp` and call `clearLastDeepLink()`
after handling (`dyad-pro-return`, `neon-oauth-return`,
`supabase-oauth-return`).
> - **IPC Renderer**:
>   - Use centralized `DeepLinkData` types in `ipc_client.ts`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
294a9c6f38442241b54e9bcbe19a7a772d338ee0. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
This commit is contained in:
Will Chen
2025-10-16 10:20:16 -07:00
committed by GitHub
parent d76f428447
commit 744e413e71
8 changed files with 117 additions and 15 deletions

View File

@@ -18,6 +18,10 @@ import { BackupManager } from "./backup_manager";
import { getDatabasePath, initializeDatabase } from "./db";
import { UserSettings } from "./lib/schemas";
import { handleNeonOAuthReturn } from "./neon_admin/neon_return_handler";
import {
AddMcpServerConfigSchema,
AddMcpServerPayload,
} from "./ipc/deep_link_data";
log.errorHandler.startCatching();
log.eventLogger.startLogging();
@@ -323,6 +327,36 @@ function handleDeepLinkReturn(url: string) {
});
return;
}
// dyad://add-mcp-server?name=Chrome%20DevTools&config=eyJjb21tYW5kIjpudWxsLCJ0eXBlIjoic3RkaW8ifQ%3D%3D
if (parsed.hostname === "add-mcp-server") {
const name = parsed.searchParams.get("name");
const config = parsed.searchParams.get("config");
if (!name || !config) {
dialog.showErrorBox("Invalid URL", "Expected name and config");
return;
}
try {
const decodedConfigJson = atob(config);
const decodedConfig = JSON.parse(decodedConfigJson);
const parsedConfig = AddMcpServerConfigSchema.parse(decodedConfig);
mainWindow?.webContents.send("deep-link-received", {
type: parsed.hostname,
payload: {
name,
config: parsedConfig,
} as AddMcpServerPayload,
});
} catch (error) {
logger.error("Failed to parse add-mcp-server deep link:", error);
dialog.showErrorBox(
"Invalid MCP Server Configuration",
"The deep link contains malformed configuration data. Please check the URL and try again.",
);
}
return;
}
dialog.showErrorBox("Invalid deep link URL", url);
}