From 4d4ed562f084ffc805735c808123a01fa3160571 Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Tue, 10 Feb 2026 15:31:29 +0400 Subject: [PATCH] fix(frontend/mcp): Ensure MCP block title persists across save/refresh When the MCP server returns a null server_name, fall back to the URL hostname so customized_name is always set in metadata. This prevents the title from degrading to "MCP:" after save and reload. --- .../NewControlPanel/NewBlockMenu/Block.tsx | 18 ++++++++++++++---- .../CredentialsSelect/CredentialsSelect.tsx | 3 +-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/autogpt_platform/frontend/src/app/(platform)/build/components/NewControlPanel/NewBlockMenu/Block.tsx b/autogpt_platform/frontend/src/app/(platform)/build/components/NewControlPanel/NewBlockMenu/Block.tsx index f20876f134..dbcb2d1cb7 100644 --- a/autogpt_platform/frontend/src/app/(platform)/build/components/NewControlPanel/NewBlockMenu/Block.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/build/components/NewControlPanel/NewBlockMenu/Block.tsx @@ -65,18 +65,28 @@ export const Block: BlockComponent = ({ const handleMCPToolConfirm = useCallback( (result: MCPToolDialogResult) => { + // Derive a display label: prefer server name, fall back to URL hostname. + let serverLabel = result.serverName; + if (!serverLabel) { + try { + serverLabel = new URL(result.serverUrl).hostname; + } catch { + serverLabel = "MCP"; + } + } + const customNode = addBlockAndCenter(blockData, { server_url: result.serverUrl, - server_name: result.serverName, + server_name: serverLabel, selected_tool: result.selectedTool, tool_input_schema: result.toolInputSchema, available_tools: result.availableTools, credentials: result.credentials ?? undefined, }); // Persist the MCP title as customized_name in metadata so it survives - // save/load even if server_name is stripped from input_default. - if (customNode && result.serverName && result.selectedTool) { - const title = `${result.serverName}: ${beautifyString(result.selectedTool)}`; + // save/load even if server_name is pruned from input_default. + if (customNode && result.selectedTool) { + const title = `${serverLabel}: ${beautifyString(result.selectedTool)}`; updateNodeData(customNode.id, { metadata: { ...customNode.data.metadata, diff --git a/autogpt_platform/frontend/src/components/contextual/CredentialsInput/components/CredentialsSelect/CredentialsSelect.tsx b/autogpt_platform/frontend/src/components/contextual/CredentialsInput/components/CredentialsSelect/CredentialsSelect.tsx index 79c42058a5..9e1d312008 100644 --- a/autogpt_platform/frontend/src/components/contextual/CredentialsInput/components/CredentialsSelect/CredentialsSelect.tsx +++ b/autogpt_platform/frontend/src/components/contextual/CredentialsInput/components/CredentialsSelect/CredentialsSelect.tsx @@ -49,8 +49,7 @@ export function CredentialsSelect({ // When credentials exist and nothing is explicitly selected, // default to the first credential instead of "None" const effectiveCredential = - selectedCredential ?? - (credentials.length > 0 ? credentials[0] : null); + selectedCredential ?? (credentials.length > 0 ? credentials[0] : null); const displayCredential = effectiveCredential ? {