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:
34
src/main.ts
34
src/main.ts
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user