diff --git a/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte b/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte
index d151bb91d9..32125405ea 100644
--- a/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte
+++ b/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte
@@ -21,6 +21,7 @@
import githubLightCss from 'highlight.js/styles/github.css?inline';
import { mode } from 'mode-watcher';
import CodePreviewDialog from './CodePreviewDialog.svelte';
+ import { getImageErrorFallbackHtml } from '$lib/utils/image-error-fallback';
interface Props {
content: string;
@@ -345,24 +346,7 @@
// Create fallback element
const fallback = document.createElement('div');
fallback.className = 'image-load-error';
- fallback.innerHTML = `
-
-
-
External image cannot be displayed
-
- Open in new tab
-
-
-
- `;
+ fallback.innerHTML = getImageErrorFallbackHtml(src);
// Replace image with fallback
img.parentNode?.replaceChild(fallback, img);
diff --git a/tools/server/webui/src/lib/config/mcp.ts b/tools/server/webui/src/lib/config/mcp.ts
index 18f465ab3e..11f9def311 100644
--- a/tools/server/webui/src/lib/config/mcp.ts
+++ b/tools/server/webui/src/lib/config/mcp.ts
@@ -1,4 +1,9 @@
-import type { MCPClientConfig, MCPServerConfig, MCPServerSettingsEntry } from '$lib/types/mcp';
+import type {
+ MCPClientConfig,
+ MCPServerConfig,
+ MCPServerSettingsEntry,
+ McpServerUsageStats
+} from '$lib/types/mcp';
import type { SettingsConfigType } from '$lib/types/settings';
import type { McpServerOverride } from '$lib/types/database';
import { DEFAULT_MCP_CONFIG } from '$lib/constants/mcp';
@@ -144,8 +149,6 @@ export function hasEnabledMcpServers(
// MCP Server Usage Stats
// ─────────────────────────────────────────────────────────────────────────────
-export type McpServerUsageStats = Record;
-
/**
* Parse MCP server usage stats from settings.
*/
diff --git a/tools/server/webui/src/lib/mcp/host-manager.ts b/tools/server/webui/src/lib/mcp/host-manager.ts
index fe21105e12..7c3bd26def 100644
--- a/tools/server/webui/src/lib/mcp/host-manager.ts
+++ b/tools/server/webui/src/lib/mcp/host-manager.ts
@@ -21,41 +21,17 @@
* - Automatic tool-to-server routing
*/
-import { MCPServerConnection, type ToolExecutionResult } from './server-connection';
+import { MCPServerConnection } from './server-connection';
+import type { ToolExecutionResult } from '$lib/types/mcp';
import type {
- MCPClientConfig,
MCPToolCall,
- ClientCapabilities,
- Implementation
+ MCPHostManagerConfig,
+ OpenAIToolDefinition,
+ ServerStatus
} from '$lib/types/mcp';
import { MCPError } from '$lib/errors';
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
-export interface MCPHostManagerConfig {
- /** Server configurations keyed by server name */
- servers: MCPClientConfig['servers'];
- /** Client info to advertise to all servers */
- clientInfo?: Implementation;
- /** Default capabilities to advertise */
- capabilities?: ClientCapabilities;
-}
-
-export interface OpenAIToolDefinition {
- type: 'function';
- function: {
- name: string;
- description?: string;
- parameters: Record;
- };
-}
-
-export interface ServerStatus {
- name: string;
- isConnected: boolean;
- toolCount: number;
- error?: string;
-}
-
/**
* Manages multiple MCP server connections and provides unified tool access.
*/
diff --git a/tools/server/webui/src/lib/mcp/index.ts b/tools/server/webui/src/lib/mcp/index.ts
index e9a618e5ac..7337258001 100644
--- a/tools/server/webui/src/lib/mcp/index.ts
+++ b/tools/server/webui/src/lib/mcp/index.ts
@@ -1,20 +1,6 @@
// New architecture exports
export { MCPHostManager } from './host-manager';
-export type { MCPHostManagerConfig, OpenAIToolDefinition, ServerStatus } from './host-manager';
export { MCPServerConnection } from './server-connection';
-export type {
- MCPServerConnectionConfig,
- ToolCallParams,
- ToolExecutionResult
-} from './server-connection';
// Errors
export { MCPError } from '$lib/errors';
-
-// Types
-export type {
- MCPClientConfig,
- MCPServerConfig,
- MCPToolCall,
- MCPServerSettingsEntry
-} from '$lib/types/mcp';
diff --git a/tools/server/webui/src/lib/mcp/server-connection.ts b/tools/server/webui/src/lib/mcp/server-connection.ts
index 3ddf2c32f1..2abe081657 100644
--- a/tools/server/webui/src/lib/mcp/server-connection.ts
+++ b/tools/server/webui/src/lib/mcp/server-connection.ts
@@ -22,7 +22,11 @@ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
import { WebSocketClientTransport } from '@modelcontextprotocol/sdk/client/websocket.js';
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
-import type { MCPServerConfig, ClientCapabilities, Implementation } from '$lib/types/mcp';
+import type {
+ MCPServerConnectionConfig,
+ ToolCallParams,
+ ToolExecutionResult
+} from '$lib/types/mcp';
import { MCPError } from '$lib/errors';
import { DEFAULT_MCP_CONFIG } from '$lib/constants/mcp';
@@ -42,27 +46,6 @@ interface ToolCallResult {
_meta?: Record;
}
-export interface MCPServerConnectionConfig {
- /** Unique server name/identifier */
- name: string;
- /** Server configuration */
- server: MCPServerConfig;
- /** Client info to advertise */
- clientInfo?: Implementation;
- /** Capabilities to advertise */
- capabilities?: ClientCapabilities;
-}
-
-export interface ToolCallParams {
- name: string;
- arguments: Record;
-}
-
-export interface ToolExecutionResult {
- content: string;
- isError: boolean;
-}
-
/**
* Wraps the MCP SDK Client and provides a clean interface for tool operations.
*/
diff --git a/tools/server/webui/src/lib/stores/mcp.svelte.ts b/tools/server/webui/src/lib/stores/mcp.svelte.ts
index b5a18463fd..367ff24047 100644
--- a/tools/server/webui/src/lib/stores/mcp.svelte.ts
+++ b/tools/server/webui/src/lib/stores/mcp.svelte.ts
@@ -1,11 +1,7 @@
import { browser } from '$app/environment';
-import {
- MCPHostManager,
- type OpenAIToolDefinition,
- type ServerStatus
-} from '$lib/mcp/host-manager';
+import { MCPHostManager } from '$lib/mcp/host-manager';
import { MCPServerConnection } from '$lib/mcp/server-connection';
-import type { ToolExecutionResult } from '$lib/mcp/server-connection';
+import type { OpenAIToolDefinition, ServerStatus, ToolExecutionResult } from '$lib/types/mcp';
import { buildMcpClientConfig, incrementMcpServerUsage } from '$lib/config/mcp';
import { config, settingsStore } from '$lib/stores/settings.svelte';
import type { MCPToolCall } from '$lib/types/mcp';
diff --git a/tools/server/webui/src/lib/types/mcp.ts b/tools/server/webui/src/lib/types/mcp.ts
index e4f195ac17..ade450bedd 100644
--- a/tools/server/webui/src/lib/types/mcp.ts
+++ b/tools/server/webui/src/lib/types/mcp.ts
@@ -70,3 +70,63 @@ export type MCPServerSettingsEntry = {
/** Server icon URL from metadata (fetched during health check). */
iconUrl?: string;
};
+
+// ─────────────────────────────────────────────────────────────────────────────
+// Host Manager Types
+// ─────────────────────────────────────────────────────────────────────────────
+
+export interface MCPHostManagerConfig {
+ /** Server configurations keyed by server name */
+ servers: MCPClientConfig['servers'];
+ /** Client info to advertise to all servers */
+ clientInfo?: Implementation;
+ /** Default capabilities to advertise */
+ capabilities?: ClientCapabilities;
+}
+
+export interface OpenAIToolDefinition {
+ type: 'function';
+ function: {
+ name: string;
+ description?: string;
+ parameters: Record;
+ };
+}
+
+export interface ServerStatus {
+ name: string;
+ isConnected: boolean;
+ toolCount: number;
+ error?: string;
+}
+
+// ─────────────────────────────────────────────────────────────────────────────
+// Usage Stats
+// ─────────────────────────────────────────────────────────────────────────────
+
+export type McpServerUsageStats = Record;
+
+// ─────────────────────────────────────────────────────────────────────────────
+// Server Connection Types
+// ─────────────────────────────────────────────────────────────────────────────
+
+export interface MCPServerConnectionConfig {
+ /** Unique server name/identifier */
+ name: string;
+ /** Server configuration */
+ server: MCPServerConfig;
+ /** Client info to advertise */
+ clientInfo?: Implementation;
+ /** Capabilities to advertise */
+ capabilities?: ClientCapabilities;
+}
+
+export interface ToolCallParams {
+ name: string;
+ arguments: Record;
+}
+
+export interface ToolExecutionResult {
+ content: string;
+ isError: boolean;
+}
diff --git a/tools/server/webui/src/lib/utils/image-error-fallback.ts b/tools/server/webui/src/lib/utils/image-error-fallback.ts
new file mode 100644
index 0000000000..6e3260f4ae
--- /dev/null
+++ b/tools/server/webui/src/lib/utils/image-error-fallback.ts
@@ -0,0 +1,10 @@
+/**
+ * Simplified HTML fallback for external images that fail to load.
+ * Displays a centered message with a link to open the image in a new tab.
+ */
+export function getImageErrorFallbackHtml(src: string): string {
+ return `
+
Image cannot be displayed
+
(open link)
+
`;
+}