diff --git a/tools/server/webui/src/lib/components/app/chat/ChatSettings/McpServerCard.svelte b/tools/server/webui/src/lib/components/app/chat/ChatSettings/McpServerCard.svelte new file mode 100644 index 0000000000..a98b35eeb1 --- /dev/null +++ b/tools/server/webui/src/lib/components/app/chat/ChatSettings/McpServerCard.svelte @@ -0,0 +1,307 @@ + + + + {#if isEditing} + +
+
+

Configure Server

+
+ {#if server.url.trim()} + + {/if} + + +
+
+ + (editUrl = v)} + onHeadersChange={(v) => (editHeaders = v)} + urlError={editUrl ? urlError : null} + id={server.id} + /> +
+ {:else} + + +
+ +
+ {#if faviconUrl} + { + (e.currentTarget as HTMLImageElement).style.display = 'none'; + }} + /> + {:else} + + {/if} +

{displayName}

+ {#if server.url} + + + + {/if} + {#if isHealthChecking} + Checking... + {:else if isConnected} + Connected + {:else if isError} + Error + {/if} +
+ + +
+ +
+
+ + + {#if isError && errorMessage} +

{errorMessage}

+ {/if} + + + {#if tools.length === 0 && server.url.trim()} +
+ + + +
+ {/if} + {/if} + + + {#if tools.length > 0} + +
+ + {#if isExpanded} + + {:else} + + {/if} + {toolsCount} tools available ยท Show details + +
+ + + +
+
+ +
+ {#each tools as tool (tool.name)} +
+ {tool.name} + {#if tool.description} +

{tool.description}

+ {/if} +
+ {/each} +
+
+
+ {/if} +
diff --git a/tools/server/webui/src/lib/components/app/chat/ChatSettings/McpServerForm.svelte b/tools/server/webui/src/lib/components/app/chat/ChatSettings/McpServerForm.svelte new file mode 100644 index 0000000000..d1b7784348 --- /dev/null +++ b/tools/server/webui/src/lib/components/app/chat/ChatSettings/McpServerForm.svelte @@ -0,0 +1,154 @@ + + +
+
+ + onUrlChange(e.currentTarget.value)} + class={urlError ? 'border-destructive' : ''} + /> + {#if urlError} +

{urlError}

+ {/if} +
+ +
+
+ + Custom Headers (optional) + + + +
+ {#if headerPairs.length > 0} +
+ {#each headerPairs as pair, index (index)} +
+ updatePairKey(index, e.currentTarget.value)} + class="flex-1" + /> + + +
+ {/each} +
+ {:else} +

No custom headers configured.

+ {/if} +
+
diff --git a/tools/server/webui/src/lib/components/app/chat/ChatSettings/McpSettingsSection.svelte b/tools/server/webui/src/lib/components/app/chat/ChatSettings/McpSettingsSection.svelte index 101dff27d4..3d5a720057 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatSettings/McpSettingsSection.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatSettings/McpSettingsSection.svelte @@ -1,15 +1,13 @@ @@ -137,150 +107,74 @@
-

MCP Servers

-

- Configure one or more MCP Servers. Only enabled servers with a URL are used. -

+

Manage Servers

- + {#if !isAddingServer} + + {/if}
- {#if getServers().length === 0} + + {#if isAddingServer} + +
+

Add New Server

+
+ + +
+
+ (newServerUrl = v)} + onHeadersChange={(v) => (newServerHeaders = v)} + urlError={newServerUrl ? newServerUrlError : null} + id="new-server" + /> +
+ {/if} + + {#if servers.length === 0 && !isAddingServer}
No MCP Servers configured yet. Add one to enable agentic features.
{/if} -
- {#each getServers() as server, index (server.id)} - {@const healthState = getHealthState(server.id)} - -
-
-
- - updateServer(server.id, { - enabled: Boolean(checked) - })} - /> -
- -

- {detectMcpTransportFromUrl(server.url) === 'websocket' - ? 'WebSocket' - : 'Streamable HTTP'} -

-
-
- -
- -
-
- -
-
- - - updateServer(server.id, { - url: event.currentTarget.value - })} - /> -
- -
- -
- { - const parsed = Number(event.currentTarget.value); - updateServer(server.id, { - requestTimeoutSeconds: - Number.isFinite(parsed) && parsed > 0 - ? parsed - : DEFAULT_MCP_CONFIG.requestTimeoutSeconds - }); - }} - /> - - -
-
-
- - {#if healthState.status !== 'idle'} -
- {#if healthState.status === 'loading'} -
- - Running health check... -
- {:else if isErrorState(healthState)} -

- Health check failed: {healthState.message} -

- {:else if isSuccessState(healthState)} - {#if healthState.tools.length === 0} -

No tools returned by this server.

- {:else} -
-

- Available tools ({healthState.tools.length}) -

-
    - {#each healthState.tools as tool (tool.name)} -
  • - - {tool.name} - - {tool.description ?? 'No description provided.'} -
  • - {/each} -
-
- {/if} - {/if} -
- {/if} -
- {/each} -
+ + {#if servers.length > 0} +
+ {#each servers as server (server.id)} + updateServer(server.id, { enabled })} + onUpdate={(updates) => updateServer(server.id, updates)} + onDelete={() => removeServer(server.id)} + /> + {/each} +
+ {/if}
diff --git a/tools/server/webui/src/lib/components/app/dialogs/DialogMcpServersSettings.svelte b/tools/server/webui/src/lib/components/app/dialogs/DialogMcpServersSettings.svelte new file mode 100644 index 0000000000..ab6f7d91cb --- /dev/null +++ b/tools/server/webui/src/lib/components/app/dialogs/DialogMcpServersSettings.svelte @@ -0,0 +1,75 @@ + + + + +
+ + + + MCP Servers + + + Add and configure MCP servers to enable agentic tool execution capabilities. + +
+ +
+ +
+ +
+ + +
+
+
diff --git a/tools/server/webui/src/lib/components/app/index.ts b/tools/server/webui/src/lib/components/app/index.ts index fe1d9cb77b..80a2cfa192 100644 --- a/tools/server/webui/src/lib/components/app/index.ts +++ b/tools/server/webui/src/lib/components/app/index.ts @@ -50,6 +50,7 @@ export { default as DialogConfirmation } from './dialogs/DialogConfirmation.svel export { default as DialogConversationSelection } from './dialogs/DialogConversationSelection.svelte'; export { default as DialogConversationTitleUpdate } from './dialogs/DialogConversationTitleUpdate.svelte'; export { default as DialogEmptyFileAlert } from './dialogs/DialogEmptyFileAlert.svelte'; +export { default as DialogMcpServersSettings } from './dialogs/DialogMcpServersSettings.svelte'; export { default as DialogModelInformation } from './dialogs/DialogModelInformation.svelte'; export { default as DialogModelNotAvailable } from './dialogs/DialogModelNotAvailable.svelte';