@mcp-ts/sdk 2.4.1 → 2.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/agui-adapter.d.mts +3 -4
- package/dist/adapters/agui-adapter.d.ts +3 -4
- package/dist/adapters/agui-middleware.d.mts +3 -4
- package/dist/adapters/agui-middleware.d.ts +3 -4
- package/dist/adapters/ai-adapter.d.mts +3 -4
- package/dist/adapters/ai-adapter.d.ts +3 -4
- package/dist/adapters/langchain-adapter.d.mts +3 -4
- package/dist/adapters/langchain-adapter.d.ts +3 -4
- package/dist/adapters/mastra-adapter.d.mts +2 -2
- package/dist/adapters/mastra-adapter.d.ts +2 -2
- package/dist/bin/mcp-ts.js +5 -5
- package/dist/bin/mcp-ts.js.map +1 -1
- package/dist/bin/mcp-ts.mjs +5 -5
- package/dist/bin/mcp-ts.mjs.map +1 -1
- package/dist/client/index.d.mts +2 -3
- package/dist/client/index.d.ts +2 -3
- package/dist/client/react.d.mts +4 -6
- package/dist/client/react.d.ts +4 -6
- package/dist/client/vue.d.mts +4 -6
- package/dist/client/vue.d.ts +4 -6
- package/dist/{index-Ch7ouNSa.d.ts → index-B8kJSrBJ.d.ts} +1 -2
- package/dist/{index-L5XoXgsb.d.mts → index-DiJsm_lK.d.mts} +1 -2
- package/dist/index.d.mts +5 -6
- package/dist/index.d.ts +5 -6
- package/dist/index.js +174 -110
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +174 -110
- package/dist/index.mjs.map +1 -1
- package/dist/{multi-session-client-k-9RvWvi.d.mts → multi-session-client-B6hsYO8V.d.mts} +218 -71
- package/dist/{multi-session-client-Bwm-efqg.d.ts → multi-session-client-DOBvtaQV.d.ts} +218 -71
- package/dist/server/index.d.mts +5 -128
- package/dist/server/index.d.ts +5 -128
- package/dist/server/index.js +174 -110
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +174 -110
- package/dist/server/index.mjs.map +1 -1
- package/dist/shared/index.d.mts +4 -5
- package/dist/shared/index.d.ts +4 -5
- package/dist/{tool-router-CuApsDiV.d.mts → tool-router-CbG4Tum6.d.mts} +1 -1
- package/dist/{tool-router-CZMrOG8J.d.ts → tool-router-ChIhPwgP.d.ts} +1 -1
- package/dist/{types-DCk_IF4L.d.mts → types-CjczQwNX.d.mts} +122 -1
- package/dist/{types-DCk_IF4L.d.ts → types-CjczQwNX.d.ts} +122 -1
- package/package.json +1 -1
- package/src/bin/mcp-ts.ts +5 -5
- package/src/server/mcp/multi-session-client.ts +190 -132
- package/src/server/mcp/oauth-client.ts +49 -7
- package/src/server/storage/index.ts +8 -8
- package/dist/events-C4m7tK1U.d.mts +0 -122
- package/dist/events-C4m7tK1U.d.ts +0 -122
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/server/storage/redis.ts","../src/index.ts","../src/server/index.ts","../src/server/mcp/oauth-client.ts","../src/server/mcp/storage-oauth-provider.ts","../src/server/storage/index.ts","../src/server/storage/redis-backend.ts","../src/shared/utils.ts","../src/server/storage/session-lifecycle.ts","../src/shared/constants.ts","../src/server/storage/memory-backend.ts","../src/server/storage/file-backend.ts","../src/server/storage/sqlite-backend.ts","../src/server/storage/supabase-backend.ts","../src/server/storage/crypto.ts","../src/server/storage/neon-backend.ts","../src/server/storage/types.ts","../src/shared/events.ts","../src/shared/errors.ts","../src/server/mcp/multi-session-client.ts","../src/server/handlers/sse-handler.ts","../src/shared/event-routing.ts","../src/server/handlers/nextjs-handler.ts","../src/client/index.ts","../src/client/core/sse-client.ts","../src/client/core/app-host.ts","../src/client/utils/app-host-utils.ts","../src/client/core/constants.ts","../src/shared/index.ts","../src/shared/types.ts","../src/shared/tool-utils.ts","../src/shared/tool-router.ts","../src/shared/tool-index.ts","../src/shared/schema-compressor.ts","../src/shared/meta-tools.ts"],"names":["customAlphabet","redis","sessions","path","fs","path2","fs2","randomBytes","createCipheriv","createDecipheriv","getRedis","nanoid","SSEClientTransport","StreamableHTTPClientTransport","Client","SDKUnauthorizedError","ListToolsResultSchema","CallToolResultSchema","ListPromptsResultSchema","GetPromptResultSchema","ListResourcesResultSchema","ReadResourceResultSchema","manager","data","AppBridge","PostMessageTransport","b","limit","text"],"mappings":"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","file":"index.js","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\n * Redis connection management with dependency injection support\n * Allows configuration and testing without environment variables\n */\nimport type { Redis } from 'ioredis';\n\nexport interface RedisConfig {\n /**\n * Redis connection URL (defaults to REDIS_URL env var)\n */\n url?: string;\n\n /**\n * Enable lazy connection (default: true)\n */\n lazyConnect?: boolean;\n\n /**\n * Maximum retries per request (default: 1)\n */\n maxRetriesPerRequest?: number;\n\n /**\n * Enable verbose logging (default: false)\n */\n verbose?: boolean;\n /**\n * @internal For testing only - bypass ioredis import\n */\n RedisConstructor?: any;\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __redis: Redis | undefined;\n var __redisConfig: RedisConfig | undefined;\n}\n\nlet redisInstance: Redis | null = null;\n\n/**\n * Initialize Redis with custom configuration\n * Call this before any Redis operations if you need custom config\n * @param config - Redis configuration options\n */\nexport async function initRedis(config: RedisConfig): Promise<Redis> {\n if (redisInstance) {\n // Already initialized, return existing instance\n return redisInstance;\n }\n\n const url = config.url ?? process.env.REDIS_URL;\n\n if (!url) {\n throw new Error(\n 'Redis URL is required. Set REDIS_URL environment variable or pass url in config.'\n );\n }\n\n let Redis: typeof import('ioredis').Redis;\n if (config.RedisConstructor) {\n Redis = config.RedisConstructor;\n } else {\n try {\n const ioredis = await import('ioredis');\n Redis = ioredis.Redis;\n } catch (error) {\n throw new Error(\n 'ioredis is not installed. Install it with:\\n' +\n ' npm install ioredis\\n\\n' +\n 'Or use a different storage backend:\\n' +\n ' MCP_TS_STORAGE_TYPE=memory (for development)\\n' +\n ' MCP_TS_STORAGE_TYPE=file (for local persistence)'\n );\n }\n }\n\n redisInstance = new Redis(url, {\n lazyConnect: config.lazyConnect ?? true,\n maxRetriesPerRequest: config.maxRetriesPerRequest ?? 1,\n });\n\n if (config.verbose !== false) {\n redisInstance.on('ready', () => {\n console.log('✅ Redis connected');\n });\n\n redisInstance.on('error', (err) => {\n console.error('❌ Redis error:', err.message);\n });\n\n redisInstance.on('reconnecting', () => {\n console.log('🔄 Redis reconnecting...');\n });\n }\n\n // Store globally for hot reloading scenarios\n global.__redis = redisInstance;\n global.__redisConfig = config;\n\n return redisInstance;\n}\n\n/**\n * Get the Redis instance\n * Automatically initializes with default config if not already initialized\n */\nexport async function getRedis(): Promise<Redis> {\n if (redisInstance) {\n return redisInstance;\n }\n\n // Check for existing global instance (hot reload scenario)\n if (global.__redis) {\n redisInstance = global.__redis;\n return redisInstance;\n }\n\n // Initialize with default config\n return await initRedis({});\n}\n\n/**\n * Set a custom Redis instance (useful for testing with mocks)\n * @param instance - Redis instance or mock\n */\nexport function setRedisInstance(instance: Redis): void {\n redisInstance = instance;\n global.__redis = instance;\n}\n\n/**\n * Close Redis connection and clear instance\n */\nexport async function closeRedis(): Promise<void> {\n if (redisInstance) {\n await redisInstance.quit();\n redisInstance = null;\n global.__redis = undefined;\n }\n}\n\n/**\n * Default Redis export for backward compatibility\n * Will auto-initialize on first access\n * Note: This is a lazy proxy that initializes Redis on first method call\n */\nexport const redis = new Proxy({} as Redis, {\n get(_target, prop) {\n // Return a function that handles async initialization\n return async (...args: any[]) => {\n const instance = await getRedis();\n const value = (instance as any)[prop];\n if (typeof value === 'function') {\n return value.apply(instance, args);\n }\n return value;\n };\n },\n});\n","/**\n * MCP Redis\n * Redis-backed MCP client with OAuth 2.1 and real-time SSE connections\n *\n * @packageDocumentation\n */\n\n// Re-export everything from subpackages\nexport * from './server';\nexport * from './client';\nexport * from './shared';\n","/**\n * MCP Redis Server Package\n * Node.js server-side exports for MCP connection management with Redis\n */\n\n/** Core MCP client and session management */\nexport { MCPClient } from './mcp/oauth-client.js';\nexport { UnauthorizedError } from '../shared/errors.js';\nexport { sessions, onSessionMutation, type SessionStore } from './storage/index.js';\nexport { StorageOAuthClientProvider } from './mcp/storage-oauth-provider.js';\nexport { MultiSessionClient } from './mcp/multi-session-client.js';\n\n/** SSE handler for real-time connections */\nexport { createSSEHandler, SSEConnectionManager, type SSEHandlerOptions, type ClientMetadata } from './handlers/sse-handler.js';\n\n/** Next.js App Router handler (recommended for Next.js 13+) */\nexport { createNextMcpHandler, type NextMcpHandlerOptions } from './handlers/nextjs-handler.js';\n\n/** Session provider abstraction */\n\n/** Utilities */\nexport { sanitizeServerLabel } from '../shared/utils';\n\n/** Re-export shared types */\nexport type {\n McpConnectionEvent,\n McpConnectionState,\n McpObservabilityEvent,\n Emitter,\n Disposable,\n Event,\n} from '../shared/events';\n\nexport type {\n ToolClient,\n ToolClientProvider,\n ToolInfo,\n McpRpcRequest,\n McpRpcResponse,\n ConnectRequest,\n ConnectResponse,\n ListToolsResponse,\n CallToolRequest,\n CallToolResponse,\n} from '../shared/types';\n\nexport type {\n Session,\n SessionMutationEvent,\n SessionMutationListener,\n SessionMutationType,\n} from './storage/types.js';\n\n/** Re-export MCP SDK types for convenience */\nexport type {\n OAuthClientMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nexport type {\n ListToolsResult,\n CallToolResult,\n Tool,\n} from '@modelcontextprotocol/sdk/types.js';\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { nanoid } from 'nanoid';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport {\n UnauthorizedError as SDKUnauthorizedError,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport {\n ListToolsRequest,\n ListToolsResult,\n ListToolsResultSchema,\n CallToolRequest,\n CallToolResult,\n CallToolResultSchema,\n ListPromptsRequest,\n ListPromptsResult,\n ListPromptsResultSchema,\n GetPromptRequest,\n GetPromptResult,\n GetPromptResultSchema,\n ListResourcesRequest,\n ListResourcesResult,\n ListResourcesResultSchema,\n ReadResourceRequest,\n ReadResourceResult,\n ReadResourceResultSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { StorageOAuthClientProvider, type AgentsOAuthProvider } from './storage-oauth-provider.js';\nimport { Emitter, type McpConnectionEvent, type McpObservabilityEvent, type McpConnectionState } from '../../shared/events.js';\nimport { UnauthorizedError } from '../../shared/errors.js';\nimport { sessions } from '../storage/index.js';\nimport type { Session, SessionStatus } from '../storage/types.js';\nimport {\n MCP_CLIENT_NAME,\n MCP_CLIENT_VERSION,\n} from '../../shared/constants.js';\n\n/**\n * Supported MCP transport types\n */\nexport type TransportType = 'sse' | 'streamable-http';\n\n/**\n * Extended capabilities including MCP App support\n */\nimport type { ClientCapabilities } from '@modelcontextprotocol/sdk/types.js';\n\ninterface McpAppClientCapabilities extends Omit<ClientCapabilities, 'extensions'> {\n extensions?: {\n 'io.modelcontextprotocol/ui'?: {\n mimeTypes: string[];\n };\n [key: string]: any;\n };\n}\n\nexport interface MCPOAuthClientOptions {\n serverUrl?: string;\n serverName?: string;\n callbackUrl?: string;\n onRedirect?: (url: string) => void;\n userId: string;\n serverId?: string; /** Optional - loaded from session if not provided */\n sessionId: string; /** Required - primary key for session lookup */\n transportType?: TransportType;\n clientId?: string;\n clientSecret?: string;\n headers?: Record<string, string>;\n /** OAuth Client Metadata (optional - user application info) */\n clientName?: string;\n clientUri?: string;\n logoUri?: string;\n policyUri?: string;\n}\n\n/**\n * MCP Client with OAuth 2.1 authentication support\n * Manages connections to MCP servers with automatic token refresh and session restoration\n * Emits connection lifecycle events for observability\n */\nexport class MCPClient {\n private client: Client | null = null;\n public oauthProvider: AgentsOAuthProvider | null = null;\n private transport: StreamableHTTPClientTransport | SSEClientTransport | null = null;\n private userId: string;\n private serverId?: string;\n private sessionId: string;\n private serverName?: string;\n private transportType: TransportType | undefined;\n private serverUrl: string | undefined;\n private callbackUrl: string | undefined;\n private onRedirect: ((url: string) => void) | undefined;\n private clientId?: string;\n private clientSecret?: string;\n private headers?: Record<string, string>;\n /** OAuth Client Metadata */\n private clientName?: string;\n private clientUri?: string;\n private logoUri?: string;\n private policyUri?: string;\n private createdAt?: number;\n\n\n /** Event emitters for connection lifecycle */\n private readonly _onConnectionEvent = new Emitter<McpConnectionEvent>();\n public readonly onConnectionEvent = this._onConnectionEvent.event;\n\n private readonly _onObservabilityEvent = new Emitter<McpObservabilityEvent>();\n public readonly onObservabilityEvent = this._onObservabilityEvent.event;\n\n private currentState: McpConnectionState = 'DISCONNECTED';\n\n /**\n * Creates a new MCP client instance\n * Can be initialized with minimal options (userId + sessionId) for session restoration\n * @param options - Client configuration options\n */\n constructor(options: MCPOAuthClientOptions) {\n this.serverUrl = options.serverUrl;\n this.serverName = options.serverName;\n this.callbackUrl = options.callbackUrl;\n this.onRedirect = options.onRedirect;\n this.userId = options.userId;\n this.serverId = options.serverId;\n this.sessionId = options.sessionId;\n this.transportType = options.transportType;\n this.clientId = options.clientId;\n this.clientSecret = options.clientSecret;\n this.headers = options.headers;\n this.clientName = options.clientName;\n this.clientUri = options.clientUri;\n this.logoUri = options.logoUri;\n this.policyUri = options.policyUri;\n }\n\n /**\n * Emit a connection state change event\n * @private\n */\n private emitStateChange(newState: McpConnectionState): void {\n const previousState = this.currentState;\n this.currentState = newState;\n\n if (!this.serverId) return;\n\n this._onConnectionEvent.fire({\n type: 'state_changed',\n sessionId: this.sessionId,\n serverId: this.serverId,\n serverName: this.serverName || this.serverId,\n serverUrl: this.serverUrl || '',\n createdAt: this.createdAt,\n state: newState,\n previousState,\n timestamp: Date.now(),\n });\n\n this._onObservabilityEvent.fire({\n type: 'mcp:client:state_change',\n level: 'info',\n message: `Connection state: ${previousState} → ${newState}`,\n displayMessage: `State changed to ${newState}`,\n sessionId: this.sessionId,\n serverId: this.serverId,\n payload: { previousState, newState },\n timestamp: Date.now(),\n id: nanoid(),\n });\n }\n\n /**\n * Emit an error event\n * @private\n */\n private emitError(error: string, errorType: 'connection' | 'auth' | 'validation' | 'unknown' = 'unknown'): void {\n if (!this.serverId) return;\n\n this._onConnectionEvent.fire({\n type: 'error',\n sessionId: this.sessionId,\n serverId: this.serverId,\n error,\n errorType,\n timestamp: Date.now(),\n });\n\n this._onObservabilityEvent.fire({\n type: 'mcp:client:error',\n level: 'error',\n message: error,\n displayMessage: error,\n sessionId: this.sessionId,\n serverId: this.serverId,\n payload: { errorType, error },\n timestamp: Date.now(),\n id: nanoid(),\n });\n }\n\n /**\n * Emit a progress event\n * @private\n */\n private emitProgress(message: string): void {\n if (!this.serverId) return;\n\n this._onConnectionEvent.fire({\n type: 'progress',\n sessionId: this.sessionId,\n serverId: this.serverId,\n message,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Get current connection state\n */\n getConnectionState(): McpConnectionState {\n return this.currentState;\n }\n\n /**\n * Helper to create a transport instance\n * @param type - The transport type to create\n * @returns Configured transport instance\n * @private\n */\n private getTransport(type: TransportType): StreamableHTTPClientTransport | SSEClientTransport {\n if (!this.serverUrl) {\n throw new Error('Server URL is required to create transport');\n }\n\n const baseUrl = new URL(this.serverUrl);\n const hasAuthorizationHeader = Object.keys(this.headers || {})\n .some((key) => key.toLowerCase() === 'authorization');\n const transportOptions = {\n ...(!hasAuthorizationHeader && { authProvider: this.oauthProvider! }),\n ...(this.headers && { requestInit: { headers: this.headers } }),\n /**\n * Custom fetch implementation to handle connection timeouts.\n * Observation: SDK 1.24.0+ connections may hang indefinitely in some environments.\n * This wrapper enforces a timeout and properly uses AbortController to unblock the request.\n */\n fetch: async (url: RequestInfo | URL, init?: RequestInit) => {\n const timeout = 30000;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n const signal = init?.signal ?\n // @ts-ignore: AbortSignal.any is available in Node 20+\n (AbortSignal.any ? AbortSignal.any([init.signal, controller.signal]) : controller.signal) :\n controller.signal;\n\n try {\n const response = await fetch(url, { ...init, signal });\n \n const hasSessionHeader = init?.headers && new Headers(init.headers as HeadersInit).has('mcp-session-id');\n\n if (response.status === 404 && hasSessionHeader) {\n this.client = null;\n throw new Error(\"MCP_SESSION_EXPIRED: Downstream session was not found on the server.\");\n }\n\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n };\n\n if (type === 'sse') {\n return new SSEClientTransport(baseUrl, transportOptions);\n } else {\n return new StreamableHTTPClientTransport(baseUrl, transportOptions);\n }\n }\n\n /**\n * Initializes client components (client, transport, OAuth provider)\n * Loads missing configuration from Redis session store if needed\n * This method is idempotent and safe to call multiple times\n * @private\n */\n private async initialize(): Promise<void> {\n if (this.client && this.oauthProvider) {\n return;\n }\n\n this.emitStateChange('INITIALIZING');\n this.emitProgress('Loading session configuration...');\n\n let existingSession: Session | null = null;\n\n if (!this.serverUrl || !this.callbackUrl || !this.serverId) {\n existingSession = await sessions.get(this.userId, this.sessionId);\n if (!existingSession) {\n throw new Error(`Session not found: ${this.sessionId}`);\n }\n\n this.serverUrl = this.serverUrl || existingSession.serverUrl;\n this.callbackUrl = this.callbackUrl || existingSession.callbackUrl;\n /**\n * Do NOT load transportType from session if not explicitly provided.\n * We want to re-negotiate (try streamable -> sse) on new connections if in \"Auto\" mode.\n * this.transportType = this.transportType || sessionData.transportType; \n */\n this.serverName = this.serverName || existingSession.serverName;\n this.serverId = this.serverId || existingSession.serverId || 'unknown';\n this.headers = this.headers || existingSession.headers;\n this.createdAt = existingSession.createdAt;\n }\n\n if (!this.serverUrl || !this.callbackUrl || !this.serverId) {\n throw new Error('Missing required connection metadata');\n }\n\n if (!this.oauthProvider) {\n if (!this.serverId) {\n throw new Error('serverId required for OAuth provider initialization');\n }\n this.oauthProvider = new StorageOAuthClientProvider({\n userId: this.userId,\n serverId: this.serverId,\n sessionId: this.sessionId,\n redirectUrl: this.callbackUrl!,\n clientName: this.clientName,\n clientUri: this.clientUri,\n logoUri: this.logoUri,\n policyUri: this.policyUri,\n clientId: this.clientId,\n clientSecret: this.clientSecret,\n onRedirect: (redirectUrl: string) => {\n if (this.onRedirect) {\n this.onRedirect(redirectUrl);\n }\n }\n });\n }\n\n if (!this.client) {\n this.client = new Client(\n {\n name: MCP_CLIENT_NAME,\n version: MCP_CLIENT_VERSION,\n },\n {\n capabilities: {\n extensions: {\n 'io.modelcontextprotocol/ui': {\n mimeTypes: ['text/html+mcp'],\n },\n },\n } as McpAppClientCapabilities\n }\n );\n }\n\n // Create session in the session store if it doesn't exist yet\n // This is needed BEFORE OAuth flow starts because the OAuth provider\n // will call saveCodeVerifier() which requires the session to exist\n if (existingSession === null) {\n existingSession = await sessions.get(this.userId, this.sessionId);\n }\n if (!existingSession && this.serverId && this.serverUrl && this.callbackUrl) {\n this.createdAt = Date.now();\n const updatedAt = this.createdAt;\n console.log(`[MCPClient] Creating pending session ${this.sessionId} for connection setup`);\n await sessions.create({\n sessionId: this.sessionId,\n userId: this.userId,\n serverId: this.serverId,\n serverName: this.serverName,\n serverUrl: this.serverUrl,\n callbackUrl: this.callbackUrl,\n transportType: this.transportType || 'streamable-http',\n headers: this.headers,\n createdAt: this.createdAt,\n updatedAt,\n status: 'pending',\n });\n }\n }\n\n /**\n * Saves current session state to the session store\n * Creates new session if it doesn't exist, updates if it does\n * @param status - Session lifecycle status used by storage cleanup\n * @private\n */\n private async saveSession(\n status: SessionStatus = 'active',\n existingSession?: Session | null\n ): Promise<void> {\n if (!this.sessionId || !this.serverId || !this.serverUrl || !this.callbackUrl) {\n return;\n }\n\n const sessionData = {\n sessionId: this.sessionId,\n userId: this.userId,\n serverId: this.serverId,\n serverName: this.serverName,\n serverUrl: this.serverUrl,\n callbackUrl: this.callbackUrl,\n transportType: (this.transportType || 'streamable-http') as TransportType,\n headers: this.headers,\n createdAt: this.createdAt || Date.now(),\n updatedAt: Date.now(),\n status,\n };\n if (status === 'active') {\n (sessionData as typeof sessionData & { authUrl: null }).authUrl = null;\n }\n\n // Try to update first, create if doesn't exist\n if (existingSession === undefined) {\n existingSession = await sessions.get(this.userId, this.sessionId);\n }\n if (existingSession) {\n await sessions.update(this.userId, this.sessionId, sessionData);\n } else {\n await sessions.create(sessionData);\n }\n }\n\n /**\n * Removes transient setup/auth sessions without masking the original error.\n * @private\n */\n private async deleteTransientSession(): Promise<void> {\n try {\n await sessions.delete(this.userId, this.sessionId);\n } catch {\n // Best effort only: preserve the original connection/auth error.\n }\n }\n\n /**\n * Try to connect using available transports\n * @returns The corrected transport type object if successful\n * @private\n */\n private async tryConnect(): Promise<{ transportType: TransportType }> {\n /**\n * If exact transport type is known, only try that.\n * Otherwise (auto mode), try streamable_http first, then sse.\n */\n const transportsToTry: TransportType[] = this.transportType\n ? [this.transportType]\n : ['streamable-http', 'sse'];\n\n let lastError: unknown;\n\n for (const currentType of transportsToTry) {\n const isLastAttempt = currentType === transportsToTry[transportsToTry.length - 1];\n\n try {\n const transport = this.getTransport(currentType);\n\n /** Update local state with the transport we are about to try */\n this.transport = transport;\n\n /** Race connection against timeout */\n await this.client!.connect(transport);\n\n /** Success! Return the type that worked */\n return { transportType: currentType };\n\n } catch (error: any) {\n lastError = error;\n\n /** Check for Auth Errors - these should fail immediately, no fallback */\n const isAuthError = error instanceof SDKUnauthorizedError ||\n (error instanceof Error && error.message.toLowerCase().includes('unauthorized'));\n\n if (isAuthError) {\n throw error;\n }\n\n /** If this was the last transport to try, throw the error */\n if (isLastAttempt) {\n throw error;\n }\n\n /** Otherwise, log and continue to next transport */\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.emitProgress(`Connection attempt with ${currentType} failed: ${errorMessage}. Retrying...`);\n this._onObservabilityEvent.fire({\n level: 'warn',\n message: `Transport ${currentType} failed, falling back`,\n sessionId: this.sessionId,\n serverId: this.serverId,\n metadata: {\n failedTransport: currentType,\n error: errorMessage\n },\n timestamp: Date.now(),\n });\n }\n }\n\n throw lastError || new Error('No transports available');\n }\n\n /**\n * Connects to the MCP server\n * Automatically validates and refreshes OAuth tokens if needed\n * Saves session to Redis on first successful connection\n * @throws {UnauthorizedError} When OAuth authorization is required\n * @throws {Error} When connection fails for other reasons\n */\n async connect(): Promise<void> {\n // Re-entry guard: if a previous SDK Client is still attached to a transport\n // (e.g. a stale session from a prior connect() call on the same MCPClient\n // instance), close and detach it before proceeding. The MCP SDK client will\n // throw if asked to connect while a transport is already attached, and the\n // stale transport would send an expired mcp-session-id to the remote server\n // causing \"Session not found. Reconnect without session header.\" errors.\n //\n // We also null out this.client so that initialize() creates a fresh Client\n // instance with a clean transport slot, rather than reusing the old one.\n // The oauthProvider is intentionally preserved — OAuth tokens remain valid\n // across reconnects; only the transport session needs to be renegotiated.\n if (this.client?.transport) {\n this.transport = null;\n try {\n await this.client.close();\n } catch {\n // Closing a transport that may have already failed is best-effort.\n }\n this.client = null;\n }\n\n await this.initialize();\n\n if (!this.client || !this.oauthProvider) {\n const error = 'Client or OAuth provider not initialized';\n this.emitError(error, 'connection');\n this.emitStateChange('FAILED');\n throw new Error(error);\n }\n\n try {\n this.emitStateChange('CONNECTING');\n\n /** Use the tryConnect loop to handle transport fallbacks */\n const { transportType } = await this.tryConnect();\n\n /** Update transport type to the one that actually worked */\n this.transportType = transportType;\n\n this.emitStateChange('CONNECTED');\n this.emitProgress('Connected successfully');\n\n // Refresh session metadata on every successful connect so active sessions\n // record ongoing usage and don't look dormant to session cleanup jobs.\n console.log(`[MCPClient] Saving active session ${this.sessionId} (connect success)`);\n await this.saveSession('active');\n } catch (error) {\n /** Handle Authentication Errors */\n if (\n error instanceof SDKUnauthorizedError ||\n (error instanceof Error && error.message.toLowerCase().includes('unauthorized'))\n ) {\n /** Set when the SDK calls redirectToAuthorization on the OAuth provider */\n let authUrl = '';\n if (this.oauthProvider) {\n authUrl = (this.oauthProvider.authUrl || '').trim();\n }\n\n /**\n * 401 without a usable URL means metadata/DCR failed or the server never started\n * an interactive OAuth flow — not recoverable as \"pending OAuth\".\n */\n if (!authUrl) {\n const detail =\n error instanceof Error && error.message.trim().length > 0\n ? error.message.trim()\n : 'Unauthorized';\n const message =\n detail.toLowerCase() === 'unauthorized'\n ? 'OAuth authorization URL not available'\n : `OAuth authorization URL not available: ${detail}`;\n this.emitError(message, 'auth');\n this.emitStateChange('FAILED');\n \n // Remove terminal setup failures immediately. Active sessions are not\n // deleted here because this branch only runs before OAuth is available.\n await this.deleteTransientSession();\n \n throw new Error(message);\n }\n\n this.emitStateChange('AUTHENTICATING');\n console.log(`[MCPClient] Saving pending OAuth session ${this.sessionId}`);\n await this.saveSession('pending');\n\n if (this.serverId) {\n this._onConnectionEvent.fire({\n type: 'auth_required',\n sessionId: this.sessionId,\n serverId: this.serverId,\n authUrl,\n timestamp: Date.now(),\n });\n\n if (authUrl && this.onRedirect) {\n this.onRedirect(authUrl);\n }\n }\n\n throw new UnauthorizedError('OAuth authorization required');\n }\n\n /** Handle Generic Errors */\n const errorMessage = error instanceof Error ? error.message : 'Connection failed';\n this.emitError(errorMessage, 'connection');\n this.emitStateChange('FAILED');\n\n // Remove transient sessions that failed before becoming restorable.\n // Existing active sessions may still hold usable credentials for reconnect.\n try {\n const existingSession = await sessions.get(this.userId, this.sessionId);\n if (!existingSession || existingSession.status !== 'active') {\n await sessions.delete(this.userId, this.sessionId);\n }\n } catch {\n // Best effort only: preserve the original connection error.\n }\n\n throw error;\n }\n }\n\n /**\n * Completes OAuth authorization flow by exchanging authorization code for tokens\n * Creates new authenticated client and transport, then establishes connection\n * Saves active session to Redis after successful authentication\n * @param authCode - Authorization code received from OAuth callback\n */\n\n // TODO: needs to be optimized\n async finishAuth(authCode: string, state?: string): Promise<void> {\n this.emitStateChange('AUTHENTICATING');\n this.emitProgress('Exchanging authorization code for tokens...');\n\n await this.initialize();\n\n if (!this.oauthProvider) {\n const error = 'OAuth provider not initialized';\n this.emitError(error, 'auth');\n this.emitStateChange('FAILED');\n throw new Error(error);\n }\n\n if (state) {\n const stateCheck = await this.oauthProvider.checkState(state);\n if (!stateCheck.valid) {\n const error = stateCheck.error || 'Invalid OAuth state';\n this.emitError(error, 'auth');\n this.emitStateChange('FAILED');\n throw new Error(error);\n }\n\n await this.oauthProvider.consumeState(state);\n }\n\n /**\n * Determine which transports to try for finishing auth\n * If transportType is set, use only that. Otherwise try streamable_http then sse.\n */\n const transportsToTry: TransportType[] = this.transportType\n ? [this.transportType]\n : ['streamable-http', 'sse'];\n\n let lastError: unknown;\n let tokensExchanged = false;\n let authenticatedStateEmitted = false;\n\n for (const currentType of transportsToTry) {\n const isLastAttempt = currentType === transportsToTry[transportsToTry.length - 1];\n\n try {\n const transport = this.getTransport(currentType);\n\n /** Update local state with the transport we are about to try */\n this.transport = transport;\n\n if (!tokensExchanged) {\n await transport.finishAuth(authCode);\n tokensExchanged = true;\n } else {\n this.emitProgress(`Tokens already exchanged, skipping auth step for ${currentType}...`);\n }\n\n if (!authenticatedStateEmitted) {\n this.emitStateChange('AUTHENTICATED');\n authenticatedStateEmitted = true;\n }\n\n this.emitProgress('Creating authenticated client...');\n\n this.client = new Client(\n {\n name: MCP_CLIENT_NAME,\n version: MCP_CLIENT_VERSION,\n },\n {\n capabilities: {\n extensions: {\n 'io.modelcontextprotocol/ui': {\n mimeTypes: ['text/html+mcp'],\n },\n },\n } as McpAppClientCapabilities\n }\n );\n\n this.emitStateChange('CONNECTING');\n\n /** We explicitly try to connect with the transport we just auth'd with first */\n await this.client.connect(this.transport);\n\n /** Connection succeeded — lock in the transport type */\n this.transportType = currentType;\n\n this.emitStateChange('CONNECTED');\n console.log(`[MCPClient] Saving active session ${this.sessionId} (OAuth complete)`);\n await this.saveSession('active');\n\n return; // Success, exit function\n\n } catch (error) {\n lastError = error;\n\n const isAuthError = error instanceof SDKUnauthorizedError ||\n (error instanceof Error && error.message.toLowerCase().includes('unauthorized'));\n\n if (isAuthError) {\n throw error;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Don't retry if the authorization code was rejected (it's one-time use)\n if (!tokensExchanged && errorMessage.toLowerCase().includes('invalid authorization code')) {\n const msg = error instanceof Error ? error.message : 'Authentication failed';\n this.emitError(msg, 'auth');\n this.emitStateChange('FAILED');\n await this.deleteTransientSession();\n throw error;\n }\n\n if (isLastAttempt) {\n const msg = error instanceof Error ? error.message : 'Authentication failed';\n this.emitError(msg, 'auth');\n this.emitStateChange('FAILED');\n await this.deleteTransientSession();\n throw error;\n }\n\n // Log and retry\n this.emitProgress(`Auth attempt with ${currentType} failed: ${errorMessage}. Retrying...`);\n }\n }\n\n if (lastError) {\n const errorMessage = lastError instanceof Error ? lastError.message : 'Authentication failed';\n this.emitError(errorMessage, 'auth');\n this.emitStateChange('FAILED');\n await this.deleteTransientSession();\n throw lastError;\n }\n }\n\n /**\n * Lists all available tools from the connected MCP server\n * @returns List of tools with their schemas and descriptions\n * @throws {Error} When client is not connected\n */\n async listTools(): Promise<ListToolsResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n this.emitStateChange('DISCOVERING');\n\n try {\n const request: ListToolsRequest = {\n method: 'tools/list',\n params: {},\n };\n\n const result = await this.client.request(request, ListToolsResultSchema);\n\n if (this.serverId) {\n this._onConnectionEvent.fire({\n type: 'tools_discovered',\n sessionId: this.sessionId,\n serverId: this.serverId,\n toolCount: result.tools.length,\n tools: result.tools,\n timestamp: Date.now(),\n });\n }\n\n this.emitStateChange('READY');\n this.emitProgress(`Discovered ${result.tools.length} tools`);\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to list tools';\n this.emitError(errorMessage, 'validation');\n this.emitStateChange('FAILED');\n throw error;\n }\n }\n\n /**\n * Executes a tool on the connected MCP server\n * @param toolName - Name of the tool to execute\n * @param toolArgs - Arguments to pass to the tool\n * @returns Tool execution result\n * @throws {Error} When client is not connected\n */\n async callTool(toolName: string, toolArgs: Record<string, unknown>): Promise<CallToolResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n const request: CallToolRequest = {\n method: 'tools/call',\n params: {\n name: toolName,\n arguments: toolArgs,\n },\n };\n\n try {\n const result = await this.client.request(request, CallToolResultSchema);\n\n this._onObservabilityEvent.fire({\n type: 'mcp:client:tool_call',\n level: 'info',\n message: `Tool ${toolName} called successfully`,\n displayMessage: `Called tool ${toolName}`,\n sessionId: this.sessionId,\n serverId: this.serverId,\n payload: {\n toolName,\n args: toolArgs,\n },\n timestamp: Date.now(),\n id: nanoid(),\n });\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : `Failed to call tool ${toolName}`;\n\n this._onObservabilityEvent.fire({\n type: 'mcp:client:error',\n level: 'error',\n message: errorMessage,\n displayMessage: `Failed to call tool ${toolName}`,\n sessionId: this.sessionId,\n serverId: this.serverId,\n payload: {\n errorType: 'tool_execution',\n error: errorMessage,\n toolName,\n args: toolArgs,\n },\n timestamp: Date.now(),\n id: nanoid(),\n });\n\n throw error;\n }\n }\n\n /**\n * Lists all available prompts from the connected MCP server\n * @returns List of available prompts\n * @throws {Error} When client is not connected\n */\n async listPrompts(): Promise<ListPromptsResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n this.emitStateChange('DISCOVERING');\n\n try {\n const request: ListPromptsRequest = {\n method: 'prompts/list',\n params: {},\n };\n\n const result = await this.client.request(request, ListPromptsResultSchema);\n\n this.emitStateChange('READY');\n this.emitProgress(`Discovered ${result.prompts.length} prompts`);\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to list prompts';\n this.emitError(errorMessage, 'validation');\n this.emitStateChange('FAILED');\n throw error;\n }\n }\n\n /**\n * Gets a specific prompt with arguments\n * @param name - Name of the prompt\n * @param args - Arguments for the prompt\n * @returns Prompt content\n * @throws {Error} When client is not connected\n */\n async getPrompt(name: string, args?: Record<string, string>): Promise<GetPromptResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n const request: GetPromptRequest = {\n method: 'prompts/get',\n params: {\n name,\n arguments: args,\n },\n };\n\n return await this.client.request(request, GetPromptResultSchema);\n }\n\n /**\n * Lists all available resources from the connected MCP server\n * @returns List of available resources\n * @throws {Error} When client is not connected\n */\n async listResources(): Promise<ListResourcesResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n this.emitStateChange('DISCOVERING');\n\n try {\n const request: ListResourcesRequest = {\n method: 'resources/list',\n params: {},\n };\n\n const result = await this.client.request(request, ListResourcesResultSchema);\n\n this.emitStateChange('READY');\n this.emitProgress(`Discovered ${result.resources.length} resources`);\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to list resources';\n this.emitError(errorMessage, 'validation');\n this.emitStateChange('FAILED');\n throw error;\n }\n }\n\n /**\n * Reads a specific resource\n * @param uri - URI of the resource to read\n * @returns Resource content\n * @throws {Error} When client is not connected\n */\n async readResource(uri: string): Promise<ReadResourceResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n const request: ReadResourceRequest = {\n method: 'resources/read',\n params: {\n uri,\n },\n };\n\n return await this.client.request(request, ReadResourceResultSchema);\n }\n\n /**\n * Reconnects to MCP server using existing OAuth provider from Redis\n * Used for session restoration in serverless environments\n * Creates new client and transport without re-initializing OAuth provider\n * @throws {Error} When OAuth provider is not initialized\n */\n async reconnect(): Promise<void> {\n await this.initialize();\n\n if (!this.oauthProvider) {\n throw new Error('OAuth provider not initialized');\n }\n\n this.client = new Client(\n {\n name: MCP_CLIENT_NAME,\n version: MCP_CLIENT_VERSION,\n },\n { capabilities: {} }\n );\n\n // Use default logic to get transport, defaulting to what's stored or auto\n const tt = this.transportType || 'streamable-http';\n this.transport = this.getTransport(tt);\n\n await this.client.connect(this.transport);\n }\n\n /**\n * Completely removes the session from Redis including all OAuth data\n * Invalidates credentials and disconnects the client\n */\n async clearSession(): Promise<void> {\n try {\n await this.initialize();\n } catch (error) {\n console.warn('[MCPClient] Initialization failed during clearSession:', error);\n }\n\n if (this.oauthProvider) {\n await (this.oauthProvider as any).invalidateCredentials('all');\n }\n\n await sessions.delete(this.userId, this.sessionId);\n await this.disconnect();\n }\n\n /**\n * Checks if the client is currently connected to an MCP server\n * @returns True if connected, false otherwise\n */\n isConnected(): boolean {\n return this.client !== null;\n }\n\n /**\n * Disconnects from the MCP server and cleans up resources.\n * Does not remove session from Redis — use clearSession() for that.\n *\n * For Streamable HTTP sessions, sends an HTTP DELETE to the MCP endpoint\n * before closing, as recommended by the MCP Streamable HTTP spec\n * (section \"Session Management\", rule 5). This is best-effort — errors\n * (e.g. server already restarted, 404/405 responses) are silently ignored.\n */\n async disconnect(): Promise<void> {\n // Per the MCP Streamable HTTP spec (2025-11-25), clients SHOULD send an\n // HTTP DELETE with the mcp-session-id header when they no longer need a\n // session. The server MAY respond with 405 if it doesn't support explicit\n // termination — terminateSession() handles that gracefully.\n // SSEClientTransport has no session concept, so we guard with instanceof.\n if (this.transport instanceof StreamableHTTPClientTransport) {\n try {\n await this.transport.terminateSession();\n } catch {\n // Best-effort: server may be unreachable or may have already expired\n // the session. Either way, we proceed with local cleanup.\n }\n }\n\n if (this.client) {\n this.client.close();\n }\n this.client = null;\n this.oauthProvider = null;\n this.transport = null;\n\n // Emit disconnected event\n if (this.serverId) {\n this._onConnectionEvent.fire({\n type: 'disconnected',\n sessionId: this.sessionId,\n serverId: this.serverId,\n timestamp: Date.now(),\n });\n\n this._onObservabilityEvent.fire({\n type: 'mcp:client:disconnect',\n level: 'info',\n message: `Disconnected from ${this.serverId}`,\n sessionId: this.sessionId,\n serverId: this.serverId,\n payload: {},\n timestamp: Date.now(),\n id: nanoid(),\n });\n }\n\n this.emitStateChange('DISCONNECTED');\n }\n\n /**\n * Dispose of all event emitters\n * Call this when the client is no longer needed\n */\n dispose(): void {\n this._onConnectionEvent.dispose();\n this._onObservabilityEvent.dispose();\n }\n\n /**\n * Gets the server URL\n * @returns Server URL or empty string if not set\n */\n getServerUrl(): string {\n return this.serverUrl || '';\n }\n\n /**\n * Gets the OAuth callback URL\n * @returns Callback URL or empty string if not set\n */\n getCallbackUrl(): string {\n return this.callbackUrl || '';\n }\n\n /**\n * Gets the transport type being used\n * @returns Transport type (defaults to 'streamable-http')\n */\n getTransportType(): TransportType {\n return this.transportType || 'streamable-http';\n }\n\n /**\n * Gets the human-readable server name\n * @returns Server name or undefined\n */\n getServerName(): string | undefined {\n // Temporarily avoid deriving serverName from serverVersion metadata.\n // const info = (this.client as any)?.getServerVersion();\n // return info?.title ?? info?.name ?? this.serverName;\n return this.serverName;\n }\n\n /**\n * Gets the server ID\n * @returns Server ID or undefined\n */\n getServerId(): string | undefined {\n return this.serverId;\n }\n\n /**\n * Gets the session ID\n * @returns Session ID\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n}\n","import type { OAuthClientProvider } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type {\n OAuthClientInformationFull,\n OAuthClientInformationMixed,\n OAuthClientMetadata,\n OAuthTokens\n} from \"@modelcontextprotocol/sdk/shared/auth.js\";\nimport { nanoid } from \"nanoid\";\nimport { sessions, type SessionCredentials } from \"../storage/index.js\";\nimport {\n DEFAULT_CLIENT_NAME,\n DEFAULT_CLIENT_URI,\n DEFAULT_LOGO_URI,\n DEFAULT_POLICY_URI,\n SOFTWARE_ID,\n SOFTWARE_VERSION,\n STATE_EXPIRATION_MS,\n} from '../../shared/constants.js';\nimport { formatOAuthState, parseOAuthState } from '../../shared/utils.js';\n\n/**\n * Extension of OAuthClientProvider interface with additional methods\n * Enables server-specific tracking and state management\n */\nexport interface AgentsOAuthProvider extends OAuthClientProvider {\n authUrl: string | undefined;\n clientId: string | undefined;\n serverId: string | undefined;\n checkState(\n state: string\n ): Promise<{ valid: boolean; serverId?: string; error?: string }>;\n consumeState(state: string): Promise<void>;\n deleteCodeVerifier(): Promise<void>;\n}\n\nexport interface StorageOAuthClientProviderOptions {\n userId: string;\n serverId: string;\n sessionId: string;\n redirectUrl: string;\n clientName?: string;\n clientUri?: string;\n logoUri?: string;\n policyUri?: string;\n clientId?: string;\n clientSecret?: string;\n onRedirect?: (url: string) => void;\n}\n\n/**\n * Storage-backed OAuth provider implementation for MCP\n * Stores OAuth tokens, client information, and PKCE verifiers using the configured SessionStore\n */\nexport class StorageOAuthClientProvider implements AgentsOAuthProvider {\n public readonly userId: string;\n public readonly serverId: string;\n public readonly sessionId: string;\n public readonly redirectUrl: string;\n\n private readonly clientName?: string;\n private readonly clientUri?: string;\n private readonly logoUri?: string;\n private readonly policyUri?: string;\n private readonly clientSecret?: string;\n\n private _authUrl: string | undefined;\n private _clientId: string | undefined;\n private onRedirectCallback?: (url: string) => void;\n\n /**\n * Creates a new session-backed OAuth provider\n * @param options - Provider configuration\n */\n constructor(options: StorageOAuthClientProviderOptions) {\n this.userId = options.userId;\n this.serverId = options.serverId;\n this.sessionId = options.sessionId;\n this.redirectUrl = options.redirectUrl;\n this.clientName = options.clientName;\n this.clientUri = options.clientUri;\n this.logoUri = options.logoUri;\n this.policyUri = options.policyUri;\n this._clientId = options.clientId;\n this.clientSecret = options.clientSecret;\n this.onRedirectCallback = options.onRedirect;\n }\n\n get clientMetadata(): OAuthClientMetadata {\n return {\n client_name: this.clientName || DEFAULT_CLIENT_NAME,\n client_uri: this.clientUri || DEFAULT_CLIENT_URI,\n logo_uri: this.logoUri || DEFAULT_LOGO_URI,\n policy_uri: this.policyUri || DEFAULT_POLICY_URI,\n grant_types: [\"authorization_code\", \"refresh_token\"],\n redirect_uris: [this.redirectUrl],\n response_types: [\"code\"],\n token_endpoint_auth_method: this.clientSecret ? \"client_secret_basic\" : \"none\",\n software_id: SOFTWARE_ID,\n software_version: SOFTWARE_VERSION,\n };\n }\n\n get clientId() {\n return this._clientId;\n }\n\n set clientId(clientId_: string | undefined) {\n this._clientId = clientId_;\n }\n\n /**\n * Loads OAuth credentials from the session store\n * @private\n */\n private async getCredentials(): Promise<SessionCredentials> {\n const data = await sessions.getCredentials(this.userId, this.sessionId);\n if (!data) {\n return { userId: this.userId, sessionId: this.sessionId };\n }\n return data;\n }\n\n /**\n * Saves OAuth credentials to the session store\n * @param data - Partial OAuth credentials to save\n * @private\n * @throws Error if session doesn't exist (session must be created by controller layer)\n */\n private async patchCredentials(data: Partial<SessionCredentials>): Promise<void> {\n await sessions.patchCredentials(this.userId, this.sessionId, data);\n }\n\n /**\n * Retrieves stored OAuth client information\n */\n async clientInformation(): Promise<OAuthClientInformationMixed | undefined> {\n const data = await this.getCredentials();\n\n if (data.clientId && !this._clientId) {\n this._clientId = data.clientId;\n }\n\n if (data.clientInformation) {\n return data.clientInformation;\n }\n\n if (!this._clientId) {\n return undefined;\n }\n\n return {\n client_id: this._clientId,\n ...(this.clientSecret ? { client_secret: this.clientSecret } : {}),\n };\n }\n\n /**\n * Stores OAuth client information\n */\n async saveClientInformation(clientInformation: OAuthClientInformationFull): Promise<void> {\n await this.patchCredentials({\n clientInformation,\n clientId: clientInformation.client_id\n });\n this.clientId = clientInformation.client_id;\n }\n\n /**\n * Stores OAuth tokens\n */\n async saveTokens(tokens: OAuthTokens): Promise<void> {\n await this.patchCredentials({ tokens });\n }\n\n get authUrl() {\n return this._authUrl;\n }\n\n async state(): Promise<string> {\n const nonce = nanoid(32);\n await this.patchCredentials({\n oauthState: {\n nonce,\n sessionId: this.sessionId,\n serverId: this.serverId,\n createdAt: Date.now(),\n },\n codeVerifier: null,\n });\n return formatOAuthState(nonce, this.sessionId);\n }\n\n async checkState(state: string): Promise<{ valid: boolean; serverId?: string; error?: string }> {\n const parsed = parseOAuthState(state);\n if (!parsed) {\n return { valid: false, error: \"Invalid OAuth state\" };\n }\n\n if (parsed.sessionId !== this.sessionId) {\n return { valid: false, error: \"OAuth state mismatch\" };\n }\n\n const data = await sessions.getCredentials(this.userId, parsed.sessionId);\n\n if (!data) {\n return { valid: false, error: \"Session not found\" };\n }\n\n const oauthState = data.oauthState;\n if (!oauthState) {\n return { valid: false, error: \"OAuth state not found\" };\n }\n\n if (\n oauthState.nonce !== parsed.nonce ||\n oauthState.sessionId !== parsed.sessionId ||\n oauthState.serverId !== this.serverId\n ) {\n return { valid: false, error: \"OAuth state mismatch\" };\n }\n\n if (Date.now() - oauthState.createdAt > STATE_EXPIRATION_MS) {\n return { valid: false, error: \"OAuth state expired\" };\n }\n\n return { valid: true, serverId: oauthState.serverId };\n }\n\n async consumeState(state: string): Promise<void> {\n const result = await this.checkState(state);\n if (!result.valid) {\n throw new Error(result.error || \"Invalid OAuth state\");\n }\n\n await this.patchCredentials({ oauthState: null });\n }\n\n async redirectToAuthorization(authUrl: URL): Promise<void> {\n this._authUrl = authUrl.toString();\n await sessions.update(this.userId, this.sessionId, { authUrl: this._authUrl });\n if (this.onRedirectCallback) {\n this.onRedirectCallback(authUrl.toString());\n }\n }\n\n async invalidateCredentials(\n scope: \"all\" | \"client\" | \"tokens\" | \"verifier\"\n ): Promise<void> {\n if (scope === \"all\") {\n await sessions.delete(this.userId, this.sessionId);\n } else {\n const updates: Partial<SessionCredentials> = {};\n\n if (scope === \"client\") {\n updates.clientInformation = null;\n updates.clientId = null;\n } else if (scope === \"tokens\") {\n updates.tokens = null;\n } else if (scope === \"verifier\") {\n updates.codeVerifier = null;\n }\n await this.patchCredentials(updates);\n }\n }\n\n async saveCodeVerifier(verifier: string): Promise<void> {\n const data = await this.getCredentials();\n if (data.codeVerifier) {\n return;\n }\n\n await this.patchCredentials({ codeVerifier: verifier });\n }\n\n async codeVerifier(): Promise<string> {\n const data = await this.getCredentials();\n\n if (data.clientId && !this._clientId) {\n this._clientId = data.clientId;\n }\n\n if (!data.codeVerifier) {\n throw new Error(\"No code verifier found\");\n }\n return data.codeVerifier;\n }\n\n async deleteCodeVerifier(): Promise<void> {\n await this.patchCredentials({ codeVerifier: null });\n }\n\n async tokens(): Promise<OAuthTokens | undefined> {\n const data = await this.getCredentials();\n\n if (data.clientId && !this._clientId) {\n this._clientId = data.clientId;\n }\n\n return data.tokens ?? undefined;\n }\n}\n","\nimport { RedisStorageBackend } from './redis-backend';\nimport { MemoryStorageBackend } from './memory-backend';\nimport { FileStorageBackend } from './file-backend';\nimport { SqliteStorage } from './sqlite-backend.js';\nimport { SupabaseStorageBackend } from './supabase-backend.js';\nimport { NeonStorageBackend, type NeonStorageOptions } from './neon-backend.js';\nimport type { SessionStore, Session, SessionMutationEvent, SessionMutationListener } from './types.js';\n\n// Re-export types\nexport * from './types.js';\nexport { generateSessionId } from '../../shared/utils.js';\nexport { RedisStorageBackend, MemoryStorageBackend, FileStorageBackend, SqliteStorage, SupabaseStorageBackend, NeonStorageBackend };\n\nexport function createSupabaseStorageBackend(client: any): SupabaseStorageBackend {\n return new SupabaseStorageBackend(client);\n}\n\nexport function createNeonStorageBackend(sql: any, options?: NeonStorageOptions): NeonStorageBackend {\n return new NeonStorageBackend(sql, options);\n}\n\nfunction warnIfNeonConnectionStringIsInsecure(connectionString: string): void {\n try {\n const url = new URL(connectionString);\n const sslMode = url.searchParams.get('sslmode');\n const channelBinding = url.searchParams.get('channel_binding');\n\n if (!sslMode) {\n console.warn('[mcp-ts][Storage] Neon connection string does not include sslmode. Neon recommends sslmode=verify-full for the strongest certificate verification.');\n } else if (!['verify-full', 'require'].includes(sslMode)) {\n console.warn(`[mcp-ts][Storage] Neon connection string uses sslmode=${sslMode}. Use sslmode=verify-full or sslmode=require for secure connections.`);\n }\n\n if (!channelBinding) {\n console.warn('[mcp-ts][Storage] Neon connection string does not include channel_binding=require. Add it when supported by your runtime and connection path.');\n }\n } catch {\n console.warn('[mcp-ts][Storage] Neon connection string could not be parsed for SSL checks.');\n }\n}\n\nlet storageInstance: SessionStore | null = null;\nlet storagePromise: Promise<SessionStore> | null = null;\nconst sessionMutationListeners = new Set<SessionMutationListener>();\n\nfunction emitSessionMutation(event: SessionMutationEvent): void {\n for (const listener of sessionMutationListeners) {\n try {\n const result = listener(event);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n void (result as Promise<void>).catch((error) => {\n console.error('[mcp-ts][Storage] Session mutation listener failed:', error);\n });\n }\n } catch (error) {\n console.error('[mcp-ts][Storage] Session mutation listener failed:', error);\n }\n }\n}\n\nfunction createSessionMutationEvent(prop: PropertyKey, args: any[]): SessionMutationEvent | null {\n const timestamp = Date.now();\n\n if (prop === 'create') {\n const [session] = args as [Session];\n if (!session?.userId || !session?.sessionId) return null;\n return {\n type: 'create',\n userId: session.userId,\n sessionId: session.sessionId,\n session,\n timestamp,\n };\n }\n\n if (prop === 'update') {\n const [userId, sessionId, patch] = args as [string, string, Partial<Session>];\n if (!userId || !sessionId) return null;\n return {\n type: 'update',\n userId,\n sessionId,\n patch,\n timestamp,\n };\n }\n\n if (prop === 'delete') {\n const [userId, sessionId] = args as [string, string];\n if (!userId || !sessionId) return null;\n return {\n type: 'delete',\n userId,\n sessionId,\n timestamp,\n };\n }\n\n return null;\n}\n\nasync function initializeStorage<T extends SessionStore>(store: T): Promise<T> {\n if (typeof store.init === 'function') {\n await store.init();\n }\n return store;\n}\n\nasync function createStorage(): Promise<SessionStore> {\n const type = process.env.MCP_TS_STORAGE_TYPE?.toLowerCase();\n\n // Explicit selection\n if (type === 'redis') {\n if (!process.env.REDIS_URL) {\n console.warn('[Storage] MCP_TS_STORAGE_TYPE is \"redis\" but REDIS_URL is missing');\n }\n try {\n const { getRedis } = await import('./redis.js');\n const redis = await getRedis();\n console.log('[mcp-ts][Storage] Explicit selection: \"redis\"');\n return await initializeStorage(new RedisStorageBackend(redis));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Failed to initialize Redis:', error.message);\n console.log('[mcp-ts][Storage] Falling back to In-Memory storage');\n return await initializeStorage(new MemoryStorageBackend());\n }\n }\n\n if (type === 'file') {\n const filePath = process.env.MCP_TS_STORAGE_FILE;\n console.log(`[mcp-ts][Storage] Explicit selection: \"file\" (${filePath || 'default'})`);\n return await initializeStorage(new FileStorageBackend({ path: filePath }));\n }\n\n if (type === 'sqlite') {\n const dbPath = process.env.MCP_TS_STORAGE_SQLITE_PATH;\n console.log(`[mcp-ts][Storage] Explicit selection: \"sqlite\" (${dbPath || 'default'})`);\n return await initializeStorage(new SqliteStorage({ path: dbPath }));\n }\n\n if (type === 'supabase') {\n const url = process.env.SUPABASE_URL;\n const key = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_ANON_KEY;\n \n if (!url || !key) {\n console.warn('[mcp-ts][Storage] Explicit selection \"supabase\" requires SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY.');\n } else {\n if (!process.env.SUPABASE_SERVICE_ROLE_KEY) {\n console.warn('[mcp-ts][Storage] ⚠️ Warning: Using \"SUPABASE_ANON_KEY\" for server-side storage. You may encounter RLS policy violations. \"SUPABASE_SERVICE_ROLE_KEY\" is recommended.');\n }\n try {\n const { createClient } = await import('@supabase/supabase-js');\n const client = createClient(url, key);\n console.log('[mcp-ts][Storage] Explicit selection: \"supabase\"');\n return await initializeStorage(new SupabaseStorageBackend(client as any));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Failed to initialize Supabase:', error.message);\n console.log('[mcp-ts][Storage] Falling back to In-Memory storage');\n return await initializeStorage(new MemoryStorageBackend());\n }\n }\n }\n\n if (type === 'neon') {\n const connectionString = process.env.NEON_DATABASE_URL || process.env.DATABASE_URL;\n\n if (!connectionString) {\n console.warn('[mcp-ts][Storage] Explicit selection \"neon\" requires NEON_DATABASE_URL or DATABASE_URL.');\n } else {\n try {\n const { neon } = await import('@neondatabase/serverless');\n warnIfNeonConnectionStringIsInsecure(connectionString);\n const sql = neon(connectionString);\n console.log('[mcp-ts][Storage] Explicit selection: \"neon\"');\n return await initializeStorage(new NeonStorageBackend(sql));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Failed to initialize Neon:', error.message);\n console.log('[mcp-ts][Storage] Falling back to In-Memory storage');\n return await initializeStorage(new MemoryStorageBackend());\n }\n }\n }\n\n if (type === 'memory') {\n console.log('[mcp-ts][Storage] Explicit selection: \"memory\"');\n return await initializeStorage(new MemoryStorageBackend());\n }\n\n // Automatic inference (Fallback)\n if (process.env.REDIS_URL) {\n try {\n const { getRedis } = await import('./redis.js');\n const redis = await getRedis();\n console.log('[mcp-ts][Storage] Auto-detection: \"redis\" (via REDIS_URL)');\n return await initializeStorage(new RedisStorageBackend(redis));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Redis auto-detection failed:', error.message);\n console.log('[mcp-ts][Storage] Falling back to next available backend');\n }\n }\n\n if (process.env.MCP_TS_STORAGE_FILE) {\n console.log(`[mcp-ts][Storage] Auto-detection: \"file\" (${process.env.MCP_TS_STORAGE_FILE})`);\n return await initializeStorage(new FileStorageBackend({ path: process.env.MCP_TS_STORAGE_FILE }));\n }\n\n if (process.env.MCP_TS_STORAGE_SQLITE_PATH) {\n console.log(`[mcp-ts][Storage] Auto-detection: \"sqlite\" (${process.env.MCP_TS_STORAGE_SQLITE_PATH})`);\n return await initializeStorage(new SqliteStorage({ path: process.env.MCP_TS_STORAGE_SQLITE_PATH }));\n }\n\n if (process.env.SUPABASE_URL && (process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_ANON_KEY)) {\n try {\n const { createClient } = await import('@supabase/supabase-js');\n const url = process.env.SUPABASE_URL;\n const key = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_ANON_KEY!;\n \n if (!process.env.SUPABASE_SERVICE_ROLE_KEY) {\n console.warn('[mcp-ts][Storage] ⚠️ Warning: Using \"SUPABASE_ANON_KEY\" for server-side storage. You may encounter RLS policy violations. \"SUPABASE_SERVICE_ROLE_KEY\" is recommended.');\n }\n\n const client = createClient(url, key);\n console.log('[mcp-ts][Storage] Auto-detection: \"supabase\" (via SUPABASE_URL)');\n return await initializeStorage(new SupabaseStorageBackend(client as any));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Supabase auto-detection failed:', error.message);\n }\n }\n\n if (process.env.NEON_DATABASE_URL) {\n try {\n const { neon } = await import('@neondatabase/serverless');\n warnIfNeonConnectionStringIsInsecure(process.env.NEON_DATABASE_URL);\n const sql = neon(process.env.NEON_DATABASE_URL);\n console.log('[mcp-ts][Storage] Auto-detection: \"neon\" (via NEON_DATABASE_URL)');\n return await initializeStorage(new NeonStorageBackend(sql));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Neon auto-detection failed:', error.message);\n }\n }\n\n console.log('[mcp-ts][Storage] Defaulting to: \"memory\"');\n return await initializeStorage(new MemoryStorageBackend());\n}\n\nasync function getStorage(): Promise<SessionStore> {\n if (storageInstance) {\n return storageInstance;\n }\n\n if (!storagePromise) {\n storagePromise = createStorage().catch((error) => {\n storagePromise = null;\n throw error;\n });\n }\n\n storageInstance = await storagePromise;\n return storageInstance;\n}\n\n/**\n * Set the storage instance (for testing)\n * @internal\n * @param instance - SessionStore instance or null to reset\n */\nexport function _setStorageInstanceForTesting(instance: SessionStore | null): void {\n storageInstance = instance;\n if (!instance) {\n storagePromise = null;\n }\n}\n\nexport function onSessionMutation(listener: SessionMutationListener): () => void {\n sessionMutationListeners.add(listener);\n return () => {\n sessionMutationListeners.delete(listener);\n };\n}\n\nexport function _resetSessionMutationListenersForTesting(): void {\n sessionMutationListeners.clear();\n}\n\n/**\n * Global session store instance\n * Uses lazy initialization with a Proxy to handle async setup transparently\n */\nexport const sessions: SessionStore = new Proxy({} as SessionStore, {\n get(_target, prop) {\n return async (...args: any[]) => {\n const instance = await getStorage();\n const value = (instance as any)[prop];\n if (typeof value === 'function') {\n const result = await value.apply(instance, args);\n const event = createSessionMutationEvent(prop, args);\n if (event) {\n emitSessionMutation(event);\n }\n return result;\n }\n return value;\n };\n },\n});\n","import type { Redis } from 'ioredis';\nimport type { SessionStore, Session, SessionCredentials } from './types.js';\nimport { generateSessionId } from '../../shared/utils.js';\nimport {\n mergeSessionUpdate,\n normalizeNewSession,\n normalizeStoredSession,\n resolveSessionRedisTtlSeconds,\n} from './session-lifecycle.js';\n\n/**\n * Redis implementation of SessionStore\n */\nexport class RedisStorageBackend implements SessionStore {\n private readonly KEY_PREFIX = 'mcp:session:';\n private readonly CREDENTIALS_KEY_PREFIX = 'mcp:credentials:';\n private readonly USER_ID_KEY_PREFIX = 'mcp:userId:';\n private readonly USER_ID_KEY_SUFFIX = ':sessions';\n\n constructor(private redis: Redis) { }\n \n async init(): Promise<void> {\n try {\n await this.redis.ping();\n console.log('[mcp-ts][Storage] Redis: ✓ Connected to server.');\n } catch (error: any) {\n throw new Error(`[RedisStorageBackend] Failed to connect to Redis: ${error.message}`);\n }\n }\n\n /**\n * Generates Redis key for a specific session\n * @private\n */\n private getSessionKey(userId: string, sessionId: string): string {\n return `${this.KEY_PREFIX}${userId}:${sessionId}`;\n }\n\n private getCredentialsKey(userId: string, sessionId: string): string {\n return `${this.CREDENTIALS_KEY_PREFIX}${userId}:${sessionId}`;\n }\n\n /**\n * Generates Redis key for tracking all sessions for a user\n * @private\n */\n private getUserIdKey(userId: string): string {\n return `${this.USER_ID_KEY_PREFIX}${userId}${this.USER_ID_KEY_SUFFIX}`;\n }\n\n private parseUserIdFromKey(userIdKey: string): string {\n return userIdKey.slice(\n this.USER_ID_KEY_PREFIX.length,\n userIdKey.length - this.USER_ID_KEY_SUFFIX.length\n );\n }\n\n private async scanKeys(pattern: string): Promise<string[]> {\n const redis = this.redis as Redis & {\n scan?: (cursor: string, ...args: Array<string | number>) => Promise<[string, string[]]>;\n };\n\n if (typeof redis.scan !== 'function') {\n return await this.redis.keys(pattern);\n }\n\n const keys = new Set<string>();\n let cursor = '0';\n\n try {\n do {\n const [nextCursor, batch] = await redis.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n for (const key of batch) {\n keys.add(key);\n }\n } while (cursor !== '0');\n } catch (error) {\n console.warn('[RedisStorageBackend] SCAN failed, falling back to KEYS:', error);\n return await this.redis.keys(pattern);\n }\n\n return Array.from(keys);\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n async create(session: Session): Promise<void> {\n const { sessionId, userId } = session;\n if (!sessionId || !userId) throw new Error('userId and sessionId required');\n\n const sessionKey = this.getSessionKey(userId, sessionId);\n const userIdKey = this.getUserIdKey(userId);\n const sessionWithLifecycle = normalizeNewSession(session);\n const effectiveTtl = resolveSessionRedisTtlSeconds(sessionWithLifecycle);\n\n const result = await this.redis.set(\n sessionKey,\n JSON.stringify(sessionWithLifecycle),\n 'EX',\n effectiveTtl,\n 'NX'\n );\n\n if (result !== 'OK') {\n throw new Error(`Session ${sessionId} already exists`);\n }\n\n await this.redis.sadd(userIdKey, sessionId);\n }\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n\n /** Lua script for atomic get-and-set with expiration refresh. */\n const script = `\n local currentStr = redis.call(\"GET\", KEYS[1])\n if not currentStr then\n return 0\n end\n\n local current = cjson.decode(currentStr)\n local updated = cjson.decode(ARGV[1])\n\n redis.call(\"SET\", KEYS[1], cjson.encode(updated), \"EX\", ARGV[2])\n return 1\n `;\n\n const current = await this.get(userId, sessionId);\n if (!current) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n const updated = mergeSessionUpdate(current, data);\n const effectiveTtl = resolveSessionRedisTtlSeconds(updated);\n\n const result = await this.redis.eval(\n script,\n 1,\n sessionKey,\n JSON.stringify(updated),\n effectiveTtl\n );\n\n if (result === 0) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n const credentialsKey = this.getCredentialsKey(userId, sessionId);\n const sessionExists = await this.redis.exists(sessionKey);\n if (!sessionExists) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n const session = await this.get(userId, sessionId);\n const currentTtl = await this.redis.ttl(sessionKey);\n const effectiveTtl = currentTtl > 0 && session\n ? currentTtl\n : resolveSessionRedisTtlSeconds(session ?? { status: 'pending' });\n const currentStr = await this.redis.get(credentialsKey);\n const current = currentStr ? JSON.parse(currentStr) as SessionCredentials : { sessionId, userId };\n const credentials = { ...current, ...data, sessionId, userId };\n if (effectiveTtl > 0) {\n await this.redis.set(credentialsKey, JSON.stringify(credentials), 'EX', effectiveTtl);\n } else {\n await this.redis.set(credentialsKey, JSON.stringify(credentials));\n }\n }\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n try {\n const sessionKey = this.getSessionKey(userId, sessionId);\n const sessionDataStr = await this.redis.get(sessionKey);\n\n if (!sessionDataStr) {\n return null;\n }\n\n const session: Session = JSON.parse(sessionDataStr);\n return normalizeStoredSession(session);\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to get session:', error);\n return null;\n }\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n const session = await this.get(userId, sessionId);\n if (!session) return null;\n\n const credentialsStr = await this.redis.get(this.getCredentialsKey(userId, sessionId));\n return credentialsStr ? JSON.parse(credentialsStr) as SessionCredentials : { sessionId, userId };\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n await this.patchCredentials(userId, sessionId, {\n clientInformation: null,\n tokens: null,\n codeVerifier: null,\n clientId: null,\n oauthState: null,\n });\n }\n\n async listIds(userId: string): Promise<string[]> {\n const sessions = await this.list(userId);\n return sessions.map((session) => session.sessionId);\n }\n\n async list(userId: string): Promise<Session[]> {\n try {\n const userIdKey = this.getUserIdKey(userId);\n const sessionIds = await this.redis.smembers(userIdKey);\n if (sessionIds.length === 0) return [];\n\n const results = await Promise.all(\n sessionIds.map(async (sessionId) => {\n const data = await this.redis.get(this.getSessionKey(userId, sessionId));\n return data ? (JSON.parse(data) as Session) : null;\n })\n );\n\n const staleSessionIds = sessionIds.filter((_, index) => results[index] === null);\n if (staleSessionIds.length > 0) {\n await this.redis.srem(userIdKey, ...staleSessionIds);\n }\n\n return results\n .filter((session): session is Session => session !== null)\n .map((session) => normalizeStoredSession(session));\n } catch (error) {\n console.error(`[RedisStorageBackend] Failed to get session data for ${userId}:`, error);\n return [];\n }\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n try {\n const sessionKey = this.getSessionKey(userId, sessionId);\n const credentialsKey = this.getCredentialsKey(userId, sessionId);\n const userIdKey = this.getUserIdKey(userId);\n\n await this.redis.srem(userIdKey, sessionId);\n await this.redis.del(sessionKey, credentialsKey);\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to remove session:', error);\n }\n }\n\n async listAllIds(): Promise<string[]> {\n try {\n const keys = await this.scanKeys(`${this.KEY_PREFIX}*`);\n const sessions = await Promise.all(\n keys.map(async (key) => {\n const data = await this.redis.get(key);\n if (!data) {\n return null;\n }\n\n try {\n return normalizeStoredSession(JSON.parse(data) as Session).sessionId;\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to parse session while listing all session IDs:', error);\n return null;\n }\n })\n );\n\n return sessions.filter((sessionId): sessionId is string => sessionId !== null);\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to get all sessions:', error);\n return [];\n }\n }\n\n async clearAll(): Promise<void> {\n try {\n const keys = await this.scanKeys(`${this.KEY_PREFIX}*`);\n const credentialKeys = await this.scanKeys(`${this.CREDENTIALS_KEY_PREFIX}*`);\n const userIdKeys = await this.scanKeys(`${this.USER_ID_KEY_PREFIX}*${this.USER_ID_KEY_SUFFIX}`);\n const allKeys = [...keys, ...credentialKeys, ...userIdKeys];\n if (allKeys.length > 0) {\n await this.redis.del(...allKeys);\n }\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to clear sessions:', error);\n }\n }\n\n async cleanupExpired(): Promise<void> {\n try {\n const userIdKeys = await this.scanKeys(`${this.USER_ID_KEY_PREFIX}*${this.USER_ID_KEY_SUFFIX}`);\n\n for (const userIdKey of userIdKeys) {\n const userId = this.parseUserIdFromKey(userIdKey);\n const sessionIds = await this.redis.smembers(userIdKey);\n\n if (sessionIds.length === 0) {\n await this.redis.del(userIdKey);\n continue;\n }\n\n const existenceChecks = await Promise.all(\n sessionIds.map((sessionId) => this.redis.exists(this.getSessionKey(userId, sessionId)))\n );\n\n const staleSessionIds = sessionIds.filter((_, index) => existenceChecks[index] === 0);\n if (staleSessionIds.length > 0) {\n await this.redis.srem(userIdKey, ...staleSessionIds);\n await this.redis.del(...staleSessionIds.map((sessionId) => this.getCredentialsKey(userId, sessionId)));\n }\n\n const remainingCount = await this.redis.scard(userIdKey);\n if (remainingCount === 0) {\n await this.redis.del(userIdKey);\n }\n }\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to cleanup expired sessions:', error);\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.redis.quit();\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to disconnect:', error);\n }\n }\n}\n","import { customAlphabet } from 'nanoid';\n\nconst OAUTH_STATE_SEPARATOR = '.';\n\n/** first char: letters only (required by OpenAI) */\nconst firstChar = customAlphabet(\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n 1\n);\n\n/** remaining chars: alphanumeric */\nconst rest = customAlphabet(\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',\n 11\n);\n\n/**\n * Sanitize server name to create a valid server label\n * Must start with a letter and contain only letters, digits, '-' and '_'\n */\nexport function sanitizeServerLabel(name: string): string {\n let sanitized = name\n .replace(/[^a-zA-Z0-9-_]/g, '_')\n .replace(/_{2,}/g, '_')\n .toLowerCase();\n\n if (!/^[a-zA-Z]/.test(sanitized)) {\n sanitized = 's_' + sanitized;\n }\n\n return sanitized;\n}\n\n/**\n * Generates a standard 12-character session ID compliant with external tool restrictions.\n * First character is always a letter.\n */\nexport function generateSessionId(): string {\n return firstChar() + rest();\n}\n\nexport interface ParsedOAuthState {\n nonce: string;\n sessionId: string;\n}\n\nexport function formatOAuthState(nonce: string, sessionId: string): string {\n return `${nonce}${OAUTH_STATE_SEPARATOR}${sessionId}`;\n}\n\nexport function parseOAuthState(state: string): ParsedOAuthState | undefined {\n const separatorIndex = state.indexOf(OAUTH_STATE_SEPARATOR);\n if (separatorIndex <= 0 || separatorIndex === state.length - 1) {\n return undefined;\n }\n\n const nonce = state.slice(0, separatorIndex);\n const sessionId = state.slice(separatorIndex + 1);\n if (!nonce || !sessionId || sessionId.includes(OAUTH_STATE_SEPARATOR)) {\n return undefined;\n }\n\n return { nonce, sessionId };\n}\n","import {\n DORMANT_SESSION_EXPIRATION_MS,\n DORMANT_SESSION_EXPIRATION_SECONDS,\n STATE_EXPIRATION_MS,\n} from '../../shared/constants.js';\nimport type { Session, SessionStatus } from './types.js';\n\nexport function resolveSessionExpiresAt(status: SessionStatus = 'pending', referenceTime = Date.now()): number | null {\n return status === 'active' ? null : referenceTime + STATE_EXPIRATION_MS;\n}\n\nexport function resolveSessionRedisTtlSeconds(session: Pick<Session, 'status'>): number {\n return session.status === 'active'\n ? DORMANT_SESSION_EXPIRATION_SECONDS\n : Math.floor(STATE_EXPIRATION_MS / 1000);\n}\n\nexport function normalizeNewSession(session: Session, now = Date.now()): Session {\n const createdAt = session.createdAt || now;\n const updatedAt = session.updatedAt ?? createdAt;\n const status = session.status ?? 'pending';\n\n return {\n ...session,\n status,\n createdAt,\n updatedAt,\n expiresAt: resolveSessionExpiresAt(status, status === 'active' ? updatedAt : createdAt),\n };\n}\n\nexport function mergeSessionUpdate(\n current: Session,\n data: Partial<Session>,\n now = Date.now()\n): Session {\n const updatedAt = data.updatedAt ?? now;\n const updated = {\n ...current,\n ...data,\n updatedAt,\n };\n const status = updated.status ?? 'pending';\n\n return {\n ...updated,\n status,\n expiresAt: resolveSessionExpiresAt(status, updatedAt),\n };\n}\n\nexport function normalizeStoredSession(session: Session): Session {\n const createdAt = session.createdAt || Date.now();\n const updatedAt = session.updatedAt ?? createdAt;\n const status = session.status ?? 'pending';\n const expiresAt = status === 'active'\n ? null\n : session.expiresAt ?? resolveSessionExpiresAt(status, createdAt);\n\n return {\n ...session,\n status,\n createdAt,\n updatedAt,\n expiresAt,\n };\n}\n\nexport function isSessionExpired(session: Session, now = Date.now()): boolean {\n const hydrated = normalizeStoredSession(session);\n\n if (hydrated.status === 'active') {\n return hydrated.updatedAt !== undefined &&\n hydrated.updatedAt < now - DORMANT_SESSION_EXPIRATION_MS;\n }\n\n return typeof hydrated.expiresAt === 'number' && hydrated.expiresAt < now;\n}\n","/**\n * Centralized constants for MCP Redis library\n * Eliminates magic numbers and enables consistent configuration\n */\n\n// Session lifecycle\nexport const STATE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes for OAuth state\nexport const PENDING_SESSION_EXPIRATION_SECONDS = Math.floor(STATE_EXPIRATION_MS / 1000);\nexport const DORMANT_SESSION_EXPIRATION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days\nexport const DORMANT_SESSION_EXPIRATION_SECONDS = Math.floor(DORMANT_SESSION_EXPIRATION_MS / 1000);\n\n// Heartbeat and Connection\nexport const DEFAULT_HEARTBEAT_INTERVAL_MS = 30000; // 30 seconds\n\n// Redis Key Prefixes\nexport const REDIS_KEY_PREFIX = 'mcp:session:';\n\n// Client Information\nexport const DEFAULT_CLIENT_NAME = 'MCP Assistant';\nexport const DEFAULT_CLIENT_URI = 'https://mcp-assistant.in';\nexport const DEFAULT_LOGO_URI = 'https://mcp-assistant.in/logo.svg';\nexport const DEFAULT_POLICY_URI = 'https://mcp-assistant.in/privacy';\nexport const SOFTWARE_ID = '@mcp-ts';\nexport const SOFTWARE_VERSION = '2.3.4';\n\n// MCP Client Configuration\nexport const MCP_CLIENT_NAME = 'mcp-ts-oauth-client';\nexport const MCP_CLIENT_VERSION = '2.0';\n","import type { SessionStore, Session, SessionCredentials } from './types.js';\nimport { generateSessionId } from '../../shared/utils.js';\nimport { isSessionExpired, mergeSessionUpdate, normalizeNewSession } from './session-lifecycle.js';\n\n/**\n * In-memory implementation of SessionStore\n * Useful for local development or testing\n */\nexport class MemoryStorageBackend implements SessionStore {\n // Map<userId:sessionId, Session>\n private sessions = new Map<string, Session>();\n private credentials = new Map<string, SessionCredentials>();\n\n // Map<userId, Set<sessionId>>\n private userIdSessions = new Map<string, Set<string>>();\n\n constructor() { }\n\n async init(): Promise<void> {\n console.log('[mcp-ts][Storage] Memory: ✓ internal memory store active.');\n }\n\n private getSessionKey(userId: string, sessionId: string): string {\n return `${userId}:${sessionId}`;\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n async create(session: Session): Promise<void> {\n const { sessionId, userId } = session;\n if (!sessionId || !userId) throw new Error('userId and sessionId required');\n\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (this.sessions.has(sessionKey)) {\n throw new Error(`Session ${sessionId} already exists`);\n }\n\n this.sessions.set(sessionKey, normalizeNewSession(session));\n\n // Update index\n if (!this.userIdSessions.has(userId)) {\n this.userIdSessions.set(userId, new Set());\n }\n this.userIdSessions.get(userId)!.add(sessionId);\n }\n\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n if (!userId || !sessionId) throw new Error('userId and sessionId required');\n\n const sessionKey = this.getSessionKey(userId, sessionId);\n const current = this.sessions.get(sessionKey);\n\n if (!current) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const updated = mergeSessionUpdate(current, data);\n\n this.sessions.set(sessionKey, updated);\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (!this.sessions.has(sessionKey)) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const current = this.credentials.get(sessionKey) ?? { sessionId, userId };\n this.credentials.set(sessionKey, { ...current, ...data, sessionId, userId });\n }\n\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n return this.sessions.get(sessionKey) || null;\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (!this.sessions.has(sessionKey)) return null;\n return this.credentials.get(sessionKey) ?? { sessionId, userId };\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n await this.patchCredentials(userId, sessionId, {\n clientInformation: null,\n tokens: null,\n codeVerifier: null,\n clientId: null,\n oauthState: null,\n });\n }\n\n async listIds(userId: string): Promise<string[]> {\n const set = this.userIdSessions.get(userId);\n return set ? Array.from(set) : [];\n }\n\n async list(userId: string): Promise<Session[]> {\n const set = this.userIdSessions.get(userId);\n if (!set) return [];\n\n const results: Session[] = [];\n for (const sessionId of set) {\n const session = this.sessions.get(this.getSessionKey(userId, sessionId));\n if (session) {\n results.push(session);\n }\n }\n return results;\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n this.sessions.delete(sessionKey);\n this.credentials.delete(sessionKey);\n\n const set = this.userIdSessions.get(userId);\n if (set) {\n set.delete(sessionId);\n if (set.size === 0) {\n this.userIdSessions.delete(userId);\n }\n }\n }\n\n async listAllIds(): Promise<string[]> {\n return Array.from(this.sessions.values()).map(s => s.sessionId);\n }\n\n async clearAll(): Promise<void> {\n this.sessions.clear();\n this.credentials.clear();\n this.userIdSessions.clear();\n }\n\n async cleanupExpired(): Promise<void> {\n for (const [key, session] of this.sessions.entries()) {\n if (!isSessionExpired(session)) continue;\n\n this.sessions.delete(key);\n this.credentials.delete(key);\n\n const set = this.userIdSessions.get(session.userId);\n if (set) {\n set.delete(session.sessionId);\n if (set.size === 0) {\n this.userIdSessions.delete(session.userId);\n }\n }\n }\n }\n\n async disconnect(): Promise<void> {\n // No-op for memory\n }\n}\n","import { promises as fs } from 'fs';\nimport * as path from 'path';\nimport type { SessionStore, Session, SessionCredentials } from './types.js';\nimport { generateSessionId } from '../../shared/utils.js';\nimport {\n mergeSessionUpdate,\n normalizeNewSession,\n normalizeStoredSession,\n isSessionExpired,\n} from './session-lifecycle.js';\n\n/**\n * File system implementation of SessionStore\n * Persists sessions to a JSON file\n */\nexport class FileStorageBackend implements SessionStore {\n private filePath: string;\n private memoryCache: Map<string, Session> | null = null;\n private credentialsCache: Map<string, SessionCredentials> | null = null;\n private initialized = false;\n\n /**\n * @param options.path Path to the JSON file storage (default: ./sessions.json)\n */\n constructor(options: { path?: string } = {}) {\n this.filePath = options.path || './sessions.json';\n }\n\n /**\n * Initialize storage: ensure file exists and load into memory cache\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Ensure directory exists\n const dir = path.dirname(this.filePath);\n await fs.mkdir(dir, { recursive: true });\n\n // Try to read file\n const data = await fs.readFile(this.filePath, 'utf-8');\n const json = JSON.parse(data);\n\n this.memoryCache = new Map();\n this.credentialsCache = new Map();\n if (Array.isArray(json.sessions)) {\n json.sessions.forEach((s: Session) => {\n const session = normalizeStoredSession(s);\n this.memoryCache!.set(this.getSessionKey(session.userId || 'unknown', session.sessionId), session);\n });\n }\n if (Array.isArray(json.credentials)) {\n json.credentials.forEach((c: SessionCredentials) => {\n this.credentialsCache!.set(this.getSessionKey(c.userId, c.sessionId), c);\n });\n }\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n // File does not exist, initialize empty\n this.memoryCache = new Map();\n this.credentialsCache = new Map();\n await this.flush();\n } else {\n console.error('[FileStorage] Failed to load sessions:', error);\n throw error;\n }\n }\n\n this.initialized = true;\n console.log(`[mcp-ts][Storage] File: ✓ storage directory at ${path.dirname(this.filePath)} verified.`);\n }\n\n private async ensureInitialized() {\n if (!this.initialized) await this.init();\n }\n\n private async flush(): Promise<void> {\n if (!this.memoryCache || !this.credentialsCache) return;\n await fs.writeFile(this.filePath, JSON.stringify({\n sessions: Array.from(this.memoryCache.values()),\n credentials: Array.from(this.credentialsCache.values()),\n }, null, 2), 'utf-8');\n }\n\n private getSessionKey(userId: string, sessionId: string): string {\n return `${userId}:${sessionId}`;\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n async create(session: Session): Promise<void> {\n await this.ensureInitialized();\n const { sessionId, userId } = session;\n if (!sessionId || !userId) throw new Error('userId and sessionId required');\n\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (this.memoryCache!.has(sessionKey)) {\n throw new Error(`Session ${sessionId} already exists`);\n }\n\n this.memoryCache!.set(sessionKey, normalizeNewSession(session));\n await this.flush();\n }\n\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n await this.ensureInitialized();\n if (!userId || !sessionId) throw new Error('userId and sessionId required');\n\n const sessionKey = this.getSessionKey(userId, sessionId);\n const current = this.memoryCache!.get(sessionKey);\n\n if (!current) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const updated = mergeSessionUpdate(current, data);\n\n this.memoryCache!.set(sessionKey, updated);\n await this.flush();\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n await this.ensureInitialized();\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (!this.memoryCache!.has(sessionKey)) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const current = this.credentialsCache!.get(sessionKey) ?? { sessionId, userId };\n this.credentialsCache!.set(sessionKey, { ...current, ...data, sessionId, userId });\n await this.flush();\n }\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n await this.ensureInitialized();\n const sessionKey = this.getSessionKey(userId, sessionId);\n return this.memoryCache!.get(sessionKey) || null;\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n await this.ensureInitialized();\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (!this.memoryCache!.has(sessionKey)) return null;\n return this.credentialsCache!.get(sessionKey) ?? { sessionId, userId };\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n await this.patchCredentials(userId, sessionId, {\n clientInformation: null,\n tokens: null,\n codeVerifier: null,\n clientId: null,\n oauthState: null,\n });\n }\n\n async list(userId: string): Promise<Session[]> {\n await this.ensureInitialized();\n return Array.from(this.memoryCache!.values()).filter(s => s.userId === userId);\n }\n\n async listIds(userId: string): Promise<string[]> {\n await this.ensureInitialized();\n return Array.from(this.memoryCache!.values())\n .filter(s => s.userId === userId)\n .map(s => s.sessionId);\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n await this.ensureInitialized();\n const sessionKey = this.getSessionKey(userId, sessionId);\n const deleted = this.memoryCache!.delete(sessionKey);\n this.credentialsCache!.delete(sessionKey);\n if (deleted) {\n await this.flush();\n }\n }\n\n async listAllIds(): Promise<string[]> {\n await this.ensureInitialized();\n return Array.from(this.memoryCache!.values()).map(s => s.sessionId);\n }\n\n async clearAll(): Promise<void> {\n await this.ensureInitialized();\n this.memoryCache!.clear();\n this.credentialsCache!.clear();\n await this.flush();\n }\n\n async cleanupExpired(): Promise<void> {\n await this.ensureInitialized();\n let changed = false;\n\n for (const [key, session] of this.memoryCache!.entries()) {\n if (!isSessionExpired(session)) continue;\n\n this.memoryCache!.delete(key);\n this.credentialsCache!.delete(key);\n changed = true;\n }\n\n if (changed) {\n await this.flush();\n }\n }\n\n async disconnect(): Promise<void> {\n // No explicit disconnect needed for file\n }\n}\n","import type { Database } from 'better-sqlite3';\nimport type { SessionStore, Session, SessionCredentials } from './types.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { generateSessionId } from '../../shared/utils.js';\nimport {\n mergeSessionUpdate,\n normalizeNewSession,\n normalizeStoredSession,\n isSessionExpired,\n} from './session-lifecycle.js';\n\nexport interface SqliteStorageOptions {\n path?: string;\n table?: string;\n}\n\nexport class SqliteStorage implements SessionStore {\n private db: Database | null = null;\n private table: string;\n private credentialsTable: string;\n private initialized = false;\n private dbPath: string;\n\n constructor(options: SqliteStorageOptions = {}) {\n this.dbPath = options.path || './sessions.db';\n this.table = options.table || 'mcp_sessions';\n this.credentialsTable = `${this.table}_credentials`;\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Dynamic import for peer dependency\n const DatabaseConstructor = (await import('better-sqlite3')).default;\n\n // Ensure directory exists\n const dir = path.dirname(this.dbPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n this.db = new DatabaseConstructor(this.dbPath);\n this.db.pragma('foreign_keys = ON');\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS ${this.table} (\n sessionId TEXT PRIMARY KEY,\n userId TEXT NOT NULL,\n data TEXT NOT NULL,\n expiresAt INTEGER\n );\n CREATE INDEX IF NOT EXISTS idx_${this.table}_userId ON ${this.table}(userId);\n CREATE TABLE IF NOT EXISTS ${this.credentialsTable} (\n sessionId TEXT NOT NULL,\n userId TEXT NOT NULL,\n data TEXT NOT NULL,\n PRIMARY KEY (userId, sessionId),\n FOREIGN KEY (sessionId) REFERENCES ${this.table}(sessionId) ON DELETE CASCADE\n );\n `);\n\n this.initialized = true;\n console.log(`[mcp-ts][Storage] SQLite: ✓ database at ${this.dbPath} verified.`);\n } catch (error: any) {\n if (error.code === 'MODULE_NOT_FOUND' || error.message?.includes('better-sqlite3')) {\n throw new Error(\n 'better-sqlite3 is not installed. Please install it with: npm install better-sqlite3'\n );\n }\n throw error;\n }\n }\n\n private ensureInitialized() {\n if (!this.initialized) {\n throw new Error('SqliteStorage not initialized. Call init() first.');\n }\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n async create(session: Session): Promise<void> {\n this.ensureInitialized();\n const { sessionId, userId } = session;\n\n if (!sessionId || !userId) {\n throw new Error('userId and sessionId required');\n }\n\n const sessionWithLifecycle = normalizeNewSession(session);\n\n try {\n const stmt = this.db!.prepare(\n `INSERT INTO ${this.table} (sessionId, userId, data, expiresAt) VALUES (?, ?, ?, ?)`\n );\n stmt.run(sessionId, userId, JSON.stringify(sessionWithLifecycle), sessionWithLifecycle.expiresAt ?? null);\n } catch (error: any) {\n if (error.code === 'SQLITE_CONSTRAINT_PRIMARYKEY') {\n throw new Error(`Session ${sessionId} already exists`);\n }\n throw error;\n }\n }\n\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n this.ensureInitialized();\n if (!sessionId || !userId) {\n throw new Error('userId and sessionId required');\n }\n\n const currentSession = await this.get(userId, sessionId);\n if (!currentSession) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n const updatedSession = mergeSessionUpdate(currentSession, data);\n\n const stmt = this.db!.prepare(\n `UPDATE ${this.table} SET data = ?, expiresAt = ? WHERE sessionId = ? AND userId = ?`\n );\n\n stmt.run(JSON.stringify(updatedSession), updatedSession.expiresAt ?? null, sessionId, userId);\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n this.ensureInitialized();\n if (!await this.get(userId, sessionId)) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n const current = await this.getCredentials(userId, sessionId) ?? { sessionId, userId };\n const credentials = { ...current, ...data, sessionId, userId };\n const stmt = this.db!.prepare(\n `INSERT INTO ${this.credentialsTable} (sessionId, userId, data)\n VALUES (?, ?, ?)\n ON CONFLICT(userId, sessionId) DO UPDATE SET data = excluded.data`\n );\n stmt.run(sessionId, userId, JSON.stringify(credentials));\n\n }\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n this.ensureInitialized();\n\n const stmt = this.db!.prepare(\n `SELECT data FROM ${this.table} WHERE sessionId = ? AND userId = ?`\n );\n const row = stmt.get(sessionId, userId) as { data: string } | undefined;\n\n if (!row) return null;\n return normalizeStoredSession(JSON.parse(row.data) as Session);\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n this.ensureInitialized();\n if (!await this.get(userId, sessionId)) return null;\n\n const stmt = this.db!.prepare(\n `SELECT data FROM ${this.credentialsTable} WHERE sessionId = ? AND userId = ?`\n );\n const row = stmt.get(sessionId, userId) as { data: string } | undefined;\n return row ? JSON.parse(row.data) as SessionCredentials : { sessionId, userId };\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n await this.patchCredentials(userId, sessionId, {\n clientInformation: null,\n tokens: null,\n codeVerifier: null,\n clientId: null,\n oauthState: null,\n });\n }\n\n async list(userId: string): Promise<Session[]> {\n this.ensureInitialized();\n\n const stmt = this.db!.prepare(\n `SELECT data FROM ${this.table} WHERE userId = ?`\n );\n const rows = stmt.all(userId) as { data: string }[];\n\n return rows.map(row => normalizeStoredSession(JSON.parse(row.data) as Session));\n }\n\n async listIds(userId: string): Promise<string[]> {\n this.ensureInitialized();\n\n const stmt = this.db!.prepare(\n `SELECT sessionId FROM ${this.table} WHERE userId = ?`\n );\n const rows = stmt.all(userId) as { sessionId: string }[];\n\n return rows.map(row => row.sessionId);\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n this.ensureInitialized();\n const stmt = this.db!.prepare(\n `DELETE FROM ${this.table} WHERE sessionId = ? AND userId = ?`\n );\n this.db!.prepare(\n `DELETE FROM ${this.credentialsTable} WHERE sessionId = ? AND userId = ?`\n ).run(sessionId, userId);\n stmt.run(sessionId, userId);\n }\n\n async listAllIds(): Promise<string[]> {\n this.ensureInitialized();\n const stmt = this.db!.prepare(`SELECT sessionId FROM ${this.table}`);\n const rows = stmt.all() as { sessionId: string }[];\n return rows.map(row => row.sessionId);\n }\n\n async clearAll(): Promise<void> {\n this.ensureInitialized();\n this.db!.prepare(`DELETE FROM ${this.credentialsTable}`).run();\n const stmt = this.db!.prepare(`DELETE FROM ${this.table}`);\n stmt.run();\n }\n\n async cleanupExpired(): Promise<void> {\n this.ensureInitialized();\n const rows = this.db!.prepare(`SELECT sessionId, userId, data FROM ${this.table}`).all() as {\n sessionId: string;\n userId: string;\n data: string;\n }[];\n const deleteStmt = this.db!.prepare(`DELETE FROM ${this.table} WHERE sessionId = ? AND userId = ?`);\n\n for (const row of rows) {\n const session = normalizeStoredSession(JSON.parse(row.data) as Session);\n if (isSessionExpired(session)) {\n deleteStmt.run(row.sessionId, row.userId);\n }\n }\n\n this.db!.prepare(\n `DELETE FROM ${this.credentialsTable}\n WHERE NOT EXISTS (\n SELECT 1 FROM ${this.table}\n WHERE ${this.table}.sessionId = ${this.credentialsTable}.sessionId\n AND ${this.table}.userId = ${this.credentialsTable}.userId\n )`\n ).run();\n }\n\n async disconnect(): Promise<void> {\n if (this.db) {\n this.db.close();\n }\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { SessionStore, Session, SessionCredentials } from './types.js';\nimport { generateSessionId } from '../../shared/utils.js';\nimport { encryptObject, decryptObject } from './crypto.js';\nimport { resolveSessionExpiresAt } from './session-lifecycle.js';\nimport { DORMANT_SESSION_EXPIRATION_MS } from '../../shared/constants.js';\n\nexport class SupabaseStorageBackend implements SessionStore {\n constructor(private supabase: SupabaseClient) {}\n\n async init(): Promise<void> {\n await this.assertTable('mcp_sessions', 'session_id');\n await this.assertTable('mcp_credentials', 'session_id');\n console.log('[mcp-ts][Storage] Supabase: storage tables verified.');\n }\n\n private async assertTable(table: string, column: string): Promise<void> {\n const { error } = await this.supabase\n .from(table)\n .select(column)\n .limit(0);\n\n if (!error) return;\n\n if (error.code === '42P01') {\n throw new Error(\n `[SupabaseStorage] Table \"${table}\" not found in your database. ` +\n 'Please run \"npx mcp-ts supabase-init\" to set up the required storage schema.'\n );\n }\n\n throw new Error(`[SupabaseStorage] Initialization check failed for \"${table}\": ${error.message}`);\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n private mapRowToSessionData(row: any): Session {\n return {\n sessionId: row.session_id,\n serverId: row.server_id,\n serverName: row.server_name,\n serverUrl: row.server_url,\n transportType: row.transport_type,\n callbackUrl: row.callback_url,\n createdAt: new Date(row.created_at).getTime(),\n updatedAt: new Date(row.updated_at ?? row.created_at).getTime(),\n expiresAt: row.expires_at ? new Date(row.expires_at).getTime() : null,\n userId: row.user_id,\n headers: decryptObject(row.headers),\n authUrl: row.auth_url,\n status: row.status ?? 'pending',\n };\n }\n\n private mapRowToCredentials(row: any, userId: string, sessionId: string): SessionCredentials {\n return {\n sessionId,\n userId,\n clientInformation: decryptObject(row?.client_information),\n tokens: decryptObject(row?.tokens),\n codeVerifier: decryptObject(row?.code_verifier),\n clientId: row?.client_id,\n oauthState: row?.oauth_state,\n };\n }\n\n private hasCredentialData(data: Partial<SessionCredentials>): boolean {\n return (\n 'clientInformation' in data ||\n 'tokens' in data ||\n 'codeVerifier' in data ||\n 'clientId' in data ||\n 'oauthState' in data\n );\n }\n\n async create(session: Session): Promise<void> {\n const { sessionId, userId } = session;\n if (!sessionId || !userId) throw new Error('userId and sessionId required');\n\n const status = session.status ?? 'pending';\n const createdAt = new Date(session.createdAt || Date.now()).toISOString();\n const updatedAt = new Date(session.updatedAt ?? session.createdAt ?? Date.now()).toISOString();\n const expiresAt = resolveSessionExpiresAt(status, new Date(createdAt).getTime());\n\n const { error } = await this.supabase\n .from('mcp_sessions')\n .insert({\n session_id: sessionId,\n user_id: userId,\n server_id: session.serverId,\n server_name: session.serverName,\n server_url: session.serverUrl,\n transport_type: session.transportType,\n callback_url: session.callbackUrl,\n created_at: createdAt,\n updated_at: updatedAt,\n headers: encryptObject(session.headers),\n auth_url: session.authUrl ?? null,\n status,\n expires_at: expiresAt === null ? null : new Date(expiresAt).toISOString(),\n });\n\n if (error) {\n if (error.code === '23505') {\n throw new Error(`Session ${sessionId} already exists`);\n }\n throw new Error(`Failed to create session in Supabase: ${error.message}`);\n }\n\n }\n\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n const updateData: any = {\n updated_at: new Date().toISOString(),\n };\n\n if ('serverId' in data) updateData.server_id = data.serverId;\n if ('serverName' in data) updateData.server_name = data.serverName;\n if ('serverUrl' in data) updateData.server_url = data.serverUrl;\n if ('transportType' in data) updateData.transport_type = data.transportType;\n if ('callbackUrl' in data) updateData.callback_url = data.callbackUrl;\n if ('status' in data) {\n const status = data.status ?? 'pending';\n const expiresAt = resolveSessionExpiresAt(status);\n updateData.status = status;\n updateData.expires_at = expiresAt === null ? null : new Date(expiresAt).toISOString();\n }\n if ('headers' in data) updateData.headers = encryptObject(data.headers);\n if ('authUrl' in data) updateData.auth_url = data.authUrl ?? null;\n\n const shouldUpdateSession = Object.keys(updateData).some((key) => key !== 'updated_at');\n\n let updatedRows: any[] | null = null;\n if (shouldUpdateSession) {\n const result = await this.supabase\n .from('mcp_sessions')\n .update(updateData)\n .eq('user_id', userId)\n .eq('session_id', sessionId)\n .select('id');\n\n if (result.error) {\n throw new Error(`Failed to update session: ${result.error.message}`);\n }\n updatedRows = result.data;\n } else {\n const result = await this.supabase\n .from('mcp_sessions')\n .select('id')\n .eq('user_id', userId)\n .eq('session_id', sessionId);\n\n if (result.error) {\n throw new Error(`Failed to update session: ${result.error.message}`);\n }\n updatedRows = result.data;\n }\n\n if (!updatedRows || updatedRows.length === 0) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n if (!this.hasCredentialData(data)) return;\n\n const row: any = {\n user_id: userId,\n session_id: sessionId,\n updated_at: new Date().toISOString(),\n };\n\n if ('clientInformation' in data) row.client_information = data.clientInformation == null ? null : encryptObject(data.clientInformation);\n if ('tokens' in data) row.tokens = data.tokens == null ? null : encryptObject(data.tokens);\n if ('codeVerifier' in data) row.code_verifier = data.codeVerifier == null ? null : encryptObject(data.codeVerifier);\n if ('clientId' in data) row.client_id = data.clientId ?? null;\n if ('oauthState' in data) row.oauth_state = data.oauthState ?? null;\n\n const { error } = await this.supabase\n .from('mcp_credentials')\n .upsert(row, { onConflict: 'user_id,session_id' });\n\n if (error) {\n throw new Error(`Failed to update credentials: ${error.message}`);\n }\n\n }\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n const { data, error } = await this.supabase\n .from('mcp_sessions')\n .select('*')\n .eq('user_id', userId)\n .eq('session_id', sessionId)\n .maybeSingle();\n\n if (error) {\n console.error('[SupabaseStorage] Failed to get session:', error);\n return null;\n }\n\n if (!data) return null;\n\n return this.mapRowToSessionData(data);\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n const { data, error } = await this.supabase\n .from('mcp_credentials')\n .select('*')\n .eq('user_id', userId)\n .eq('session_id', sessionId)\n .maybeSingle();\n\n if (error) {\n console.error('[SupabaseStorage] Failed to get credentials:', error);\n return null;\n }\n\n if (data) {\n return this.mapRowToCredentials(data, userId, sessionId);\n }\n\n const { data: sessionRows, error: sessionError } = await this.supabase\n .from('mcp_sessions')\n .select('id')\n .eq('user_id', userId)\n .eq('session_id', sessionId);\n\n if (sessionError || !sessionRows || sessionRows.length === 0) {\n return null;\n }\n\n return { sessionId, userId };\n }\n\n async list(userId: string): Promise<Session[]> {\n const { data, error } = await this.supabase\n .from('mcp_sessions')\n .select('*')\n .eq('user_id', userId);\n\n if (error) {\n console.error(`[SupabaseStorage] Failed to get session data for ${userId}:`, error);\n return [];\n }\n\n return data.map(row => this.mapRowToSessionData(row));\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n const { error } = await this.supabase\n .from('mcp_credentials')\n .delete()\n .eq('user_id', userId)\n .eq('session_id', sessionId);\n\n if (error) {\n throw new Error(`Failed to clear credentials: ${error.message}`);\n }\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n const { error } = await this.supabase\n .from('mcp_sessions')\n .delete()\n .eq('user_id', userId)\n .eq('session_id', sessionId);\n\n if (error) {\n console.error('[SupabaseStorage] Failed to remove session:', error);\n }\n }\n\n async listIds(userId: string): Promise<string[]> {\n const { data, error } = await this.supabase\n .from('mcp_sessions')\n .select('session_id')\n .eq('user_id', userId);\n\n if (error) {\n console.error(`[SupabaseStorage] Failed to get sessions for ${userId}:`, error);\n return [];\n }\n\n return data.map(row => row.session_id);\n }\n\n async listAllIds(): Promise<string[]> {\n const { data, error } = await this.supabase\n .from('mcp_sessions')\n .select('session_id');\n\n if (error) {\n console.error('[SupabaseStorage] Failed to get all sessions:', error);\n return [];\n }\n\n return data.map(row => row.session_id);\n }\n\n async clearAll(): Promise<void> {\n const { error: credentialsError } = await this.supabase\n .from('mcp_credentials')\n .delete()\n .neq('session_id', '');\n\n if (credentialsError) {\n console.error('[SupabaseStorage] Failed to clear credentials:', credentialsError);\n }\n\n const { error } = await this.supabase\n .from('mcp_sessions')\n .delete()\n .neq('session_id', '');\n\n if (error) {\n console.error('[SupabaseStorage] Failed to clear sessions:', error);\n }\n }\n\n async cleanupExpired(): Promise<void> {\n const { error: transientError } = await this.supabase\n .from('mcp_sessions')\n .delete()\n .not('expires_at', 'is', null)\n .neq('status', 'active')\n .lt('expires_at', new Date().toISOString());\n\n if (transientError) {\n console.error('[SupabaseStorage] Failed to cleanup expired inactive sessions:', transientError);\n }\n\n const dormantCutoff = new Date(Date.now() - DORMANT_SESSION_EXPIRATION_MS).toISOString();\n const { error: dormantError } = await this.supabase\n .from('mcp_sessions')\n .delete()\n .eq('status', 'active')\n .lt('updated_at', dormantCutoff);\n\n if (dormantError) {\n console.error('[SupabaseStorage] Failed to cleanup dormant active sessions:', dormantError);\n }\n }\n\n async disconnect(): Promise<void> {\n // Supabase client handles its own connection pooling over HTTP.\n }\n}\n","import { randomBytes, createCipheriv, createDecipheriv } from 'node:crypto';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst IV_LENGTH = 12;\nconst ENCRYPTION_PREFIX = 'enc:1:';\n\nlet warningLogged = false;\n\nfunction getKey(): Buffer | null {\n const keyString = process.env.STORAGE_ENCRYPTION_KEY;\n if (!keyString) return null;\n \n // Ensure key is 32 bytes (256 bits)\n if (keyString.length === 64) {\n return Buffer.from(keyString, 'hex');\n } else {\n const keyBuffer = Buffer.alloc(32);\n keyBuffer.write(keyString, 0, 32, 'utf-8');\n return keyBuffer;\n }\n}\n\n/**\n * Encrypts an object into a secure string.\n * Falls back to returning the original object if the encryption key is missing or encryption fails.\n */\nexport function encryptObject(data: any): any {\n if (data === undefined || data === null) return data;\n \n const key = getKey();\n if (!key) {\n if (!warningLogged) {\n console.warn('[mcp-ts][Storage] WARNING: STORAGE_ENCRYPTION_KEY is not set. Saving sensitive data in plain-text.');\n warningLogged = true;\n }\n return data; // Fallback to plain-text\n }\n\n try {\n const text = JSON.stringify(data);\n const iv = randomBytes(IV_LENGTH);\n const cipher = createCipheriv(ALGORITHM, key, iv);\n \n let encrypted = cipher.update(text, 'utf-8', 'hex');\n encrypted += cipher.final('hex');\n const authTag = cipher.getAuthTag().toString('hex');\n \n return `${ENCRYPTION_PREFIX}${iv.toString('hex')}:${authTag}:${encrypted}`;\n } catch (e) {\n console.error('[mcp-ts][Storage] Encryption failed, falling back to plain-text.', e);\n return data;\n }\n}\n\n/**\n * Decrypts a secure string back into an object.\n * Returns the original data if it is unencrypted or if decryption fails.\n */\nexport function decryptObject(data: any): any {\n if (data === undefined || data === null) return data;\n if (typeof data !== 'string' || !data.startsWith(ENCRYPTION_PREFIX)) {\n return data; // Already unencrypted or old plain-text data\n }\n\n const key = getKey();\n if (!key) {\n console.warn('[mcp-ts][Storage] WARNING: Found encrypted data but STORAGE_ENCRYPTION_KEY is missing. Returning raw encrypted string.');\n return data;\n }\n\n try {\n const parts = data.split(':');\n if (parts.length !== 5) {\n return data;\n }\n\n const iv = Buffer.from(parts[2], 'hex');\n const authTag = Buffer.from(parts[3], 'hex');\n const encryptedText = parts[4];\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n\n let decrypted = decipher.update(encryptedText, 'hex', 'utf-8');\n decrypted += decipher.final('utf-8');\n\n return JSON.parse(decrypted);\n } catch (e) {\n console.error('[mcp-ts][Storage] Decryption failed.', e);\n return data;\n }\n}\n","import type { SessionStore, Session, SessionCredentials } from './types.js';\nimport type { SessionStatus } from './types.js';\nimport { DORMANT_SESSION_EXPIRATION_MS } from '../../shared/constants.js';\nimport { generateSessionId } from '../../shared/utils.js';\nimport { encryptObject, decryptObject } from './crypto.js';\nimport { resolveSessionExpiresAt } from './session-lifecycle.js';\n\nexport interface NeonStorageOptions {\n schema?: string;\n table?: string;\n credentialsTable?: string;\n}\n\ntype NeonSql = {\n query(queryWithPlaceholders: string, params?: unknown[]): Promise<any[]>;\n};\n\ntype NeonSessionRow = {\n id?: string;\n session_id: string;\n server_id?: string | null;\n server_name?: string | null;\n server_url: string;\n transport_type: 'sse' | 'streamable-http';\n callback_url: string;\n created_at: string | Date;\n updated_at?: string | Date | null;\n expires_at?: string | Date | null;\n user_id: string;\n headers?: unknown;\n auth_url?: string | null;\n status?: SessionStatus | null;\n};\n\ntype NeonCredentialsRow = {\n session_id: string;\n user_id: string;\n client_information?: unknown;\n tokens?: unknown;\n code_verifier?: unknown;\n client_id?: string | null;\n oauth_state?: unknown;\n};\n\nexport class NeonStorageBackend implements SessionStore {\n private readonly tableName: string;\n private readonly credentialsTableName: string;\n\n constructor(\n private readonly sql: NeonSql,\n options: NeonStorageOptions = {}\n ) {\n const schema = options.schema || 'public';\n const table = options.table || 'mcp_sessions';\n const credentialsTable = options.credentialsTable || 'mcp_credentials';\n this.tableName = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(table)}`;\n this.credentialsTableName = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(credentialsTable)}`;\n }\n\n async init(): Promise<void> {\n await this.assertTable(this.tableName, 'mcp_sessions');\n await this.assertTable(this.credentialsTableName, 'mcp_credentials');\n console.log('[mcp-ts][Storage] Neon: storage tables verified.');\n }\n\n private async assertTable(qualifiedName: string, displayName: string): Promise<void> {\n const [{ exists } = { exists: null }] = await this.sql.query(\n 'SELECT to_regclass($1) AS exists',\n [qualifiedName.replace(/\"/g, '')]\n ) as Array<{ exists: string | null }>;\n\n if (!exists) {\n throw new Error(\n `[NeonStorage] Table \"${displayName}\" not found in your database. ` +\n 'Please create it using the Neon storage guide in docs/storage-backends/neon.md.'\n );\n }\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n private quoteIdentifier(identifier: string): string {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {\n throw new Error(`Invalid Neon storage identifier: ${identifier}`);\n }\n return `\"${identifier}\"`;\n }\n\n private mapRowToSessionData(row: NeonSessionRow): Session {\n return {\n sessionId: row.session_id,\n serverId: row.server_id ?? undefined,\n serverName: row.server_name ?? undefined,\n serverUrl: row.server_url,\n transportType: row.transport_type,\n callbackUrl: row.callback_url,\n createdAt: new Date(row.created_at).getTime(),\n updatedAt: new Date(row.updated_at ?? row.created_at).getTime(),\n expiresAt: row.expires_at ? new Date(row.expires_at).getTime() : null,\n userId: row.user_id,\n headers: decryptObject(row.headers),\n authUrl: row.auth_url ?? undefined,\n status: row.status ?? 'pending',\n };\n }\n\n private mapRowToCredentials(row: NeonCredentialsRow, userId: string, sessionId: string): SessionCredentials {\n return {\n sessionId,\n userId,\n clientInformation: decryptObject(row.client_information),\n tokens: decryptObject(row.tokens),\n codeVerifier: decryptObject(row.code_verifier),\n clientId: row.client_id ?? undefined,\n oauthState: row.oauth_state as SessionCredentials['oauthState'],\n };\n }\n\n private hasCredentialData(data: Partial<SessionCredentials>): boolean {\n return (\n 'clientInformation' in data ||\n 'tokens' in data ||\n 'codeVerifier' in data ||\n 'clientId' in data ||\n 'oauthState' in data\n );\n }\n\n async create(session: Session): Promise<void> {\n const { sessionId, userId } = session;\n if (!sessionId || !userId) throw new Error('userId and sessionId required');\n\n const status = session.status ?? 'pending';\n const createdAt = new Date(session.createdAt || Date.now()).toISOString();\n const updatedAt = new Date(session.updatedAt ?? session.createdAt ?? Date.now()).toISOString();\n const expiresAt = resolveSessionExpiresAt(status, new Date(createdAt).getTime());\n\n try {\n await this.sql.query(\n `INSERT INTO ${this.tableName} (\n session_id,\n user_id,\n server_id,\n server_name,\n server_url,\n transport_type,\n callback_url,\n created_at,\n updated_at,\n headers,\n auth_url,\n status,\n expires_at\n ) VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8,\n $9, $10, $11, $12, $13\n )`,\n [\n sessionId,\n userId,\n session.serverId,\n session.serverName,\n session.serverUrl,\n session.transportType,\n session.callbackUrl,\n createdAt,\n updatedAt,\n encryptObject(session.headers),\n session.authUrl ?? null,\n status,\n expiresAt === null ? null : new Date(expiresAt).toISOString(),\n ]\n );\n } catch (error: any) {\n if (error.code === '23505') {\n throw new Error(`Session ${sessionId} already exists`);\n }\n throw new Error(`Failed to create session in Neon: ${error.message}`);\n }\n\n }\n\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n const currentSession = await this.get(userId, sessionId);\n if (!currentSession) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n const updatedSession = { ...currentSession, ...data };\n const status = updatedSession.status ?? 'pending';\n const expiresAt = resolveSessionExpiresAt(status);\n\n const shouldUpdateSession = (\n 'serverId' in data ||\n 'serverName' in data ||\n 'serverUrl' in data ||\n 'transportType' in data ||\n 'callbackUrl' in data ||\n 'status' in data ||\n 'headers' in data ||\n 'authUrl' in data\n );\n\n if (shouldUpdateSession) {\n const updatedRows = await this.sql.query(\n `UPDATE ${this.tableName}\n SET\n server_id = $1,\n server_name = $2,\n server_url = $3,\n transport_type = $4,\n callback_url = $5,\n status = $6,\n headers = $7,\n auth_url = $8,\n expires_at = $9,\n updated_at = now()\n WHERE user_id = $10 AND session_id = $11\n RETURNING id`,\n [\n updatedSession.serverId,\n updatedSession.serverName,\n updatedSession.serverUrl,\n updatedSession.transportType,\n updatedSession.callbackUrl,\n status,\n encryptObject(updatedSession.headers),\n updatedSession.authUrl ?? null,\n expiresAt === null ? null : new Date(expiresAt).toISOString(),\n userId,\n sessionId,\n ]\n ) as Array<{ id: string }>;\n\n if (updatedRows.length === 0) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n }\n\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n if (!this.hasCredentialData(data)) return;\n\n await this.sql.query(\n `INSERT INTO ${this.credentialsTableName} (\n user_id,\n session_id,\n client_information,\n tokens,\n code_verifier,\n client_id,\n oauth_state,\n updated_at\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, now())\n ON CONFLICT (user_id, session_id)\n DO UPDATE SET\n client_information = CASE WHEN $8 THEN EXCLUDED.client_information ELSE ${this.credentialsTableName}.client_information END,\n tokens = CASE WHEN $9 THEN EXCLUDED.tokens ELSE ${this.credentialsTableName}.tokens END,\n code_verifier = CASE WHEN $10 THEN EXCLUDED.code_verifier ELSE ${this.credentialsTableName}.code_verifier END,\n client_id = CASE WHEN $11 THEN EXCLUDED.client_id ELSE ${this.credentialsTableName}.client_id END,\n oauth_state = CASE WHEN $12 THEN EXCLUDED.oauth_state ELSE ${this.credentialsTableName}.oauth_state END,\n updated_at = now()`,\n [\n userId,\n sessionId,\n 'clientInformation' in data ? (data.clientInformation == null ? null : encryptObject(data.clientInformation)) : null,\n 'tokens' in data ? (data.tokens == null ? null : encryptObject(data.tokens)) : null,\n 'codeVerifier' in data ? (data.codeVerifier == null ? null : encryptObject(data.codeVerifier)) : null,\n 'clientId' in data ? (data.clientId ?? null) : null,\n 'oauthState' in data ? (data.oauthState ?? null) : null,\n 'clientInformation' in data,\n 'tokens' in data,\n 'codeVerifier' in data,\n 'clientId' in data,\n 'oauthState' in data,\n ]\n );\n\n }\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n try {\n const rows = await this.sql.query(\n `SELECT * FROM ${this.tableName} WHERE user_id = $1 AND session_id = $2`,\n [userId, sessionId]\n ) as NeonSessionRow[];\n\n if (!rows[0]) return null;\n\n return this.mapRowToSessionData(rows[0]);\n } catch (error) {\n console.error('[NeonStorage] Failed to get session:', error);\n return null;\n }\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n try {\n const credentialRows = await this.sql.query(\n `SELECT * FROM ${this.credentialsTableName} WHERE user_id = $1 AND session_id = $2`,\n [userId, sessionId]\n ) as NeonCredentialsRow[];\n\n if (credentialRows[0]) {\n return this.mapRowToCredentials(credentialRows[0], userId, sessionId);\n }\n\n const sessionRows = await this.sql.query(\n `SELECT id FROM ${this.tableName} WHERE user_id = $1 AND session_id = $2`,\n [userId, sessionId]\n ) as Array<{ id: string }>;\n\n return sessionRows[0] ? { sessionId, userId } : null;\n } catch (error) {\n console.error('[NeonStorage] Failed to get credentials:', error);\n return null;\n }\n }\n\n async list(userId: string): Promise<Session[]> {\n try {\n const rows = await this.sql.query(\n `SELECT * FROM ${this.tableName} WHERE user_id = $1`,\n [userId]\n ) as NeonSessionRow[];\n return rows.map((row) => this.mapRowToSessionData(row));\n } catch (error) {\n console.error(`[NeonStorage] Failed to get session data for ${userId}:`, error);\n return [];\n }\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n try {\n await this.sql.query(\n `DELETE FROM ${this.credentialsTableName} WHERE user_id = $1 AND session_id = $2`,\n [userId, sessionId]\n );\n } catch (error) {\n console.error('[NeonStorage] Failed to clear credentials:', error);\n }\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n try {\n await this.sql.query(\n `DELETE FROM ${this.tableName} WHERE user_id = $1 AND session_id = $2`,\n [userId, sessionId]\n );\n } catch (error) {\n console.error('[NeonStorage] Failed to remove session:', error);\n }\n }\n\n async listIds(userId: string): Promise<string[]> {\n try {\n const rows = await this.sql.query(\n `SELECT session_id FROM ${this.tableName} WHERE user_id = $1`,\n [userId]\n ) as Array<{ session_id: string }>;\n return rows.map((row) => row.session_id);\n } catch (error) {\n console.error(`[NeonStorage] Failed to get sessions for ${userId}:`, error);\n return [];\n }\n }\n\n async listAllIds(): Promise<string[]> {\n try {\n const rows = await this.sql.query(\n `SELECT session_id FROM ${this.tableName}`\n ) as Array<{ session_id: string }>;\n return rows.map((row) => row.session_id);\n } catch (error) {\n console.error('[NeonStorage] Failed to get all sessions:', error);\n return [];\n }\n }\n\n async clearAll(): Promise<void> {\n try {\n await this.sql.query(`DELETE FROM ${this.credentialsTableName}`);\n await this.sql.query(`DELETE FROM ${this.tableName}`);\n } catch (error) {\n console.error('[NeonStorage] Failed to clear sessions:', error);\n }\n }\n\n async cleanupExpired(): Promise<void> {\n try {\n await this.sql.query(\n `DELETE FROM ${this.tableName}\n WHERE expires_at IS NOT NULL\n AND expires_at < $1\n AND status <> 'active'`,\n [new Date().toISOString()]\n );\n await this.sql.query(\n `DELETE FROM ${this.tableName}\n WHERE status = 'active' AND updated_at < $1`,\n [new Date(Date.now() - DORMANT_SESSION_EXPIRATION_MS).toISOString()]\n );\n } catch (error) {\n console.error('[NeonStorage] Failed to cleanup expired sessions:', error);\n }\n }\n\n async disconnect(): Promise<void> {\n // Neon HTTP queries do not hold a persistent connection.\n }\n}\n","\nimport type { MCPClient } from '../mcp/oauth-client.js';\nimport type {\n OAuthTokens,\n OAuthClientInformationMixed,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nexport interface OAuthState {\n nonce: string;\n sessionId: string;\n serverId: string;\n createdAt: number;\n}\n\nexport type SessionStatus = 'pending' | 'active';\n\nexport interface Session {\n sessionId: string;\n serverId?: string; // Database server ID for mapping\n serverName?: string;\n serverUrl: string;\n transportType: 'sse' | 'streamable-http';\n callbackUrl: string;\n createdAt: number;\n updatedAt?: number;\n /**\n * Storage-owned expiration timestamp for pending/inactive sessions.\n * Active sessions use updatedAt-based dormancy cleanup instead.\n */\n expiresAt?: number | null;\n userId: string;\n headers?: Record<string, string>;\n authUrl?: string | null;\n /**\n * Session status marker used for lifecycle cleanup:\n * - pending: short-lived intermediate/auth-pending session state\n * - active: restorable session after successful connection/auth completion\n */\n status?: SessionStatus;\n}\n\nexport interface SessionCredentials {\n sessionId: string;\n userId: string;\n clientInformation?: OAuthClientInformationMixed | null;\n tokens?: OAuthTokens | null;\n codeVerifier?: string | null;\n clientId?: string | null;\n oauthState?: OAuthState | null;\n}\n\nexport type SessionMutationType = 'create' | 'update' | 'delete';\n\nexport interface SessionMutationEvent {\n type: SessionMutationType;\n userId: string;\n sessionId: string;\n timestamp: number;\n session?: Session;\n patch?: Partial<Session>;\n}\n\nexport type SessionMutationListener = (event: SessionMutationEvent) => void | Promise<void>;\n\nexport interface SetClientOptions {\n sessionId: string;\n serverId?: string; // Database server ID\n serverName?: string; // Human-readable server name\n client?: MCPClient;\n serverUrl?: string;\n callbackUrl?: string;\n transportType?: 'sse' | 'streamable-http';\n userId?: string;\n headers?: Record<string, string>;\n}\n\n/**\n * Interface for MCP session stores.\n */\nexport interface SessionStore {\n /**\n * Optional initialization (e.g., database connection)\n */\n init?(): Promise<void>;\n\n /**\n * Generates a unique session ID\n */\n generateSessionId(): string;\n\n /**\n * Creates a new session. Throws if session already exists.\n * @param session - Session data to create\n */\n create(session: Session): Promise<void>;\n\n /**\n * Updates an existing session with partial data. Throws if session does not exist.\n * @param userId - User identifier\n * @param sessionId - Session identifier\n * @param data - Partial session data to update\n */\n update(userId: string, sessionId: string, data: Partial<Session>): Promise<void>;\n\n /**\n * Patches runtime credentials for an existing session.\n * These values are separated from connection metadata in durable SQL stores.\n */\n patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void>;\n\n /**\n * Retrieves a session\n */\n get(userId: string, sessionId: string): Promise<Session | null>;\n\n /**\n * Retrieves runtime credentials for a session.\n */\n getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null>;\n\n /**\n * Clears runtime credentials without removing connection metadata.\n */\n clearCredentials(userId: string, sessionId: string): Promise<void>;\n\n /**\n * Gets full session data for all sessions owned by a user\n */\n list(userId: string): Promise<Session[]>;\n\n /**\n * Removes a session\n */\n delete(userId: string, sessionId: string): Promise<void>;\n\n /**\n * Gets all session IDs owned by a user\n */\n listIds(userId: string): Promise<string[]>;\n\n /**\n * Gets all session IDs across all users (Admin)\n */\n listAllIds(): Promise<string[]>;\n\n /**\n * Clears all sessions (Admin)\n */\n clearAll(): Promise<void>;\n\n /**\n * Clean up expired sessions\n */\n cleanupExpired(): Promise<void>;\n\n /**\n * Disconnect from storage backend\n */\n disconnect(): Promise<void>;\n}\n","/**\n * Simple event emitter pattern for MCP connection events\n * Inspired by Cloudflare's agents pattern but adapted for serverless\n */\n\nexport type Disposable = {\n dispose(): void;\n};\n\nexport type Event<T> = (listener: (event: T) => void) => Disposable;\n\n/**\n * Event emitter class for type-safe event handling\n * Similar to Cloudflare's Emitter but simplified for our use case\n */\nexport class Emitter<T> {\n private listeners: Set<(event: T) => void> = new Set();\n\n /**\n * Subscribe to events\n * @param listener - Callback function to handle events\n * @returns Disposable to unsubscribe\n */\n get event(): Event<T> {\n return (listener: (event: T) => void) => {\n this.listeners.add(listener);\n return {\n dispose: () => {\n this.listeners.delete(listener);\n },\n };\n };\n }\n\n /**\n * Fire an event to all listeners\n * @param event - Event data to emit\n */\n fire(event: T): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('[Emitter] Error in event listener:', error);\n }\n }\n }\n\n /**\n * Clear all listeners\n */\n dispose(): void {\n this.listeners.clear();\n }\n\n /**\n * Get number of active listeners\n */\n get listenerCount(): number {\n return this.listeners.size;\n }\n}\n\n/**\n * Connection state types matching your existing ConnectionStatus\n * Extended with more granular states for better observability\n */\nexport type McpConnectionState =\n | 'DISCONNECTED' // Not connected\n | 'CONNECTING' // Establishing transport connection to MCP server\n | 'AUTHENTICATING' // OAuth flow in progress\n | 'AUTHENTICATED' // OAuth complete, pre-connect\n | 'DISCOVERING' // Discovering server capabilities (tools, resources, prompts)\n | 'CONNECTED' // Transport connection established\n | 'READY' // Fully connected and ready to use\n | 'VALIDATING' // Validating existing session\n | 'RECONNECTING' // Attempting to reconnect\n | 'INITIALIZING' // Initializing session or connection\n | 'FAILED'; // Connection error at some point\n\n/**\n * MCP Connection Event Types\n * Discriminated union for type-safe event handling\n */\nexport type McpConnectionEvent =\n | {\n type: 'state_changed';\n sessionId: string;\n serverId: string;\n serverName: string;\n serverUrl: string;\n createdAt?: number;\n state: McpConnectionState;\n previousState: McpConnectionState;\n timestamp: number;\n }\n | {\n type: 'tools_discovered';\n sessionId: string;\n serverId: string;\n toolCount: number;\n tools: any[];\n timestamp: number;\n }\n | {\n type: 'auth_required';\n sessionId: string;\n serverId: string;\n authUrl: string;\n timestamp: number;\n }\n | {\n type: 'error';\n sessionId: string;\n serverId: string;\n error: string;\n errorType: 'connection' | 'auth' | 'validation' | 'unknown';\n timestamp: number;\n }\n | {\n type: 'disconnected';\n sessionId: string;\n serverId: string;\n timestamp: number;\n }\n | {\n type: 'progress';\n sessionId: string;\n serverId: string;\n message: string;\n timestamp: number;\n };\n\n/**\n * Event fired when a tool execution returns a UI resource URI\n */\nexport interface McpAppsUIEvent {\n type: 'mcp-apps-ui';\n sessionId: string;\n resourceUri: string;\n toolName: string;\n result: unknown;\n timestamp: number;\n}\n\n/**\n * Observability event for debugging and monitoring\n */\nexport interface McpObservabilityEvent {\n type?: string;\n level?: 'debug' | 'info' | 'warn' | 'error';\n message?: string;\n displayMessage?: string;\n sessionId?: string;\n serverId?: string;\n payload?: Record<string, any>;\n metadata?: Record<string, any>; // Kept for backward compatibility\n timestamp: number;\n id?: string;\n}\n\n/**\n * DisposableStore for managing multiple disposables\n * Useful for cleanup in React hooks\n */\nexport class DisposableStore {\n private disposables: Set<Disposable> = new Set();\n\n add(disposable: Disposable): void {\n this.disposables.add(disposable);\n }\n\n dispose(): void {\n for (const disposable of this.disposables) {\n disposable.dispose();\n }\n this.disposables.clear();\n }\n}\n","/**\n * Standardized error classes for MCP Redis library\n * Provides consistent error handling across the codebase\n */\n\n/**\n * Base error class for all MCP-related errors\n */\nexport class McpError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = 'McpError';\n // Maintain proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n ...(this.cause ? { cause: this.cause.message } : {}),\n };\n }\n}\n\n/**\n * Thrown when OAuth authorization is required\n */\nexport class UnauthorizedError extends McpError {\n constructor(message: string = 'OAuth authorization required', cause?: Error) {\n super('UNAUTHORIZED', message, cause);\n this.name = 'UnauthorizedError';\n }\n}\n\n/**\n * Thrown when connection to MCP server fails\n */\nexport class ConnectionError extends McpError {\n constructor(message: string, cause?: Error) {\n super('CONNECTION_ERROR', message, cause);\n this.name = 'ConnectionError';\n }\n}\n\n/**\n * Thrown when session is not found or expired\n */\nexport class SessionNotFoundError extends McpError {\n constructor(sessionId: string, cause?: Error) {\n super('SESSION_NOT_FOUND', `Session not found: ${sessionId}`, cause);\n this.name = 'SessionNotFoundError';\n }\n}\n\n/**\n * Thrown when session validation fails\n */\nexport class SessionValidationError extends McpError {\n constructor(message: string, cause?: Error) {\n super('SESSION_VALIDATION_ERROR', message, cause);\n this.name = 'SessionValidationError';\n }\n}\n\n/**\n * Thrown when authentication fails\n */\nexport class AuthenticationError extends McpError {\n constructor(message: string, cause?: Error) {\n super('AUTH_ERROR', message, cause);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Thrown when OAuth state validation fails\n */\nexport class InvalidStateError extends McpError {\n constructor(message: string = 'Invalid OAuth state', cause?: Error) {\n super('INVALID_STATE', message, cause);\n this.name = 'InvalidStateError';\n }\n}\n\n/**\n * Thrown when client is not connected\n */\nexport class NotConnectedError extends McpError {\n constructor(message: string = 'Not connected to server', cause?: Error) {\n super('NOT_CONNECTED', message, cause);\n this.name = 'NotConnectedError';\n }\n}\n\n/**\n * Thrown when required configuration is missing\n */\nexport class ConfigurationError extends McpError {\n constructor(message: string, cause?: Error) {\n super('CONFIGURATION_ERROR', message, cause);\n this.name = 'ConfigurationError';\n }\n}\n\n/**\n * Thrown when tool execution fails\n */\nexport class ToolExecutionError extends McpError {\n constructor(toolName: string, message: string, cause?: Error) {\n super('TOOL_EXECUTION_ERROR', `Tool '${toolName}' failed: ${message}`, cause);\n this.name = 'ToolExecutionError';\n }\n}\n\n/**\n * RPC error codes for SSE communication\n */\nexport const RpcErrorCodes = {\n EXECUTION_ERROR: 'EXECUTION_ERROR',\n MISSING_USER_ID: 'MISSING_USER_ID',\n UNAUTHORIZED: 'UNAUTHORIZED',\n NO_CONNECTION: 'NO_CONNECTION',\n UNKNOWN_METHOD: 'UNKNOWN_METHOD',\n INVALID_PARAMS: 'INVALID_PARAMS',\n} as const;\n\nexport type RpcErrorCode = typeof RpcErrorCodes[keyof typeof RpcErrorCodes];\n","\n\nimport { MCPClient } from './oauth-client.js';\nimport { sessions, type Session } from '../storage/index.js';\n\nconst DEFAULT_TIMEOUT_MS = 15000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_RETRY_DELAY_MS = 1000;\nconst CONNECTION_BATCH_SIZE = 5;\n\n/**\n * Manages multiple MCP connections for a single user.\n * Allows aggregating tools from all connected servers.\n */\nexport interface MultiSessionOptions {\n /**\n * Connection timeout in milliseconds\n * @default 15000\n */\n timeout?: number;\n /**\n * Maximum number of retry attempts\n * @default 2\n */\n maxRetries?: number;\n /**\n * Delay between retries in milliseconds\n * @default 1000\n */\n retryDelay?: number;\n}\n\n/**\n * Manages multiple MCP client connections for a single user.\n *\n * On a traditional long-running server, you can cache this instance per user\n * so the connections stay alive between requests. On serverless, a new instance\n * will be created per invocation, but the underlying session data is always\n * read from the storage backend so nothing is lost between calls.\n */\nexport class MultiSessionClient {\n private clients: MCPClient[] = [];\n private userId: string;\n private options: MultiSessionOptions;\n\n /**\n * Creates a new MultiSessionClient for the given user userId.\n *\n * @param userId - A unique string identifying the user (e.g. user ID or email).\n * @param options - Optional tuning for connection timeout, retry count, and retry delay.\n * Falls back to sensible defaults if not provided.\n */\n constructor(userId: string, options: MultiSessionOptions = {}) {\n this.userId = userId;\n this.options = {\n timeout: DEFAULT_TIMEOUT_MS,\n maxRetries: DEFAULT_MAX_RETRIES,\n retryDelay: DEFAULT_RETRY_DELAY_MS,\n ...options\n };\n }\n\n /**\n * Fetches all sessions for this userId from storage and returns only the\n * ones that are ready to connect.\n *\n * A session is considered connectable when:\n * - It has a `serverId`, `serverUrl`, and `callbackUrl` (i.e. it was fully initialized)\n * - Its status is `active`. Pending sessions are skipped here\n * and let the OAuth flow complete separately before we try to reconnect them.\n */\n private async getActiveSessions(): Promise<Session[]> {\n const sessionList = await sessions.list(this.userId);\n const valid = sessionList.filter(s =>\n s.serverId &&\n s.serverUrl &&\n s.callbackUrl &&\n s.status === 'active'\n );\n return valid;\n }\n\n /**\n * Connects to a list of sessions in controlled batches of `CONNECTION_BATCH_SIZE`.\n *\n * Batching prevents overwhelming the event loop or external servers when a user\n * has many active MCP sessions (e.g. 20+ servers). Within each batch, sessions\n * are connected concurrently using `Promise.all` for speed.\n */\n private async connectInBatches(sessions: Session[]): Promise<void> {\n for (let i = 0; i < sessions.length; i += CONNECTION_BATCH_SIZE) {\n const batch = sessions.slice(i, i + CONNECTION_BATCH_SIZE);\n await Promise.all(batch.map(session => this.connectSession(session)));\n }\n }\n\n private connectionPromises = new Map<string, Promise<void>>();\n\n /**\n * Connects a single session, with built-in deduplication to prevent race conditions.\n *\n * - If a client for this session already exists and is connected, returns immediately.\n * - If the existing client entry is no longer connected (e.g. it was explicitly\n * disconnected), it is evicted so that `establishConnectionWithRetries` creates a\n * fresh transport — preventing \"Client already connected\" errors from the SDK.\n * - If a connection attempt for this session is already in-flight (e.g. from a\n * concurrent call), it joins the existing promise instead of starting a new one.\n * This is the key concurrency lock — the `connectionPromises` map acts as a\n * per-session mutex so we never spin up two physical connections for the same session.\n * - On completion (success or failure), the promise is cleaned up from the map.\n */\n private async connectSession(session: Session): Promise<void> {\n const existing = this.clients.find(c => c.getSessionId() === session.sessionId);\n\n if (existing) {\n if (existing.isConnected()) {\n // Genuinely connected — nothing to do.\n return;\n }\n\n // Client entry exists but is no longer connected (explicit disconnect or\n // a prior failed reconnect attempt). Remove it so the fresh connect below\n // starts with a clean slate and the underlying SDK Client doesn't complain\n // about an already-attached transport.\n this.clients = this.clients.filter(c => c !== existing);\n }\n\n // Avoid concurrent connection attempts for the same session\n if (this.connectionPromises.has(session.sessionId)) {\n return this.connectionPromises.get(session.sessionId)!;\n }\n\n const connectPromise = this.establishConnectionWithRetries(session);\n\n this.connectionPromises.set(session.sessionId, connectPromise);\n\n try {\n await connectPromise;\n } finally {\n this.connectionPromises.delete(session.sessionId);\n }\n }\n\n /**\n * The core connection loop for a single session.\n *\n * Attempts to establish a physical MCP connection, retrying up to `maxRetries` times\n * if the connection fails. Each attempt:\n * 1. Creates a fresh `MCPClient` instance from the session data.\n * 2. Races the connect call against a timeout promise — if the server doesn't respond\n * within `timeoutMs`, the attempt is aborted and counted as a failure.\n * 3. On success, replaces any stale client entry for this session in the `clients` array.\n * 4. On failure, waits `retryDelay` ms before the next attempt.\n *\n * If all attempts are exhausted, logs an error and returns silently (does not throw),\n * so a single bad server doesn't block the rest of the batch from connecting.\n */\n private async establishConnectionWithRetries(session: Session): Promise<void> {\n const maxRetries = this.options.maxRetries ?? DEFAULT_MAX_RETRIES;\n const retryDelay = this.options.retryDelay ?? DEFAULT_RETRY_DELAY_MS;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const client = new MCPClient({\n userId: this.userId,\n sessionId: session.sessionId,\n serverId: session.serverId,\n serverUrl: session.serverUrl,\n callbackUrl: session.callbackUrl,\n serverName: session.serverName,\n transportType: session.transportType,\n headers: session.headers,\n });\n\n const timeoutMs = this.options.timeout ?? DEFAULT_TIMEOUT_MS;\n let timeoutTimer: ReturnType<typeof setTimeout>;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutTimer = setTimeout(() => reject(new Error(`Connection timed out after ${timeoutMs}ms`)), timeoutMs);\n });\n\n try {\n await Promise.race([client.connect(), timeoutPromise]);\n } finally {\n clearTimeout(timeoutTimer!);\n }\n\n // Always replace the disconnected client entry\n this.clients = this.clients.filter(c => c.getSessionId() !== session.sessionId);\n this.clients.push(client);\n return; // successfully connected\n } catch (error) {\n lastError = error;\n if (attempt < maxRetries) {\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n }\n }\n }\n\n console.error(`[MultiSessionClient] Failed to connect to session ${session.sessionId} after ${maxRetries + 1} attempts:`, lastError);\n }\n\n /**\n * The main entry point. Fetches all active sessions for this userId from\n * storage and establishes connections to all of them in batches.\n *\n * Call this once after creating the client. On traditional servers, you can\n * cache the `MultiSessionClient` instance after calling `connect()` to avoid\n * re-fetching and re-connecting on every request.\n */\n async connect(): Promise<void> {\n const sessions = await this.getActiveSessions();\n const activeSessionIds = new Set(sessions.map(s => s.sessionId));\n\n // Prune stale clients whose sessions no longer exist in storage.\n // Otherwise a lingering MCPClient with a still-alive SDK Client\n // transport triggers OAuth refreshes on listTools(), and the\n // StorageOAuthClientProvider.state() -> patchCredentials() call\n // fails with a FK violation because the session was deleted.\n this.clients = this.clients.filter(c => activeSessionIds.has(c.getSessionId()));\n\n await this.connectInBatches(sessions);\n }\n\n /**\n * Drops all cached `MCPClient` instances and reconnects fresh from storage.\n *\n * Call this when downstream MCP servers have expired their transport sessions\n * (e.g. after a remote server restart) and subsequent tool calls return\n * \"Session not found. Reconnect without session header.\" errors.\n *\n * OAuth tokens are preserved in the storage backend — no re-authentication\n * is required. Only the in-memory transport sessions are cleared.\n */\n async reconnect(): Promise<void> {\n await this.disconnect();\n await this.connect();\n }\n\n /**\n * Returns all currently connected `MCPClient` instances.\n *\n * Use this to enumerate available tools across all connected servers,\n * or to route a tool call to the right client by `serverId`.\n */\n getClients(): MCPClient[] {\n return this.clients;\n }\n\n /**\n * Gracefully disconnects all active MCP clients and clears the internal client list.\n *\n * For Streamable HTTP sessions, each client sends an HTTP DELETE to its MCP\n * endpoint per the spec before closing locally. All disconnects run in\n * parallel so shutdown is not serialised across many sessions.\n *\n * Call this during server shutdown or when a user logs out to free up\n * underlying transport resources (SSE streams, HTTP connections, etc.).\n */\n async disconnect(): Promise<void> {\n await Promise.all(this.clients.map((client) => client.disconnect()));\n this.clients = [];\n }\n}\n\n","/**\n * SSE (Server-Sent Events) Handler for MCP Connections\n *\n * Manages real-time bidirectional communication with MCP clients:\n * - SSE stream for server → client events (connection state, tools, logs)\n * - HTTP POST for client → server RPC requests\n *\n * Key features:\n * - Direct HTTP response for RPC calls (bypasses SSE latency)\n * - Automatic session restoration and validation\n * - OAuth 2.1 authentication flow support\n * - Heartbeat to keep connections alive\n */\n\nimport type { McpConnectionEvent, McpObservabilityEvent } from '../../shared/events.js';\nimport type {\n McpRpcRequest,\n McpRpcResponse,\n ConnectParams,\n DisconnectParams,\n SessionParams,\n CallToolParams,\n GetPromptParams,\n ReadResourceParams,\n FinishAuthParams,\n SessionListResult,\n ConnectResult,\n DisconnectResult,\n GetSessionResult,\n FinishAuthResult,\n ListToolsRpcResult,\n ListPromptsResult,\n ListResourcesResult,\n CallToolResult,\n} from '../../shared/types.js';\nimport { RpcErrorCodes } from '../../shared/errors.js';\nimport { UnauthorizedError } from '../../shared/errors.js';\nimport { isConnectionEvent, isRpcResponseEvent } from '../../shared/event-routing.js';\nimport { parseOAuthState } from '../../shared/utils.js';\nimport { MCPClient } from '../mcp/oauth-client.js';\nimport { sessions } from '../storage/index.js';\n\n// ============================================\n// Types & Interfaces\n// ============================================\n\nexport interface ClientMetadata {\n clientName?: string;\n clientUri?: string;\n logoUri?: string;\n policyUri?: string;\n}\n\nexport interface SSEHandlerOptions {\n /** User/Client identifier */\n userId: string;\n\n /** Optional callback for authentication/authorization */\n onAuth?: (userId: string) => Promise<boolean>;\n\n /** Heartbeat interval in milliseconds @default 30000 */\n heartbeatInterval?: number;\n\n /** Static OAuth client metadata defaults (for all connections) */\n clientDefaults?: ClientMetadata;\n\n /** Dynamic OAuth client metadata getter (per-request, useful for multi-tenant) */\n getClientMetadata?: (request?: unknown) => ClientMetadata | Promise<ClientMetadata>;\n}\n\n// ============================================\n// Constants\n// ============================================\n\nconst DEFAULT_HEARTBEAT_INTERVAL = 30000;\n\nfunction normalizeHeaders(headers?: Record<string, string>): Record<string, string> | undefined {\n if (!headers || typeof headers !== 'object') return undefined;\n\n const entries = Object.entries(headers)\n .map(([key, value]) => [key.trim(), String(value).trim()] as const)\n .filter(([key, value]) => key.length > 0 && value.length > 0);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\n// ============================================\n// SSEConnectionManager Class\n// ============================================\n\n/**\n * Manages a single SSE connection and handles MCP operations.\n * Each instance corresponds to one connected browser client.\n */\nexport class SSEConnectionManager {\n private readonly userId: string;\n private readonly clients = new Map<string, MCPClient>();\n private heartbeatTimer?: NodeJS.Timeout;\n private isActive = true;\n\n constructor(\n private readonly options: SSEHandlerOptions,\n private readonly sendEvent: (event: McpConnectionEvent | McpObservabilityEvent | McpRpcResponse) => void\n ) {\n this.userId = options.userId;\n this.startHeartbeat();\n }\n\n /**\n * Get resolved client metadata (dynamic > static > defaults)\n */\n private async getResolvedClientMetadata(request?: any): Promise<ClientMetadata> {\n // Priority: getClientMetadata() > clientDefaults > empty object\n let metadata: ClientMetadata = {};\n\n // Start with static defaults\n if (this.options.clientDefaults) {\n metadata = { ...this.options.clientDefaults };\n }\n\n // Override with dynamic metadata if provided\n if (this.options.getClientMetadata) {\n const dynamicMetadata = await this.options.getClientMetadata(request);\n metadata = { ...metadata, ...dynamicMetadata };\n }\n\n return metadata;\n }\n\n /**\n * Start heartbeat to keep connection alive\n */\n private startHeartbeat(): void {\n const interval = this.options.heartbeatInterval ?? DEFAULT_HEARTBEAT_INTERVAL;\n this.heartbeatTimer = setInterval(() => {\n if (this.isActive) {\n this.sendEvent({\n level: 'debug',\n message: 'heartbeat',\n timestamp: Date.now(),\n } as McpObservabilityEvent);\n }\n }, interval);\n }\n\n /**\n * Handle incoming RPC requests\n * Returns the RPC response directly for immediate HTTP response (bypassing SSE latency)\n */\n async handleRequest(request: McpRpcRequest): Promise<McpRpcResponse> {\n try {\n let result: SessionListResult | ConnectResult | DisconnectResult | GetSessionResult | FinishAuthResult | ListToolsRpcResult | ListPromptsResult | ListResourcesResult | unknown;\n\n switch (request.method) {\n case 'listSessions':\n result = await this.listSessions();\n break;\n\n case 'connect':\n result = await this.connect(request.params as ConnectParams);\n break;\n\n case 'disconnect':\n result = await this.disconnect(request.params as DisconnectParams);\n break;\n\n case 'listTools':\n result = await this.listTools(request.params as SessionParams);\n break;\n\n case 'callTool':\n result = await this.callTool(request.params as CallToolParams);\n break;\n\n case 'getSession':\n result = await this.getSession(request.params as SessionParams);\n break;\n\n case 'finishAuth':\n result = await this.finishAuth(request.params as FinishAuthParams);\n break;\n\n case 'listPrompts':\n result = await this.listPrompts(request.params as SessionParams);\n break;\n\n case 'getPrompt':\n result = await this.getPrompt(request.params as GetPromptParams);\n break;\n\n case 'listResources':\n result = await this.listResources(request.params as SessionParams);\n break;\n\n case 'readResource':\n result = await this.readResource(request.params as ReadResourceParams);\n break;\n\n default:\n throw new Error(`Unknown method: ${request.method}`);\n }\n\n const response: McpRpcResponse = {\n id: request.id,\n result,\n };\n\n // Also send via SSE for backwards compatibility\n this.sendEvent(response);\n\n return response;\n } catch (error) {\n const errorResponse: McpRpcResponse = {\n id: request.id,\n error: {\n code: RpcErrorCodes.EXECUTION_ERROR,\n message: error instanceof Error ? error.message : 'Unknown error',\n },\n };\n\n // Also send via SSE for backwards compatibility\n this.sendEvent(errorResponse);\n\n return errorResponse;\n }\n }\n\n /**\n * Get all sessions for the current userId\n */\n private async listSessions(): Promise<SessionListResult> {\n const sessionList = await sessions.list(this.userId);\n\n return {\n sessions: sessionList.map((s) => ({\n sessionId: s.sessionId,\n serverId: s.serverId,\n serverName: s.serverName,\n serverUrl: s.serverUrl,\n transport: s.transportType,\n createdAt: s.createdAt,\n updatedAt: s.updatedAt ?? s.createdAt,\n status: s.status ?? 'pending',\n })),\n };\n }\n\n /**\n * Connect to an MCP server\n */\n private async connect(params: ConnectParams): Promise<ConnectResult> {\n const { serverName, serverUrl, callbackUrl, transportType } = params;\n const headers = normalizeHeaders(params.headers);\n\n // Normalize serverId to max 12 chars to keep tool names under 64 chars (DeepSeek/OpenAI limits)\n // Tool name format: tool_<serverId>_<toolName> - with 12 char serverId leaves 46 chars for tool name\n const serverId = params.serverId && params.serverId.length <= 12\n ? params.serverId\n : await sessions.generateSessionId();\n\n // Check for existing connections\n const existingSessions = await sessions.list(this.userId);\n const duplicate = existingSessions.find(s =>\n s.serverId === serverId || s.serverUrl === serverUrl\n );\n\n if (duplicate) {\n // If the existing session is still pending OAuth, treat connect as \"resume auth\"\n // instead of failing with duplicate connection error.\n if (duplicate.status === 'pending') {\n await this.getSession({ sessionId: duplicate.sessionId });\n return {\n sessionId: duplicate.sessionId,\n success: true,\n };\n }\n throw new Error(`Connection already exists for server: ${duplicate.serverUrl || duplicate.serverId} (${duplicate.serverName})`);\n }\n\n // Generate session ID\n const sessionId = await sessions.generateSessionId();\n\n try {\n // Get resolved client metadata\n const clientMetadata = await this.getResolvedClientMetadata();\n\n // Create MCP client\n const client = new MCPClient({\n userId: this.userId,\n sessionId,\n serverId,\n serverName,\n serverUrl,\n callbackUrl,\n transportType,\n headers,\n ...clientMetadata, // Spread client metadata (clientName, clientUri, logoUri, policyUri)\n });\n\n // Note: Session will be created by MCPClient after successful connection\n // This ensures sessions only exist for successful or OAuth-pending connections\n\n // Store client\n this.clients.set(sessionId, client);\n\n // Subscribe to client events\n client.onConnectionEvent((event) => {\n this.emitConnectionEvent(event);\n });\n\n client.onObservabilityEvent((event) => {\n this.sendEvent(event);\n });\n\n // Attempt connection\n await client.connect();\n\n // Fetch tools\n await client.listTools();\n\n return {\n sessionId,\n success: true,\n };\n } catch (error) {\n if (error instanceof UnauthorizedError) {\n // OAuth-required is a pending-auth state, not a failed connection.\n this.clients.delete(sessionId);\n return {\n sessionId,\n success: true,\n };\n }\n\n this.emitConnectionEvent({\n type: 'error',\n sessionId,\n serverId,\n error: error instanceof Error ? error.message : 'Connection failed',\n errorType: 'connection',\n timestamp: Date.now(),\n });\n\n // Clean up client\n this.clients.delete(sessionId);\n\n throw error;\n }\n }\n\n /**\n * Disconnect from an MCP server\n */\n private async disconnect(params: DisconnectParams): Promise<DisconnectResult> {\n const { sessionId } = params;\n const client = this.clients.get(sessionId);\n\n if (client) {\n // clearSession() handles DELETE + local cleanup internally.\n await client.clearSession();\n this.clients.delete(sessionId);\n } else {\n // Handle orphaned sessions (e.g., OAuth flow failed before client was stored)\n // Directly remove from storage since there's no active client\n await sessions.delete(this.userId, sessionId);\n }\n\n return { success: true };\n }\n\n /**\n * Get an existing client or create and connect a new one for the session.\n */\n private async getOrCreateClient(sessionId: string): Promise<MCPClient> {\n const existing = this.clients.get(sessionId);\n if (existing) {\n return existing;\n }\n\n const session = await sessions.get(this.userId, sessionId);\n if (!session) {\n throw new Error('Session not found');\n }\n\n const client = new MCPClient({\n userId: this.userId,\n sessionId,\n // These fields are optional in MCPClient, but when rehydrating a known\n // stored session on the server we pass them explicitly to preserve the\n // original transport/connection metadata instead of relying on lazy\n // reloading during initialize().\n serverId: session.serverId,\n serverName: session.serverName,\n serverUrl: session.serverUrl,\n callbackUrl: session.callbackUrl,\n transportType: session.transportType,\n headers: session.headers,\n });\n\n // Subscribe to events before connecting\n client.onConnectionEvent((event) => this.emitConnectionEvent(event));\n client.onObservabilityEvent((event) => this.sendEvent(event));\n\n await client.connect();\n this.clients.set(sessionId, client);\n\n return client;\n }\n\n /**\n * List tools from a session\n */\n private async listTools(params: SessionParams): Promise<ListToolsRpcResult> {\n const { sessionId } = params;\n const client = await this.getOrCreateClient(sessionId);\n const result = await client.listTools();\n return { tools: result.tools };\n }\n\n /**\n * Call a tool on the MCP server\n */\n private async callTool(params: CallToolParams): Promise<CallToolResult> {\n const { sessionId, toolName, toolArgs } = params;\n const client = await this.getOrCreateClient(sessionId);\n const result = await client.callTool(toolName, toolArgs);\n\n // Inject sessionId into meta so client knows who handled it\n // This allows AppHost to auto-launch without scanning all sessions\n const meta = result._meta || {};\n\n return {\n ...result,\n _meta: {\n ...meta,\n sessionId,\n }\n };\n }\n\n /**\n * Restore and validate an existing session\n */\n private async getSession(params: SessionParams): Promise<GetSessionResult> {\n const { sessionId } = params;\n\n const session = await sessions.get(this.userId, sessionId);\n if (!session) {\n throw new Error('Session not found');\n }\n\n this.emitConnectionEvent({\n type: 'state_changed',\n sessionId,\n serverId: session.serverId ?? 'unknown',\n serverName: session.serverName ?? 'Unknown',\n serverUrl: session.serverUrl,\n state: 'VALIDATING',\n previousState: 'DISCONNECTED',\n timestamp: Date.now(),\n });\n\n try {\n const clientMetadata = await this.getResolvedClientMetadata();\n\n const client = new MCPClient({\n userId: this.userId,\n sessionId,\n // These fields are optional in MCPClient, but when rehydrating a known\n // stored session on the server we pass them explicitly to preserve the\n // original transport/connection metadata instead of relying on lazy\n // reloading during initialize().\n serverId: session.serverId,\n serverName: session.serverName,\n serverUrl: session.serverUrl,\n callbackUrl: session.callbackUrl,\n transportType: session.transportType,\n headers: session.headers,\n ...clientMetadata,\n });\n\n client.onConnectionEvent((event) => this.emitConnectionEvent(event));\n client.onObservabilityEvent((event) => this.sendEvent(event));\n\n await client.connect();\n this.clients.set(sessionId, client);\n\n const tools = await client.listTools();\n\n return { success: true, toolCount: tools.tools.length };\n } catch (error) {\n this.emitConnectionEvent({\n type: 'error',\n sessionId,\n serverId: session.serverId ?? 'unknown',\n error: error instanceof Error ? error.message : 'Validation failed',\n errorType: 'validation',\n timestamp: Date.now(),\n });\n\n throw error;\n }\n }\n\n /**\n * Complete OAuth authorization flow\n */\n private async finishAuth(params: FinishAuthParams): Promise<FinishAuthResult> {\n const { code } = params;\n const oauthState = params.state;\n const parsedState = parseOAuthState(oauthState);\n const sessionId = parsedState?.sessionId || oauthState;\n\n const session = await sessions.get(this.userId, sessionId);\n if (!session) {\n throw new Error('Session not found');\n }\n\n try {\n const client = new MCPClient({\n userId: this.userId,\n sessionId,\n // These fields are optional in MCPClient, but when rehydrating a known\n // stored session on the server we pass them explicitly to preserve the\n // original connection metadata instead of relying on lazy\n // reloading during initialize().\n serverId: session.serverId,\n serverName: session.serverName,\n serverUrl: session.serverUrl,\n callbackUrl: session.callbackUrl,\n // NOTE: transportType is intentionally omitted here.\n // The session's stored transportType is a placeholder ('streamable-http')\n // set before transport negotiation. Omitting it lets MCPClient auto-negotiate\n // (try streamable_http → SSE fallback), which is critical for servers like\n // Neon that only support SSE transport.\n headers: session.headers,\n });\n\n client.onConnectionEvent((event) => this.emitConnectionEvent(event));\n\n await client.finishAuth(code, oauthState);\n this.clients.set(sessionId, client);\n\n const tools = await client.listTools();\n\n return { success: true, toolCount: tools.tools.length };\n } catch (error) {\n this.emitConnectionEvent({\n type: 'error',\n sessionId,\n serverId: session.serverId ?? 'unknown',\n error: error instanceof Error ? error.message : 'OAuth completion failed',\n errorType: 'auth',\n timestamp: Date.now(),\n });\n\n throw error;\n }\n }\n\n /**\n * List prompts from a session\n */\n private async listPrompts(params: SessionParams): Promise<ListPromptsResult> {\n const { sessionId } = params;\n const client = await this.getOrCreateClient(sessionId);\n const result = await client.listPrompts();\n return { prompts: result.prompts };\n }\n\n /**\n * Get a specific prompt\n */\n private async getPrompt(params: GetPromptParams): Promise<unknown> {\n const { sessionId, name, args } = params;\n const client = await this.getOrCreateClient(sessionId);\n return await client.getPrompt(name, args);\n }\n\n /**\n * List resources from a session\n */\n private async listResources(params: SessionParams): Promise<ListResourcesResult> {\n const { sessionId } = params;\n const client = await this.getOrCreateClient(sessionId);\n const result = await client.listResources();\n return { resources: result.resources };\n }\n\n /**\n * Read a specific resource\n */\n private async readResource(params: ReadResourceParams): Promise<unknown> {\n const { sessionId, uri } = params;\n const client = await this.getOrCreateClient(sessionId);\n return client.readResource(uri);\n }\n\n /**\n * Emit connection event\n */\n private emitConnectionEvent(event: McpConnectionEvent): void {\n this.sendEvent(event);\n }\n\n /**\n * Cleanup and close all connections\n */\n async dispose(): Promise<void> {\n this.isActive = false;\n\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n }\n\n // Send HTTP DELETE to each Streamable HTTP server before closing, per spec.\n // Run in parallel so shutdown is not serialised across many sessions.\n await Promise.all(\n Array.from(this.clients.values()).map((client) => client.disconnect())\n );\n\n this.clients.clear();\n }\n}\n\n// ============================================\n// SSE Handler Factory\n// ============================================\n\n/**\n * Create an SSE endpoint handler compatible with Node.js HTTP frameworks.\n * Handles both SSE streaming (GET) and RPC requests (POST).\n */\nexport function createSSEHandler(options: SSEHandlerOptions) {\n return async (req: { method?: string; on: Function }, res: { writeHead: Function; write: Function }) => {\n // Set SSE headers\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'Access-Control-Allow-Origin': '*',\n });\n\n // Send initial connection acknowledgment\n writeSSEEvent(res, 'connected', { timestamp: Date.now() });\n\n // Create connection manager with event routing\n const manager = new SSEConnectionManager(options, (event) => {\n if (isRpcResponseEvent(event)) {\n writeSSEEvent(res, 'rpc-response', event);\n } else if (isConnectionEvent(event)) {\n writeSSEEvent(res, 'connection', event);\n } else {\n writeSSEEvent(res, 'observability', event);\n }\n });\n\n // Cleanup on client disconnect\n req.on('close', () => manager.dispose());\n\n // Handle RPC requests via POST\n if (req.method === 'POST') {\n let body = '';\n req.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n });\n req.on('end', async () => {\n try {\n const request: McpRpcRequest = JSON.parse(body);\n await manager.handleRequest(request);\n } catch {\n // Request parsing/handling errors are sent via SSE error events\n }\n });\n }\n };\n}\n\n// ============================================\n// Utilities\n// ============================================\n\n/**\n * Write an SSE event to the response stream\n */\nfunction writeSSEEvent(res: { write: Function }, event: string, data: unknown): void {\n res.write(`event: ${event}\\n`);\n res.write(`data: ${JSON.stringify(data)}\\n\\n`);\n}\n","import type { McpConnectionEvent, McpObservabilityEvent } from './events.js';\nimport type { McpRpcResponse } from './types.js';\n\nexport function isRpcResponseEvent(\n event: McpConnectionEvent | McpObservabilityEvent | McpRpcResponse\n): event is McpRpcResponse {\n return 'id' in event && ('result' in event || 'error' in event);\n}\n\nexport function isConnectionEvent(\n event: McpConnectionEvent | McpObservabilityEvent | McpRpcResponse\n): event is McpConnectionEvent {\n if (!('type' in event)) {\n return false;\n }\n\n switch (event.type) {\n case 'state_changed':\n case 'tools_discovered':\n case 'auth_required':\n case 'error':\n case 'disconnected':\n case 'progress':\n return true;\n default:\n return false;\n }\n}\n","/**\n * Next.js App Router Handler for MCP\n * Stateless transport for serverless environments:\n * - POST + `Accept: text/event-stream` streams progress + rpc-response\n * - POST + JSON accepts direct RPC result response\n */\n\nimport { SSEConnectionManager, type ClientMetadata } from './sse-handler.js';\nimport type { McpConnectionEvent, McpObservabilityEvent } from '../../shared/events.js';\nimport { isConnectionEvent, isRpcResponseEvent } from '../../shared/event-routing.js';\nimport type { McpRpcResponse } from '../../shared/types.js';\n\nexport interface NextMcpHandlerOptions {\n /**\n * Extract userId from request (default: from 'userId' query param)\n */\n getUserId?: (request: Request) => string | null;\n\n /**\n * Extract auth token from request (default: from 'token' query param or Authorization header)\n */\n getAuthToken?: (request: Request) => string | null;\n\n /**\n * Authenticate user and verify access (optional)\n * Return true if user is authenticated, false otherwise\n */\n authenticate?: (userId: string, token: string | null) => Promise<boolean> | boolean;\n\n /**\n * Heartbeat interval in milliseconds (default: 30000)\n */\n heartbeatInterval?: number;\n\n /**\n * Static OAuth client metadata defaults (for all connections)\n */\n clientDefaults?: ClientMetadata;\n\n /**\n * Dynamic OAuth client metadata getter (per-request)\n */\n getClientMetadata?: (request: Request) => ClientMetadata | Promise<ClientMetadata>;\n}\n\nexport function createNextMcpHandler(options: NextMcpHandlerOptions = {}) {\n const {\n getUserId = (request: Request) => request.headers.get('x-mcp-user-id'),\n getAuthToken = (request: Request) => {\n const authHeader = request.headers.get('authorization');\n if (authHeader?.toLowerCase().startsWith('bearer ')) {\n return authHeader.slice(7);\n }\n return authHeader;\n },\n authenticate = () => true,\n heartbeatInterval = 30000,\n clientDefaults,\n getClientMetadata,\n } = options;\n\n const toManagerOptions = (userId: string, resolvedClientMetadata?: ClientMetadata) => ({\n userId,\n heartbeatInterval,\n clientDefaults: resolvedClientMetadata,\n });\n\n async function resolveClientMetadata(request: Request): Promise<ClientMetadata | undefined> {\n return getClientMetadata ? await getClientMetadata(request) : clientDefaults;\n }\n\n async function GET(): Promise<Response> {\n return Response.json(\n {\n error: {\n code: 'METHOD_NOT_ALLOWED',\n message: 'Use POST /api/mcp. For streaming use Accept: text/event-stream.',\n },\n },\n { status: 405 }\n );\n }\n\n async function POST(request: Request): Promise<Response> {\n const userId = getUserId(request);\n const authToken = getAuthToken(request);\n const acceptsEventStream = (request.headers.get('accept') || '').toLowerCase().includes('text/event-stream');\n\n if (!userId) {\n return Response.json({ error: { code: 'MISSING_userId', message: 'Missing userId' } }, { status: 400 });\n }\n\n const isAuthorized = await authenticate(userId, authToken);\n if (!isAuthorized) {\n return Response.json({ error: { code: 'UNAUTHORIZED', message: 'Unauthorized' } }, { status: 401 });\n }\n\n let rawBody = '';\n try {\n rawBody = await request.text();\n const body = rawBody ? JSON.parse(rawBody) : null;\n\n if (!body || typeof body !== 'object') {\n return Response.json(\n {\n error: {\n code: 'INVALID_REQUEST',\n message: 'Invalid JSON-RPC request body',\n },\n },\n { status: 400 }\n );\n }\n\n const resolvedClientMetadata = await resolveClientMetadata(request);\n\n if (!acceptsEventStream) {\n const manager = new SSEConnectionManager(\n toManagerOptions(userId, resolvedClientMetadata),\n () => { }\n );\n try {\n const response = await manager.handleRequest(body as any);\n return Response.json(response);\n } finally {\n manager.dispose();\n }\n }\n\n const stream = new TransformStream();\n const writer = stream.writable.getWriter();\n const encoder = new TextEncoder();\n let streamWritable = true;\n\n const sendSSE = (event: string, data: unknown) => {\n if (!streamWritable) return;\n const message = `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n writer.write(encoder.encode(message)).catch(() => {\n streamWritable = false;\n });\n };\n\n const manager = new SSEConnectionManager(\n toManagerOptions(userId, resolvedClientMetadata),\n (event: McpConnectionEvent | McpObservabilityEvent | McpRpcResponse) => {\n if (isRpcResponseEvent(event)) {\n sendSSE('rpc-response', event);\n } else if (isConnectionEvent(event)) {\n sendSSE('connection', event);\n } else {\n sendSSE('observability', event);\n }\n }\n );\n\n sendSSE('connected', { timestamp: Date.now() });\n\n void (async () => {\n try {\n await manager.handleRequest(body as any);\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Unknown error');\n sendSSE('rpc-response', {\n id: (body as any).id || 'unknown',\n error: {\n code: 'EXECUTION_ERROR',\n message: err.message,\n },\n } satisfies McpRpcResponse);\n } finally {\n streamWritable = false;\n manager.dispose();\n writer.close().catch(() => { });\n }\n })();\n\n return new Response(stream.readable, {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n 'Connection': 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Unknown error');\n console.error('[MCP Next Handler] Failed to handle RPC', {\n userId,\n message: err.message,\n stack: err.stack,\n rawBody: rawBody.slice(0, 500),\n });\n return Response.json(\n {\n error: {\n code: 'EXECUTION_ERROR',\n message: err.message,\n },\n },\n { status: 500 }\n );\n }\n }\n\n return { GET, POST };\n}\n","/**\n * MCP Redis Client Package\n * Browser/React client-side exports for MCP connection management\n */\n\n/** SSE client for real-time connections */\nexport { SSEClient, type SSEClientOptions } from './core/sse-client';\nexport { AppHost, DEFAULT_MCP_APP_CSP } from './core/app-host';\nexport {\n APP_HOST_DEFAULTS,\n SANDBOX_PROXY_READY_METHOD,\n SANDBOX_RESOURCE_READY_METHOD,\n} from './core/constants.js';\n\n\n\n/** Re-export shared types */\nexport type {\n McpConnectionEvent,\n McpConnectionState,\n McpObservabilityEvent,\n Emitter,\n Disposable,\n Event,\n DisposableStore,\n} from '../shared/events';\n\nexport type {\n ToolInfo,\n McpRpcRequest,\n McpRpcResponse,\n} from '../shared/types';\n","/**\n * Stateless RPC-over-stream client for MCP connections.\n *\n * Uses single POST requests with `Accept: text/event-stream` for every RPC call.\n * Progress events and the final rpc-response are delivered in the same response.\n */\n\nimport { nanoid } from 'nanoid';\nimport type {\n McpConnectionEvent,\n McpObservabilityEvent,\n McpAppsUIEvent\n} from '../../shared/events.js';\nimport type {\n McpRpcRequest,\n McpRpcResponse,\n McpRpcMethod,\n McpRpcParams,\n ConnectParams,\n SessionListResult,\n ConnectResult,\n DisconnectResult,\n GetSessionResult,\n FinishAuthResult,\n ListToolsRpcResult,\n ListPromptsResult,\n ListResourcesResult,\n} from '../../shared/types.js';\n\nexport interface SSEClientOptions {\n /** MCP endpoint URL */\n url: string;\n\n /** User/Client identifier */\n userId: string;\n\n /** Optional auth token for authenticated requests */\n authToken?: string;\n\n /** Callback for MCP connection state changes */\n onConnectionEvent?: (event: McpConnectionEvent) => void;\n\n /** Callback for observability/logging events */\n onObservabilityEvent?: (event: McpObservabilityEvent) => void;\n\n /** Callback for connection status changes */\n onStatusChange?: (status: ConnectionStatus) => void;\n\n /** Callback for MCP App UI events */\n onEvent?: (event: McpAppsUIEvent) => void;\n\n /** Enable debug logging @default false */\n debug?: boolean;\n}\n\nexport type ConnectionStatus = 'connecting' | 'connected' | 'disconnected' | 'error';\n\nconst CONNECTION_EVENT_INTERVAL_MS = 300;\n\ninterface ToolUiMetadata {\n resourceUri?: string;\n uri?: string;\n visibility?: string[];\n}\n\nexport class SSEClient {\n private resourceCache = new Map<string, Promise<unknown>>();\n private connected = false;\n\n constructor(private readonly options: SSEClientOptions) {}\n\n connect(): void {\n if (this.connected) {\n return;\n }\n this.connected = true;\n this.options.onStatusChange?.('connected');\n this.log('RPC mode: post_stream');\n }\n\n disconnect(): void {\n this.connected = false;\n this.options.onStatusChange?.('disconnected');\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n async listSessions(): Promise<SessionListResult> {\n return this.sendRequest<SessionListResult>('listSessions');\n }\n\n async connectToServer(params: ConnectParams): Promise<ConnectResult> {\n return this.sendRequest<ConnectResult>('connect', params);\n }\n\n async disconnectFromServer(sessionId: string): Promise<DisconnectResult> {\n return this.sendRequest<DisconnectResult>('disconnect', { sessionId });\n }\n\n async listTools(sessionId: string): Promise<ListToolsRpcResult> {\n return this.sendRequest<ListToolsRpcResult>('listTools', { sessionId });\n }\n\n async callTool(\n sessionId: string,\n toolName: string,\n toolArgs: Record<string, unknown>\n ): Promise<unknown> {\n const result = await this.sendRequest('callTool', { sessionId, toolName, toolArgs });\n this.emitUiEventIfPresent(result, sessionId, toolName);\n return result;\n }\n\n async getSession(sessionId: string): Promise<GetSessionResult> {\n return this.sendRequest<GetSessionResult>('getSession', { sessionId });\n }\n\n async finishAuth(state: string, code: string): Promise<FinishAuthResult> {\n return this.sendRequest<FinishAuthResult>('finishAuth', { state, code });\n }\n\n async listPrompts(sessionId: string): Promise<ListPromptsResult> {\n return this.sendRequest<ListPromptsResult>('listPrompts', { sessionId });\n }\n\n async getPrompt(sessionId: string, name: string, args?: Record<string, string>): Promise<unknown> {\n return this.sendRequest('getPrompt', { sessionId, name, args });\n }\n\n async listResources(sessionId: string): Promise<ListResourcesResult> {\n return this.sendRequest<ListResourcesResult>('listResources', { sessionId });\n }\n\n async readResource(sessionId: string, uri: string): Promise<unknown> {\n return this.sendRequest('readResource', { sessionId, uri });\n }\n\n preloadToolUiResources(sessionId: string, tools: Array<{ name: string; _meta?: unknown }>): void {\n for (const tool of tools) {\n const uri = this.extractUiResourceUri(tool);\n if (!uri || this.resourceCache.has(uri)) continue;\n const promise = this.sendRequest('readResource', { sessionId, uri }).catch((err) => {\n this.log(`Failed to preload resource ${uri}: ${err.message}`, 'warn');\n this.resourceCache.delete(uri);\n return null;\n });\n this.resourceCache.set(uri, promise);\n }\n }\n\n getOrFetchResource(sessionId: string, uri: string): Promise<unknown> {\n const cached = this.resourceCache.get(uri);\n if (cached) return cached;\n const promise = this.sendRequest('readResource', { sessionId, uri });\n this.resourceCache.set(uri, promise);\n return promise;\n }\n\n hasPreloadedResource(uri: string): boolean {\n return this.resourceCache.has(uri);\n }\n\n clearResourceCache(): void {\n this.resourceCache.clear();\n }\n\n private async sendRequest<T = unknown>(method: McpRpcMethod, params?: McpRpcParams): Promise<T> {\n if (!this.connected) {\n this.connect();\n }\n\n this.log(`RPC request via post_stream: ${method}`);\n\n const request: McpRpcRequest = {\n id: `rpc_${nanoid(10)}`,\n method,\n params,\n };\n\n const response = await fetch(this.buildUrl(), {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const contentType = (response.headers.get('content-type') || '').toLowerCase();\n if (!contentType.includes('text/event-stream')) {\n const data = await response.json() as McpRpcResponse;\n return this.parseRpcResponse<T>(data);\n }\n\n const data = await this.readRpcResponseFromStream(response, {\n delayConnectionEvents:\n method === 'connect' ||\n method === 'getSession' ||\n method === 'finishAuth',\n });\n return this.parseRpcResponse<T>(data);\n }\n\n private async readRpcResponseFromStream(\n response: Response,\n options: { delayConnectionEvents?: boolean } = {}\n ): Promise<McpRpcResponse> {\n if (!response.body) {\n throw new Error('Streaming response body is missing');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let rpcResponse: McpRpcResponse | null = null;\n\n const dispatchBlock = async (block: string) => {\n const lines = block.split('\\n');\n let eventName = 'message';\n const dataLines: string[] = [];\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\r$/, '');\n if (!line || line.startsWith(':')) continue;\n if (line.startsWith('event:')) {\n eventName = line.slice('event:'.length).trim();\n continue;\n }\n if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n\n if (!dataLines.length) return;\n const payloadText = dataLines.join('\\n');\n let payload: unknown = payloadText;\n try {\n payload = JSON.parse(payloadText);\n } catch {\n // Keep raw text\n }\n\n switch (eventName) {\n case 'connected':\n this.options.onStatusChange?.('connected');\n break;\n case 'connection':\n this.options.onConnectionEvent?.(payload as McpConnectionEvent);\n if (options.delayConnectionEvents) {\n await this.sleep(CONNECTION_EVENT_INTERVAL_MS);\n }\n break;\n case 'observability':\n this.options.onObservabilityEvent?.(payload as McpObservabilityEvent);\n break;\n case 'rpc-response':\n rpcResponse = payload as McpRpcResponse;\n break;\n default:\n break;\n }\n };\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let separatorMatch = buffer.match(/\\r?\\n\\r?\\n/);\n while (separatorMatch && separatorMatch.index !== undefined) {\n const separatorIndex = separatorMatch.index;\n const separatorLength = separatorMatch[0].length;\n const block = buffer.slice(0, separatorIndex);\n buffer = buffer.slice(separatorIndex + separatorLength);\n await dispatchBlock(block);\n separatorMatch = buffer.match(/\\r?\\n\\r?\\n/);\n }\n }\n\n if (buffer.trim()) {\n await dispatchBlock(buffer);\n }\n\n if (!rpcResponse) {\n throw new Error('Missing rpc-response event in streamed RPC result');\n }\n\n return rpcResponse;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private parseRpcResponse<T>(data: McpRpcResponse): T {\n if ('result' in data) {\n return data.result as T;\n }\n if ('error' in data && data.error) {\n throw new Error(data.error.message || 'Unknown RPC error');\n }\n // JSON omits `result` when it is `undefined` (response becomes `{ id: ... }`).\n // Treat that shape as a successful void result.\n if (data && typeof data === 'object' && 'id' in data) {\n return undefined as T;\n }\n throw new Error('Invalid RPC response format');\n }\n\n private buildUrl(): string {\n return new URL(this.options.url, globalThis.location?.origin).toString();\n }\n\n private buildHeaders(): HeadersInit {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n 'x-mcp-user-id': this.options.userId,\n };\n\n if (this.options.authToken) {\n headers['Authorization'] = `Bearer ${this.options.authToken}`;\n }\n \n return headers;\n }\n\n private extractUiResourceUri(tool: { name: string; _meta?: unknown }): string | undefined {\n const meta = (tool._meta as { ui?: ToolUiMetadata })?.ui;\n if (!meta || typeof meta !== 'object') return undefined;\n if (meta.visibility && !meta.visibility.includes('app')) return undefined;\n return meta.resourceUri ?? meta.uri;\n }\n\n private emitUiEventIfPresent(result: unknown, sessionId: string, toolName: string): void {\n const meta = (result as { _meta?: { ui?: ToolUiMetadata } })?._meta;\n const resourceUri = meta?.ui?.resourceUri ?? (meta as any)?.['ui/resourceUri'];\n\n if (resourceUri) {\n this.options.onEvent?.({\n type: 'mcp-apps-ui',\n sessionId,\n resourceUri,\n toolName,\n result,\n timestamp: Date.now(),\n });\n }\n }\n\n private log(message: string, level: 'info' | 'warn' | 'error' = 'info'): void {\n if (!this.options.debug && level === 'info') return;\n\n const prefix = '[SSEClient]';\n switch (level) {\n case 'warn':\n console.warn(prefix, message);\n break;\n case 'error':\n console.error(prefix, message);\n break;\n default:\n console.log(prefix, message);\n }\n }\n}\n","/**\n * MCP App Host\n *\n * Bridges the gap between an iframe (MCP App) and the SSEClient (MCP Server).\n * Handles secure iframe sandboxing, resource loading, and bi-directional\n * communication via the AppBridge protocol.\n *\n * Key features:\n * - Secure iframe sandboxing with minimal permissions (proxy-based)\n * - Resource preloading for instant MCP App UI loading\n * - Cache-aware resource fetching (SSEClient cache → local cache → direct fetch)\n * - Support for ui:// and mcp-app:// resource URIs\n */\n\nimport { \n AppBridge, \n PostMessageTransport\n} from '@modelcontextprotocol/ext-apps/app-bridge';\nimport type { LoggingMessageNotification } from '@modelcontextprotocol/sdk/types.js';\nimport type { AppHostClient } from './types';\nimport { setupSandboxProxyIframe } from '../utils/app-host-utils.js';\nimport { APP_HOST_DEFAULTS } from './constants.js';\n\nexport type McpUiResourceCsp = Record<string, string>;\nexport type McpUiHostContext = Record<string, unknown>;\n\n// Define types dynamically from AppBridge properties instead of direct imports\n// which seem to fail in this tsconfig environment\ntype OnMessageHandler = NonNullable<AppBridge['onmessage']>;\nexport type McpUiMessageParams = Parameters<OnMessageHandler>[0];\nexport type RequestHandlerExtra = Parameters<OnMessageHandler>[1];\nexport type McpUiMessageResult = ReturnType<OnMessageHandler> extends Promise<infer R> ? R : never;\n\ntype OnOpenLinkHandler = NonNullable<AppBridge['onopenlink']>;\nexport type McpUiOpenLinkParams = Parameters<OnOpenLinkHandler>[0];\nexport type McpUiOpenLinkResult = ReturnType<OnOpenLinkHandler> extends Promise<infer R> ? R : never;\n\ntype OnSizeChangeHandler = NonNullable<AppBridge['onsizechange']>;\nexport type McpUiSizeChangedParams = Parameters<OnSizeChangeHandler>[0];\n\ntype OnRequestDisplayModeHandler = NonNullable<AppBridge['onrequestdisplaymode']>;\nexport type McpUiRequestDisplayModeParams = Parameters<OnRequestDisplayModeHandler>[0];\nexport type McpUiRequestDisplayModeResult = ReturnType<OnRequestDisplayModeHandler> extends Promise<infer R> ? R : never;\n\n\n// ============================================\n// Types & Interfaces\n// ============================================\n\nexport interface SandboxConfig {\n url: URL | string;\n permissions?: string;\n csp?: McpUiResourceCsp;\n}\n\n/**\n * Default Content-Security-Policy for MCP App iframes.\n *\n * Allows inline scripts/styles (required by most MCP App frameworks),\n * outbound network connections, and common asset sources, while blocking\n * nested frames and plugin objects.\n *\n * Pass this (or a spread of it) as `sandbox.csp` to enforce it:\n * @example\n * sandbox={{ url: '/sandbox.html', csp: DEFAULT_MCP_APP_CSP }}\n * // or to extend:\n * sandbox={{ url: '/sandbox.html', csp: { ...DEFAULT_MCP_APP_CSP, 'connect-src': \"'self' https://api.example.com\" } }}\n */\nexport const DEFAULT_MCP_APP_CSP: McpUiResourceCsp = {\n 'default-src': \"'self'\",\n 'script-src': \"'self' 'unsafe-inline' 'unsafe-eval' https: blob:\",\n 'style-src': \"'self' 'unsafe-inline' https:\",\n 'connect-src': \"'self' https: wss:\",\n 'img-src': \"'self' data: https: blob:\",\n 'font-src': \"'self' data: https:\",\n 'media-src': \"'self' https: blob:\",\n 'frame-src': \"'none'\",\n 'object-src': \"'none'\",\n 'base-uri': \"'self'\",\n};\n\nexport interface AppHostOptions {\n /** Enable debug logging @default false */\n debug?: boolean;\n /** Sandbox proxy configuration */\n sandbox?: SandboxConfig;\n /** Host context for theming, viewport, locale */\n hostContext?: McpUiHostContext;\n /** Custom handler for call tool requests, overriding automatic client forwarding */\n onCallTool?: (params: ToolCallParams) => Promise<unknown>;\n /** Custom handler for resources/read */\n onReadResource?: (uri: string) => Promise<ResourceResponse>;\n /** Custom handler for fallback JSON-RPC requests */\n onFallbackRequest?: (request: any) => Promise<any>;\n \n /** Handler for open-link requests from the guest UI */\n onOpenLink?: (\n params: McpUiOpenLinkParams,\n extra: RequestHandlerExtra,\n ) => Promise<McpUiOpenLinkResult>;\n\n /** Handler for message requests from the guest UI */\n onMessage?: (\n params: McpUiMessageParams,\n extra: RequestHandlerExtra,\n ) => Promise<McpUiMessageResult>;\n\n /** Handler for logging messages from the guest UI */\n onLoggingMessage?: (params: LoggingMessageNotification['params']) => void;\n\n /** Handler for size change notifications from the guest UI */\n onSizeChanged?: (params: McpUiSizeChangedParams) => void;\n\n /** Callback invoked when an error occurs during setup or message handling */\n onError?: (error: Error) => void;\n\n /** Handler for display mode change requests from the guest UI */\n onRequestDisplayMode?: (\n params: McpUiRequestDisplayModeParams,\n extra: RequestHandlerExtra,\n ) => Promise<McpUiRequestDisplayModeResult>;\n}\n\nexport interface AppMessageParams {\n role: string;\n content: unknown;\n}\n\ninterface ToolCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\ninterface ResourceContent {\n blob?: string;\n text?: string;\n}\n\ninterface ResourceResponse {\n contents: ResourceContent[];\n}\n\n// ============================================\n// Constants\n// ============================================\n\nconst HOST_INFO = APP_HOST_DEFAULTS.HOST_INFO;\n\n\n/** Supported MCP App URI schemes */\nconst MCP_URI_SCHEMES = APP_HOST_DEFAULTS.URI_SCHEMES;\n\n// ============================================\n// AppHost Class\n// ============================================\n\n/**\n * Host for MCP Apps embedded in iframes.\n * Manages secure communication between the app and the MCP server.\n */\nexport class AppHost {\n private bridge: AppBridge;\n private sessionId?: string;\n private resourceCache = new Map<string, Promise<ResourceResponse | null>>();\n private debug: boolean;\n\n private sandboxConfig?: SandboxConfig;\n private options: AppHostOptions;\n public onAppMessage?: (params: AppMessageParams) => void;\n\n constructor(\n private readonly client: AppHostClient | null,\n private readonly iframe: HTMLIFrameElement,\n options?: AppHostOptions\n ) {\n this.options = options || {};\n this.debug = this.options.debug ?? false;\n this.sandboxConfig = this.options.sandbox;\n\n this.bridge = this.initializeBridge();\n }\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Start the host. This prepares the bridge handlers but doesn't connect yet.\n * The actual connection happens in launch() after HTML is loaded.\n * @returns Promise that resolves immediately (bridge connects during launch)\n */\n async start(): Promise<void> {\n // Bridge handlers are already registered in constructor.\n // Connection happens in launch() after HTML is loaded.\n this.log('Host started, ready to launch');\n }\n\n /**\n * Preload UI resources to enable instant app loading.\n * Call this when tools are discovered to cache their UI resources.\n */\n preload(tools: Array<{ _meta?: unknown }>): void {\n for (const tool of tools) {\n const uri = this.extractUiResourceUri(tool);\n if (!uri || this.resourceCache.has(uri)) continue;\n\n const promise = this.preloadResource(uri);\n this.resourceCache.set(uri, promise);\n }\n }\n\n /**\n * Launch an MCP App from a URL, MCP resource URI, or RAW HTML.\n * Loads the HTML first, then establishes bridge connection.\n */\n async launch(source: { uri?: string; html?: string }, sessionId?: string): Promise<void> {\n if (sessionId) this.sessionId = sessionId;\n\n const initializedPromise = this.onAppReady();\n\n let htmlToRender = source.html;\n\n if (!htmlToRender && source.uri) {\n if (this.isMcpUri(source.uri)) {\n htmlToRender = await this.readMcpAppHtml(source.uri);\n }\n }\n\n if (!htmlToRender && source.uri && !this.isMcpUri(source.uri)) {\n // Fallback for regular urls without proxy\n this.iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms allow-modals allow-popups allow-downloads');\n this.iframe.src = source.uri;\n await this.onIframeReady();\n await this.connectBridge();\n } else if (htmlToRender) {\n if (!this.sandboxConfig) {\n throw new Error(\"Sandbox configuration requires a proxy URL to render HTML safely.\");\n }\n await this.launchSandboxedHtml(htmlToRender, this.sandboxConfig);\n await this.connectBridge();\n\n this.log('Sending HTML resource to sandbox proxy (MCP Apps notification)');\n await this.bridge.sendSandboxResourceReady({\n html: htmlToRender,\n csp: this.sandboxConfig.csp,\n });\n }\n\n this.log('Waiting for app initialization');\n await Promise.race([\n initializedPromise,\n new Promise<void>((resolve) => setTimeout(() => {\n this.log('Initialization timeout - continuing anyway', 'warn');\n resolve();\n }, 3000))\n ]);\n this.log('App launched and ready');\n }\n\n // Set host context manually\n setHostContext(context: McpUiHostContext): void {\n this.options.hostContext = context;\n if (this.bridge) {\n this.bridge.setHostContext(context);\n }\n }\n\n // Send streaming inputs manually\n sendToolInputPartial(params: any): void {\n if (this.bridge) {\n (this.bridge as any).sendToolInputPartial(params);\n }\n }\n\n /**\n * Wait for app to signal initialization complete\n */\n private onAppReady(): Promise<void> {\n return new Promise<void>((resolve) => {\n const originalHandler = this.bridge.oninitialized;\n this.bridge.oninitialized = (...args) => {\n this.log('App initialized');\n resolve();\n this.bridge.oninitialized = originalHandler;\n originalHandler?.(...args);\n };\n });\n }\n\n /**\n * Wait for iframe to finish loading\n */\n private onIframeReady(): Promise<void> {\n return new Promise((resolve) => {\n if (this.iframe.contentDocument?.readyState === 'complete') {\n resolve();\n return;\n }\n this.iframe.addEventListener('load', () => resolve(), { once: true });\n });\n }\n\n /**\n * Send tool input arguments to the MCP App.\n * Call this after launch() when tool input is available.\n */\n sendToolInput(args: Record<string, unknown>): void {\n this.log('Sending tool input to app');\n this.bridge.sendToolInput({ arguments: args });\n }\n\n /**\n * Send tool result to the MCP App.\n * Call this when the tool call completes.\n */\n sendToolResult(result: unknown): void {\n this.log('Sending tool result to app');\n this.bridge.sendToolResult(result as any);\n }\n\n /**\n * Send tool cancellation to the MCP App.\n * Call this when the tool call is cancelled or fails.\n */\n sendToolCancelled(reason: string): void {\n this.log('Sending tool cancellation to app');\n this.bridge.sendToolCancelled({ reason });\n }\n\n /**\n * Tell the guest UI the resource is being torn down (unload / cleanup).\n * Forwards to {@link AppBridge.teardownResource} on `@modelcontextprotocol/ext-apps/app-bridge`.\n */\n teardownResource(params: Record<string, unknown> = {}): void {\n this.log('Sending resource teardown to app');\n this.bridge.teardownResource(params as never);\n }\n\n // ============================================\n // Private: Initialization\n // ============================================\n\n\n private initializeBridge(): AppBridge {\n const bridge = new AppBridge(\n null,\n HOST_INFO,\n {\n openLinks: {},\n serverTools: {},\n logging: {},\n updateModelContext: { text: {} },\n },\n {\n hostContext: this.options.hostContext || {\n theme: 'dark',\n platform: 'web',\n containerDimensions: { maxHeight: 6000 },\n displayMode: 'inline',\n availableDisplayModes: ['inline', 'fullscreen'],\n },\n }\n );\n\n ;(bridge as any).fallbackRequestHandler = this.options.onFallbackRequest;\n \n bridge.oncalltool = (params) => this.handleToolCall(params);\n if (this.options.onReadResource) {\n bridge.onreadresource = async (params) => {\n const resp = await this.options.onReadResource!(params.uri);\n return { \n contents: resp.contents.map(c => ({\n uri: params.uri,\n text: c.text as string,\n blob: c.blob as string,\n }))\n };\n };\n }\n\n bridge.onopenlink = async (params, extra) => {\n if (this.options.onOpenLink) {\n return await this.options.onOpenLink(params, extra as any);\n }\n return this.handleOpenLink(params);\n };\n bridge.onmessage = async (params, extra) => {\n if (this.options.onMessage) {\n return await this.options.onMessage(params, extra as any);\n }\n return this.handleMessage(params as any);\n };\n bridge.onloggingmessage = (params) => {\n this.log(`App log [${params.level}]: ${params.data}`);\n if (this.options.onLoggingMessage) {\n this.options.onLoggingMessage(params);\n }\n };\n bridge.onupdatemodelcontext = async () => ({});\n bridge.onsizechange = async (params) => {\n const { width, height } = params;\n // Guard: ignore transient 0px resize events (e.g. fired by guest during viewport transitions)\n if (height !== undefined && height > 0) {\n this.iframe.style.height = `${height}px`;\n }\n if (width !== undefined && width > 0) this.iframe.style.minWidth = `min(${width}px, 100%)`;\n if (this.options.onSizeChanged) {\n this.options.onSizeChanged(params);\n }\n return {};\n };\n bridge.onrequestdisplaymode = async (params, extra) => {\n if (this.options.onRequestDisplayMode) {\n return await this.options.onRequestDisplayMode(params, extra as any);\n }\n return { mode: params.mode === 'fullscreen' ? 'fullscreen' : 'inline' };\n };\n\n return bridge;\n }\n\n private async connectBridge(): Promise<void> {\n this.log('Connecting bridge to iframe');\n\n const transport = new PostMessageTransport(\n this.iframe.contentWindow!,\n this.iframe.contentWindow!\n );\n\n try {\n await this.bridge.connect(transport);\n this.log('Bridge connected successfully');\n } catch (error) {\n this.log('Bridge connection failed', 'error');\n if (this.options.onError) {\n this.options.onError(error instanceof Error ? error : new Error(String(error)));\n }\n throw error;\n }\n }\n\n // ============================================\n // Private: Bridge Event Handlers\n // ============================================\n\n private async handleToolCall(params: ToolCallParams) {\n if (this.options.onCallTool) {\n return await this.options.onCallTool(params);\n }\n \n if (!this.client || !this.client.isConnected()) {\n throw new Error('Client disconnected or not provided');\n }\n\n const sessionId = await this.getSessionId();\n if (!sessionId) {\n throw new Error('No active session');\n }\n\n const result = await this.client.callTool(\n sessionId,\n params.name,\n params.arguments ?? {}\n );\n return result as any;\n }\n\n private async handleOpenLink(params: { url: string }): Promise<Record<string, never>> {\n window.open(params.url, '_blank', 'noopener,noreferrer');\n return {};\n }\n\n private async handleMessage(params: AppMessageParams): Promise<Record<string, never>> {\n this.onAppMessage?.(params);\n return {};\n }\n\n // ============================================\n // Private: Resource Loading\n // ============================================\n\n private async launchSandboxedHtml(html: string, config: SandboxConfig): Promise<void> {\n const sandboxUrlString = config.url instanceof URL ? config.url.href : config.url;\n const url = new URL(sandboxUrlString, globalThis.location?.href);\n if (config.csp && Object.keys(config.csp).length > 0) {\n url.searchParams.set('csp', JSON.stringify(config.csp));\n }\n\n const { onReady } = await setupSandboxProxyIframe(this.iframe, url);\n await onReady;\n }\n\n\n private async readMcpAppHtml(uri: string): Promise<string> {\n const sessionId = await this.getSessionId();\n if (!sessionId && !this.options.onReadResource) {\n throw new Error('No active session.');\n }\n const response = await this.fetchResourceWithCache(sessionId, uri);\n if (!response?.contents?.length) {\n throw new Error(`Empty resource: ${uri}`);\n }\n \n const content = response.contents[0];\n const html = this.decodeContent(content);\n if (!html) {\n throw new Error(`Invalid content in resource: ${uri}`);\n }\n return html;\n }\n\n private async fetchResourceWithCache(sessionId: string | undefined, uri: string): Promise<ResourceResponse> {\n if (this.options.onReadResource) {\n return await this.options.onReadResource(uri);\n }\n \n if (!sessionId) {\n throw new Error('No active session');\n }\n\n if (!this.client) {\n throw new Error('No client to read resource from');\n }\n \n // Priority 1: SSEClient's built-in cache (best performance)\n if (this.hasClientCache()) {\n return (this.client as any).getOrFetchResource(sessionId, uri);\n }\n\n // Priority 2: Local preload cache\n const cached = this.resourceCache.get(uri);\n if (cached) {\n const result = await cached;\n if (result) return result;\n }\n\n // Priority 3: Direct fetch\n return this.client.readResource(sessionId, uri) as Promise<ResourceResponse>;\n }\n\n private async preloadResource(uri: string): Promise<ResourceResponse | null> {\n try {\n if (this.options.onReadResource) {\n return await this.options.onReadResource(uri);\n }\n const sessionId = await this.getSessionId();\n if (!sessionId || !this.client) return null;\n return await this.client.readResource(sessionId, uri) as ResourceResponse;\n } catch (error) {\n this.log(`Preload failed for ${uri}`, 'warn');\n return null;\n }\n }\n\n // ============================================\n // Private: Utilities\n // ============================================\n\n private async getSessionId(): Promise<string | undefined> {\n if (this.sessionId) return this.sessionId;\n if (!this.client) return undefined;\n const result = await this.client.listSessions();\n return result.sessions?.[0]?.sessionId;\n }\n\n private isMcpUri(url: string): boolean {\n return MCP_URI_SCHEMES.some(scheme => url.startsWith(scheme));\n }\n\n private hasClientCache(): boolean {\n if (!this.client) return false;\n return 'getOrFetchResource' in this.client &&\n typeof (this.client as any).getOrFetchResource === 'function';\n }\n\n private extractUiResourceUri(tool: { _meta?: unknown }): string | undefined {\n const meta = tool._meta as { ui?: { resourceUri?: string; uri?: string } } | undefined;\n if (!meta?.ui) return undefined;\n return meta.ui.resourceUri ?? meta.ui.uri;\n }\n\n private decodeContent(content: ResourceContent): string | undefined {\n if (content.blob) {\n return atob(content.blob);\n }\n return content.text;\n }\n\n private log(message: string, level: 'info' | 'warn' | 'error' = 'info'): void {\n if (!this.debug && level === 'info') return;\n\n const prefix = '[AppHost]';\n switch (level) {\n case 'warn':\n console.warn(prefix, message);\n break;\n case 'error':\n console.error(prefix, message);\n break;\n default:\n console.log(prefix, message);\n }\n }\n}\n","import { APP_HOST_DEFAULTS, SANDBOX_PROXY_READY_METHOD } from '../core/constants.js';\n\nconst DEFAULT_SANDBOX_TIMEOUT_MS = APP_HOST_DEFAULTS.SANDBOX_TIMEOUT_MS;\n\nexport async function setupSandboxProxyIframe(\n iframe: HTMLIFrameElement,\n sandboxProxyUrl: URL\n): Promise<{\n onReady: Promise<void>;\n}> {\n iframe.style.width = '100%';\n iframe.style.height = '100%';\n iframe.style.border = 'none';\n iframe.style.backgroundColor = 'transparent';\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms allow-modals allow-popups allow-downloads');\n\n const onReady = new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n window.removeEventListener('message', messageListener);\n iframe.removeEventListener('error', errorListener);\n };\n\n const timeoutId = setTimeout(() => {\n if (!settled) {\n settled = true;\n cleanup();\n reject(new Error('Timed out waiting for sandbox proxy iframe to be ready'));\n }\n }, DEFAULT_SANDBOX_TIMEOUT_MS);\n\n const messageListener = (event: MessageEvent) => {\n if (event.source === iframe.contentWindow) {\n if (event.data?.method === SANDBOX_PROXY_READY_METHOD) {\n if (!settled) {\n settled = true;\n clearTimeout(timeoutId);\n cleanup();\n resolve();\n }\n }\n }\n };\n\n const errorListener = () => {\n if (!settled) {\n settled = true;\n clearTimeout(timeoutId);\n cleanup();\n reject(new Error('Failed to load sandbox proxy iframe'));\n }\n };\n\n window.addEventListener('message', messageListener);\n iframe.addEventListener('error', errorListener);\n });\n\n iframe.src = sandboxProxyUrl.href;\n\n return { onReady };\n}\n","/**\n * Default configuration values for the App Host.\n *\n * `SANDBOX_*_READY_METHOD` match `@modelcontextprotocol/ext-apps` (see\n * https://github.com/modelcontextprotocol/ext-apps/blob/main/src/types.ts ).\n * Duplicated here because the package root `app.d.ts` often omits these value exports under\n * `moduleResolution: \"NodeNext\"`.\n */\nexport const SANDBOX_PROXY_READY_METHOD = 'ui/notifications/sandbox-proxy-ready' as const;\nexport const SANDBOX_RESOURCE_READY_METHOD = 'ui/notifications/sandbox-resource-ready' as const;\n\nexport const APP_HOST_DEFAULTS = {\n /** Default timeout for waiting for the sandbox proxy to be ready (ms). */\n SANDBOX_TIMEOUT_MS: 10000,\n \n /** Default host info reported to guest apps. */\n HOST_INFO: { name: 'mcp-ts-host', version: '1.0.0' },\n\n /** Supported MCP App URI schemes. */\n URI_SCHEMES: ['ui://', 'mcp-app://'] as const,\n\n /** Default theme for the host context. */\n THEME: 'dark',\n\n /** Default platform for the host context. */\n PLATFORM: 'web',\n\n /** Default max height for the iframe container (px). */\n MAX_HEIGHT: 6000,\n} as const;\n","/**\n * MCP Redis Shared Package\n * Shared types and utilities for both server and client\n */\n\n// Events\nexport {\n Emitter,\n DisposableStore,\n type Disposable,\n type Event,\n type McpConnectionState,\n type McpConnectionEvent,\n type McpObservabilityEvent,\n} from './events';\n\n// Constants\nexport * from './constants';\n\n// Errors\nexport * from './errors';\n\n// Types\nexport type {\n ToolClient,\n ToolClientProvider,\n ToolInfo,\n McpRpcRequest,\n McpRpcResponse,\n McpRpcMethod,\n McpRpcParams,\n TransportType,\n // API types\n ConnectRequest,\n ConnectResponse,\n ConnectSuccessResponse,\n ConnectAuthRequiredResponse,\n ConnectErrorResponse,\n ListToolsResponse,\n CallToolRequest,\n CallToolResponse,\n // RPC param types\n ConnectParams,\n DisconnectParams,\n SessionParams,\n CallToolParams,\n GetPromptParams,\n ReadResourceParams,\n FinishAuthParams,\n // RPC result types\n SessionInfo,\n SessionListResult,\n ConnectResult,\n DisconnectResult,\n GetSessionResult,\n FinishAuthResult,\n ListToolsRpcResult,\n ListPromptsResult,\n ListResourcesResult,\n} from './types';\n\nexport {\n isConnectSuccess,\n isConnectAuthRequired,\n isConnectError,\n isListToolsSuccess,\n isCallToolSuccess,\n} from './types';\n\n// Utilities\nexport { sanitizeServerLabel } from './utils.js';\nexport {\n getToolUiResourceUri,\n findToolByName,\n type ToolUiConfig,\n} from './tool-utils.js';\n\n// Tool Router — Context window optimization\nexport {\n ToolRouter,\n type ToolRouterOptions,\n type ToolRouterStrategy,\n type ToolRouterClientInput,\n type ToolGroupInfo,\n} from './tool-router.js';\n\nexport {\n ToolIndex,\n type ToolSummary,\n type ToolServerSummary,\n type ToolSearchOptions,\n type ToolListResult,\n type IndexedTool,\n type ToolIndexOptions,\n type EmbedFn,\n} from './tool-index.js';\n\nexport {\n SchemaCompressor,\n type CompactTool,\n} from './schema-compressor.js';\n\nexport {\n createSearchToolDefinition,\n createListServersToolDefinition,\n createRegexSearchToolDefinition,\n createGetSchemaToolDefinition,\n createExecuteToolDefinition,\n executeMetaTool,\n isMetaTool,\n resolveMetaToolProxy,\n type CallToolFn,\n} from './meta-tools.js';\n\n","/**\n * Type definitions for MCP operations\n */\n\nimport { Tool, CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\n// ---------------------------------------------------------------------------\n// Core Capability Interfaces\n// ---------------------------------------------------------------------------\n\n/**\n * A client that can list and execute MCP tools.\n *\n * This is the structural interface that `ToolRouter`, adapters, and other\n * consumers use to interact with any MCP client implementation.\n * Both `MCPClient` and `createMcpClient()` satisfy this interface.\n */\nexport interface ToolClient {\n isConnected(): boolean;\n listTools(): Promise<{ tools: Tool[] }>;\n callTool(name: string, args: Record<string, unknown>): Promise<any>;\n getServerId?(): string | undefined;\n getServerName?(): string | undefined;\n getSessionId?(): string;\n}\n\n/**\n * A provider that manages multiple `ToolClient` instances.\n *\n * `MultiSessionClient` satisfies this interface. Pass it directly\n * to `ToolRouter` or adapters to aggregate tools from all connected servers.\n */\nexport interface ToolClientProvider {\n getClients(): ToolClient[];\n}\n\n// Connect API types\nexport interface ConnectRequest {\n serverUrl: string;\n callbackUrl: string;\n}\n\nexport interface ConnectSuccessResponse {\n success: true;\n sessionId: string;\n}\n\nexport interface ConnectAuthRequiredResponse {\n requiresAuth: true;\n authUrl: string;\n sessionId: string;\n}\n\nexport interface ConnectErrorResponse {\n error: string;\n}\n\nexport type ConnectResponse =\n | ConnectSuccessResponse\n | ConnectAuthRequiredResponse\n | ConnectErrorResponse;\n\n// Callback API types\nexport interface CallbackSuccessResponse {\n success: true;\n message: string;\n}\n\nexport interface CallbackErrorResponse {\n error: string;\n}\n\nexport type CallbackResponse = CallbackSuccessResponse | CallbackErrorResponse;\n\n// Disconnect API types\nexport interface DisconnectRequest {\n sessionId: string;\n}\n\nexport interface DisconnectSuccessResponse {\n success: true;\n message: string;\n}\n\nexport interface DisconnectErrorResponse {\n error: string;\n}\n\nexport type DisconnectResponse =\n | DisconnectSuccessResponse\n | DisconnectErrorResponse;\n\n// List Tools API types\nexport interface ListToolsSuccessResponse {\n tools: Tool[];\n}\n\nexport interface ListToolsErrorResponse {\n error: string;\n}\n\nexport type ListToolsResponse =\n | ListToolsSuccessResponse\n | ListToolsErrorResponse;\n\n// Call Tool API types\nexport interface CallToolRequest {\n sessionId: string;\n toolName: string;\n toolArgs: Record<string, unknown>;\n}\n\nexport interface CallToolSuccessResponse {\n content: Array<{\n type: string;\n text?: string;\n [key: string]: unknown;\n }>;\n isError: boolean;\n}\n\nexport interface CallToolErrorResponse {\n error: string;\n}\n\nexport type CallToolResponse =\n | CallToolSuccessResponse\n | CallToolErrorResponse;\n\n// Helper type guards\nexport function isConnectSuccess(\n response: ConnectResponse\n): response is ConnectSuccessResponse {\n return 'success' in response && response.success === true;\n}\n\nexport function isConnectAuthRequired(\n response: ConnectResponse\n): response is ConnectAuthRequiredResponse {\n return 'requiresAuth' in response && response.requiresAuth === true;\n}\n\nexport function isConnectError(\n response: ConnectResponse\n): response is ConnectErrorResponse {\n return 'error' in response;\n}\n\nexport function isListToolsSuccess(\n response: ListToolsResponse\n): response is ListToolsSuccessResponse {\n return 'tools' in response;\n}\n\nexport function isCallToolSuccess(\n response: CallToolResponse\n): response is CallToolSuccessResponse {\n return 'content' in response;\n}\n\n// Generic tool info type\nexport type ToolInfo = {\n name: string;\n description?: string;\n inputSchema?: Tool['inputSchema'];\n outputSchema?: Tool['outputSchema'];\n};\n\n// Transport type\nexport type TransportType = 'sse' | 'streamable-http';\nexport type SessionStatus = 'pending' | 'active';\n\n// SSE/RPC types\nexport type McpRpcMethod =\n | 'connect'\n | 'disconnect'\n | 'listTools'\n | 'callTool'\n | 'listSessions'\n | 'getSession'\n | 'finishAuth'\n | 'listPrompts'\n | 'getPrompt'\n | 'listResources'\n | 'readResource';\n\nexport interface McpRpcRequest {\n id: string;\n method: McpRpcMethod;\n params?: McpRpcParams;\n}\n\nexport interface McpRpcResponse<T = unknown> {\n id: string;\n result?: T;\n error?: {\n code: string;\n message: string;\n };\n}\n\n// RPC Parameter Types\nexport interface ConnectParams {\n serverId?: string; // Optional - generated server-side if not provided\n serverName: string;\n serverUrl: string;\n callbackUrl: string;\n transportType?: TransportType;\n headers?: Record<string, string>;\n}\n\nexport interface DisconnectParams {\n sessionId: string;\n}\n\nexport interface SessionParams {\n sessionId: string;\n}\n\nexport interface CallToolParams {\n sessionId: string;\n toolName: string;\n toolArgs: Record<string, unknown>;\n}\n\nexport interface GetPromptParams {\n sessionId: string;\n name: string;\n args?: Record<string, string>;\n}\n\nexport interface ReadResourceParams {\n sessionId: string;\n uri: string;\n}\n\nexport interface FinishAuthParams {\n state: string;\n code: string;\n}\n\nexport type McpRpcParams =\n | ConnectParams\n | DisconnectParams\n | SessionParams\n | CallToolParams\n | GetPromptParams\n | ReadResourceParams\n | FinishAuthParams\n | undefined;\n\n// RPC Result Types\nexport interface SessionInfo {\n sessionId: string;\n serverId?: string;\n serverName?: string;\n serverUrl: string;\n transport: TransportType;\n createdAt: number;\n updatedAt?: number;\n /**\n * Session readiness for auto-restore.\n * `pending` means auth is in progress and should be resumed explicitly by user action.\n */\n status: SessionStatus;\n}\n\nexport interface SessionListResult {\n sessions: SessionInfo[];\n}\n\nexport interface ConnectResult {\n sessionId: string;\n success: boolean;\n}\n\nexport interface DisconnectResult {\n success: boolean;\n}\n\nexport interface GetSessionResult {\n success: boolean;\n toolCount: number;\n}\n\nexport interface FinishAuthResult {\n success: boolean;\n toolCount: number;\n}\n\nexport interface ListToolsRpcResult {\n tools: Tool[];\n}\n\nexport interface ListPromptsResult {\n prompts: Array<{\n name: string;\n description?: string;\n arguments?: Array<{\n name: string;\n description?: string;\n required?: boolean;\n }>;\n }>;\n}\n\nexport interface ListResourcesResult {\n resources: Array<{\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n }>;\n}\n\nexport type { CallToolResult };\n","/**\n * Utility functions for working with MCP tool metadata\n */\n\nimport type { ToolInfo } from './types.js';\n\nexport interface ToolUiConfig {\n resourceUri: string;\n sessionId: string;\n}\n\n/**\n * Extract UI resource URI from tool metadata\n *\n * @param tool - The tool to extract UI config from\n * @returns The resource URI if available, undefined otherwise\n *\n * @example\n * const uri = getToolUiResourceUri(tool);\n * if (uri) {\n * // Tool has UI configuration\n * }\n */\nexport function getToolUiResourceUri(tool: ToolInfo): string | undefined {\n const meta = (tool as any)._meta;\n if (!meta?.ui) return undefined;\n\n const ui = meta.ui;\n if (typeof ui !== \"object\" || !ui) return undefined;\n\n // Check visibility filter - skip if explicitly hidden from app\n if (ui.visibility && !ui.visibility.includes(\"app\")) return undefined;\n\n // Support both 'uri' and 'resourceUri' field names for flexibility\n return typeof ui.resourceUri === \"string\"\n ? ui.resourceUri\n : typeof ui.uri === \"string\"\n ? ui.uri\n : undefined;\n}\n\n/**\n * Find a tool by name within connections\n *\n * @param connections - Array of MCP connections\n * @param toolName - Name of the tool to find\n * @returns The tool if found, undefined otherwise\n *\n * @example\n * const tool = findToolByName(connections, \"get_weather\");\n */\nexport function findToolByName(\n connections: Array<{ tools: ToolInfo[] }>,\n toolName: string\n): ToolInfo | undefined {\n for (const conn of connections) {\n const tool = conn.tools.find((t) => t.name === toolName);\n if (tool) return tool;\n }\n return undefined;\n}\n","/**\n * ToolRouter — Middleware layer for intelligent MCP tool selection.\n *\n * Sits between your AI framework adapter and MultiSessionClient to reduce\n * context window usage. Supports three strategies:\n *\n * • `all` — Pass through every tool (backward-compatible default)\n * • `search` — Expose only meta-tools; LLM discovers tools on-demand\n * • `groups` — Expose tools from active groups only\n *\n * Inspired by Anthropic's `defer_loading` + `tool_search_tool` pattern.\n *\n * @example\n * ```ts\n * import { ToolRouter } from '@mcp-ts/sdk/shared';\n * import { AIAdapter } from '@mcp-ts/sdk/adapters/ai';\n *\n * const router = new ToolRouter(multiSessionClient, {\n * strategy: 'search',\n * maxTools: 5,\n * });\n *\n * const tools = await AIAdapter.getTools(multiSessionClient, { toolRouter: router });\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { ToolClient, ToolClientProvider } from './types.js';\nimport {\n ToolIndex,\n type IndexedTool,\n type ToolLookupOptions,\n type ToolListResult,\n type ToolSearchOptions,\n type ToolServerSummary,\n type ToolSummary,\n type EmbedFn,\n} from './tool-index.js';\nimport { SchemaCompressor, type CompactTool } from './schema-compressor.js';\nimport {\n createSearchToolDefinition,\n createListServersToolDefinition,\n createRegexSearchToolDefinition,\n createGetSchemaToolDefinition,\n createExecuteToolDefinition,\n} from './meta-tools.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ToolRouterStrategy = 'all' | 'search' | 'groups';\n\nexport interface ToolRouterOptions {\n /**\n * Strategy for tool selection.\n *\n * • `all` — Expose all tools (default, backward-compatible)\n * • `search` — Expose only meta-tools; LLM discovers real tools via search\n * • `groups` — Expose only tools from active groups\n *\n * @default 'all'\n */\n strategy?: ToolRouterStrategy;\n\n /**\n * Maximum tools to expose to the LLM at once.\n * Only applies to `groups` strategy and search results.\n * @default 40\n */\n maxTools?: number;\n\n /**\n * Tool groups configuration — map of group name to tool names.\n * When not provided, groups are auto-generated from server names.\n *\n * @example\n * ```ts\n * groups: {\n * database: ['query_db', 'list_tables', 'describe_table'],\n * github: ['create_pr', 'list_issues', 'search_code'],\n * }\n * ```\n */\n groups?: Record<string, string[]>;\n\n /**\n * Active groups (when `strategy='groups'`).\n * Only tools in these groups are exposed. Empty = all groups active.\n */\n activeGroups?: string[];\n\n /**\n * Whether to use compact schemas (name + description + parameterHint only, no inputSchema).\n * Reduces token usage but requires 2-turn flow: LLM picks tool → get schema → call.\n * @default false\n */\n compactSchemas?: boolean;\n\n /**\n * Tool names to expose directly when using `search` strategy.\n * Pinned tools are removed from discovery results and should be called directly.\n */\n pinnedTools?: string[];\n\n /**\n * Tool names to omit from direct exposure while keeping them indexed for\n * search/schema lookup/calls through meta-tools.\n */\n deferredTools?: string[];\n\n /**\n * Tool names or glob-style patterns to omit entirely from the router catalog.\n */\n excludeTools?: string[];\n\n /**\n * Optional embedding function for semantic search.\n * When not provided, keyword TF-IDF matching is used.\n */\n embedFn?: EmbedFn;\n\n /**\n * Weight of keyword score vs embedding score (0–1).\n * Only relevant when `embedFn` is provided.\n * @default 0.4\n */\n keywordWeight?: number;\n}\n\n/** Information about a tool group. */\nexport interface ToolGroupInfo {\n tools: string[];\n active: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Client Input Types\n// ---------------------------------------------------------------------------\n\n/**\n * Accepted client input for ToolRouter.\n * Pass a `ToolClientProvider` (e.g. MultiSessionClient), or an array of `ToolClient` instances.\n */\nexport type ToolRouterClientInput = ToolClientProvider | ToolClient[];\n\n// ---------------------------------------------------------------------------\n// ToolRouter\n// ---------------------------------------------------------------------------\n\nexport class ToolRouter {\n private index: ToolIndex;\n private allTools: IndexedTool[] = [];\n private pinnedTools: IndexedTool[] = [];\n private deferredTools: IndexedTool[] = [];\n private discoverableTools: IndexedTool[] = [];\n private groupsMap = new Map<string, ToolGroupInfo>();\n private strategy: ToolRouterStrategy;\n private maxTools: number;\n private compactSchemas: boolean;\n private activeGroups: Set<string>;\n private customGroups?: Record<string, string[]>;\n private pinnedToolNames: Set<string>;\n private deferredToolNames: Set<string>;\n private excludeToolMatchers: RegExp[];\n private initialized = false;\n\n constructor(\n private client: ToolRouterClientInput,\n private options: ToolRouterOptions = {}\n ) {\n this.strategy = options.strategy ?? 'all';\n this.maxTools = options.maxTools ?? 40;\n this.compactSchemas = options.compactSchemas ?? false;\n this.activeGroups = new Set(options.activeGroups ?? []);\n this.customGroups = options.groups;\n this.pinnedToolNames = new Set(options.pinnedTools ?? []);\n this.deferredToolNames = new Set(options.deferredTools ?? []);\n this.excludeToolMatchers = (options.excludeTools ?? []).map((pattern) =>\n globToRegExp(pattern)\n );\n\n this.index = new ToolIndex({\n embedFn: options.embedFn,\n keywordWeight: options.keywordWeight,\n });\n }\n\n // -----------------------------------------------------------------------\n // Core Public API\n // -----------------------------------------------------------------------\n\n /**\n * Get tools filtered by the current strategy.\n * This is the main method adapters should call.\n *\n * - `all` → returns all tools (unchanged behavior)\n * - `search` → returns only meta-tools (mcp_search_tools, mcp_get_tool_schema, mcp_execute_tool)\n * - `groups` → returns tools from active groups only\n */\n async getFilteredTools(): Promise<Tool[]> {\n await this.ensureInitialized();\n\n switch (this.strategy) {\n case 'search':\n return [...this.getMetaToolDefinitions(), ...this.pinnedTools];\n\n case 'groups':\n return this.getGroupFilteredTools();\n\n case 'all':\n default:\n const directlyVisibleTools = this.getDirectlyVisibleTools();\n if (this.compactSchemas) {\n // Return tools with inputSchema stripped\n return directlyVisibleTools.map((t) => {\n const compact = SchemaCompressor.toCompact(t);\n return {\n name: compact.name,\n description:\n (compact.description ?? '') +\n (compact.parameterHint ? ` Parameters: ${compact.parameterHint}` : ''),\n inputSchema: { type: 'object' as const, properties: {} },\n };\n });\n }\n return [...directlyVisibleTools];\n }\n }\n\n /**\n * Search tools by natural-language query.\n * Works regardless of strategy.\n */\n async searchTools(\n query: string,\n topK?: number,\n options: ToolSearchOptions = {}\n ): Promise<ToolSummary[]> {\n await this.ensureInitialized();\n const limit = topK ?? this.maxTools;\n return this.index.search(query, limit, options);\n }\n\n /**\n * Search tools by regex pattern.\n * Matches against name, description, and parameter metadata.\n */\n async searchToolsRegex(pattern: string, topK?: number): Promise<ToolSummary[]> {\n await this.ensureInitialized();\n return this.index.searchRegex(pattern, topK ?? this.maxTools);\n }\n\n /** List connected MCP servers with indexed tool counts. */\n async listServers(options: ToolSearchOptions = {}): Promise<ToolServerSummary[]> {\n await this.ensureInitialized();\n return this.index.listServers(options);\n }\n\n /** List tools deterministically, optionally scoped to a server. */\n async listTools(options: ToolSearchOptions & { limit?: number; cursor?: string } = {}): Promise<ToolListResult> {\n await this.ensureInitialized();\n return this.index.listTools(options);\n }\n\n /**\n * Get the full tool definition by name.\n * If tool name is ambiguous, use namespace to specify the server.\n */\n getToolSchema(\n toolName: string,\n namespace?: string,\n options: ToolLookupOptions = {}\n ): IndexedTool | undefined {\n const matches = this.getIndexedToolMatches(toolName, namespace, options);\n\n if (matches.length === 0) return undefined;\n\n if (matches.length > 1) {\n const servers = matches.map((m) => m.serverId).join(', ');\n throw new Error(\n `Tool \"${toolName}\" is provided by multiple servers: [${servers}]. ` +\n `Please specify the desired \"serverId\" as a namespace.`\n );\n }\n\n return matches[0];\n }\n\n /**\n * Resolve the full tool definition by name, ensuring the router index has\n * been initialized first.\n */\n async resolveToolSchema(\n toolName: string,\n namespace?: string,\n options: ToolLookupOptions = {}\n ): Promise<IndexedTool | undefined> {\n await this.ensureInitialized();\n return this.getToolSchema(toolName, namespace, options);\n }\n\n /**\n * Get compact (schema-less) summaries for all tools.\n */\n getCompactTools(): CompactTool[] {\n return SchemaCompressor.compactAll(this.allTools);\n }\n\n // -----------------------------------------------------------------------\n // Group Management\n // -----------------------------------------------------------------------\n\n /** Get all available groups with their tool lists and active status. */\n getGroups(): Map<string, ToolGroupInfo> {\n return new Map(this.groupsMap);\n }\n\n /** Activate specific groups. Pass empty array to activate all. */\n setActiveGroups(groups: string[]): void {\n this.activeGroups = new Set(groups);\n // Update groupsMap active flags\n for (const [name, info] of this.groupsMap) {\n info.active = this.activeGroups.size === 0 || this.activeGroups.has(name);\n }\n }\n\n /** Get the names of currently active groups. */\n getActiveGroups(): string[] {\n return [...this.activeGroups];\n }\n\n /** Number of total indexed tools. */\n get totalToolCount(): number {\n return this.allTools.length;\n }\n\n /** Change strategy at runtime. */\n setStrategy(strategy: ToolRouterStrategy): void {\n this.strategy = strategy;\n }\n\n /**\n * Force a re-index of tools from all connected clients.\n * Call this after adding/removing MCP server connections.\n */\n async refresh(): Promise<void> {\n this.initialized = false;\n await this.ensureInitialized();\n }\n\n /**\n * Execute a tool by routing to the correct MCP client.\n * Used by the `mcp_execute_tool` meta-tool to proxy tool calls.\n */\n async callTool(\n toolName: string,\n args: Record<string, unknown>,\n namespace?: string\n ): Promise<any> {\n await this.ensureInitialized();\n\n const indexedTool = this.getToolSchema(toolName, namespace);\n if (!indexedTool) {\n throw new Error(\n `Tool \"${toolName}\" not found${\n namespace ? ` on server \"${namespace}\"` : ''\n }. Use mcp_search_tools or mcp_search_tool_regex to discover available tools.`\n );\n }\n\n const clients = this.getClients();\n const targetClient =\n clients.find(\n (c) =>\n typeof c.getSessionId === 'function' &&\n c.getSessionId() === indexedTool.sessionId\n ) ?? clients.find((c) => c.isConnected());\n\n if (!targetClient) {\n throw new Error(`No connected client found for tool \"${toolName}\"`);\n }\n\n return await targetClient.callTool(toolName, args);\n }\n\n // -----------------------------------------------------------------------\n // Internals\n // -----------------------------------------------------------------------\n\n /** Lazy initialization — fetches tools from all connected clients. */\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n const fetchedTools = await this.fetchAllTools();\n this.allTools = fetchedTools.filter((tool) => !this.matchesExcludedTool(tool.name));\n this.pinnedTools = this.allTools.filter((tool) => this.matchesPinnedTool(tool.name));\n this.deferredTools = this.allTools.filter(\n (tool) => !this.matchesPinnedTool(tool.name) && this.matchesDeferredTool(tool)\n );\n this.discoverableTools = this.allTools.filter((tool) => !this.matchesPinnedTool(tool.name));\n await this.index.buildIndex(this.discoverableTools);\n this.buildGroups();\n this.initialized = true;\n }\n\n /** Fetch tools from all connected MCP clients. */\n private async fetchAllTools(): Promise<IndexedTool[]> {\n const clients = this.getClients();\n const result: IndexedTool[] = [];\n\n for (const client of clients) {\n if (!client.isConnected()) continue;\n\n try {\n const { tools } = await client.listTools();\n const serverId =\n typeof client.getServerId === 'function' ? client.getServerId() ?? 'unknown' : 'unknown';\n const serverName =\n (typeof client.getServerName === 'function' ? client.getServerName() : undefined) ??\n serverId;\n const sessionId =\n typeof client.getSessionId === 'function' ? client.getSessionId() ?? 'unknown' : 'unknown';\n\n for (const tool of tools) {\n result.push({\n ...tool,\n serverId,\n serverName: serverName,\n sessionId,\n });\n }\n } catch (err) {\n console.warn('[ToolRouter] Failed to fetch tools from client:', err);\n }\n }\n\n return result;\n }\n\n /** Resolve the client input to a flat array of ToolClient instances. */\n private getClients(): ToolClient[] {\n if (Array.isArray(this.client)) {\n return this.client;\n }\n if (typeof (this.client as ToolClientProvider).getClients === 'function') {\n return (this.client as ToolClientProvider).getClients();\n }\n // Single client\n return [this.client as unknown as ToolClient];\n }\n\n /** Build group map from custom config or auto-detect from server names. */\n private buildGroups(): void {\n this.groupsMap.clear();\n\n if (this.customGroups) {\n // Explicit groups\n for (const [name, tools] of Object.entries(this.customGroups)) {\n this.groupsMap.set(name, {\n tools,\n active: this.activeGroups.size === 0 || this.activeGroups.has(name),\n });\n }\n } else {\n // Auto-group by server ID\n const serverTools = new Map<string, string[]>();\n for (const tool of this.allTools) {\n const group = tool.serverId;\n if (!serverTools.has(group)) {\n serverTools.set(group, []);\n }\n serverTools.get(group)!.push(tool.name);\n }\n\n for (const [serverId, tools] of serverTools) {\n this.groupsMap.set(serverId, {\n tools,\n active: this.activeGroups.size === 0 || this.activeGroups.has(serverId),\n });\n }\n }\n }\n\n /** Return only tools belonging to currently active groups. */\n private getGroupFilteredTools(): Tool[] {\n const activeToolNames = new Set<string>();\n for (const [, info] of this.groupsMap) {\n if (info.active) {\n for (const name of info.tools) {\n activeToolNames.add(name);\n }\n }\n }\n\n const filtered = this.getDirectlyVisibleTools().filter((t) => activeToolNames.has(t.name));\n\n if (this.compactSchemas) {\n return filtered.slice(0, this.maxTools).map((t) => {\n const compact = SchemaCompressor.toCompact(t);\n return {\n name: compact.name,\n description:\n (compact.description ?? '') +\n (compact.parameterHint ? ` Parameters: ${compact.parameterHint}` : ''),\n inputSchema: { type: 'object' as const, properties: {} },\n };\n });\n }\n\n return filtered.slice(0, this.maxTools);\n }\n\n /** The 4 meta-tool definitions exposed in `search` strategy. */\n private getMetaToolDefinitions(): Tool[] {\n return [\n createSearchToolDefinition(),\n createListServersToolDefinition(),\n createRegexSearchToolDefinition(),\n createGetSchemaToolDefinition(),\n createExecuteToolDefinition(),\n ];\n }\n\n private matchesPinnedTool(toolName: string): boolean {\n return this.pinnedToolNames.has(toolName);\n }\n\n private matchesDeferredTool(tool: Tool): boolean {\n if (this.deferredToolNames.has(tool.name)) {\n return true;\n }\n\n const meta = (tool as Tool & {\n _meta?: { toolRouter?: { deferred?: boolean } };\n })._meta;\n return meta?.toolRouter?.deferred === true;\n }\n\n private matchesExcludedTool(toolName: string): boolean {\n return this.excludeToolMatchers.some((matcher) => matcher.test(toolName));\n }\n\n private getDirectlyVisibleTools(): IndexedTool[] {\n return this.allTools.filter((tool) => !this.matchesDeferredTool(tool) || this.matchesPinnedTool(tool.name));\n }\n\n private getIndexedToolMatches(\n toolName: string,\n namespace?: string,\n options: ToolLookupOptions = {}\n ): IndexedTool[] {\n const indexedMatches = this.index.getTool(toolName, namespace, options);\n if (indexedMatches.length > 0 || !this.matchesPinnedTool(toolName)) {\n return indexedMatches;\n }\n\n return this.matchTools(this.pinnedTools.filter((tool) => tool.name === toolName), namespace, options);\n }\n\n private matchTools(\n tools: IndexedTool[],\n namespace?: string,\n options: ToolLookupOptions = {}\n ): IndexedTool[] {\n if (!namespace) return tools;\n\n const exactMatches = tools.filter(\n (tool) => tool.sessionId === namespace || tool.serverId === namespace\n );\n if (exactMatches.length > 0) return exactMatches;\n\n if (!options.allowServerNameFragment) return [];\n\n const namespaceLower = namespace.toLowerCase();\n return tools.filter((tool) => tool.serverName.toLowerCase().includes(namespaceLower));\n }\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexPattern = `^${escaped.replace(/\\*/g, '.*')}$`;\n return new RegExp(regexPattern);\n}\n","/**\n * ToolIndex — Lightweight in-memory search index for MCP tool discovery.\n *\n * Supports two search methods:\n * • BM25 – Okapi BM25 ranking over tokenized tool metadata (zero external deps)\n * • regex – Pattern matching against tool names, descriptions, and parameters\n * • embedding – (optional) cosine-similarity over caller-supplied vectors,\n * blended with BM25 scores\n *\n * @packageDocumentation\n */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ---------------------------------------------------------------------------\n// Public Types\n// ---------------------------------------------------------------------------\n\n/** Compact summary returned by search — intentionally lightweight. */\nexport interface ToolSummary {\n /** Fully qualified tool name (e.g. \"tool_github_create_pr\") */\n name: string;\n /** Human-readable description */\n description: string;\n /** Server that owns this tool */\n serverName: string;\n /** Unique ID of the server */\n serverId: string;\n /** Session the tool belongs to */\n sessionId: string;\n}\n\n/** Server-level summary derived from indexed tools. */\nexport interface ToolServerSummary {\n /** Human-readable server name */\n serverName: string;\n /** Stable server identifier */\n serverId: string;\n /** Session the server belongs to */\n sessionId: string;\n /** Number of indexed tools for this server */\n toolCount: number;\n}\n\n/** Optional filters for search and listing. */\nexport interface ToolSearchOptions {\n /** Restrict results to this server ID. */\n serverId?: string;\n /** Restrict results to servers whose name or ID matches this value. */\n serverName?: string;\n}\n\n/** Paginated tool listing result. */\nexport interface ToolListResult {\n tools: ToolSummary[];\n totalCount: number;\n returnedCount: number;\n nextCursor?: string;\n servers: ToolServerSummary[];\n}\n\nexport interface ToolLookupOptions {\n /**\n * Allow namespace to match a fragment of serverName after exact\n * sessionId/serverId matching fails.\n */\n allowServerNameFragment?: boolean;\n}\n\n/** A tool with routing metadata attached during indexing. */\nexport interface IndexedTool extends Tool {\n sessionId: string;\n serverId: string;\n serverName: string;\n outputSchema?: Tool['outputSchema'];\n}\n\n/**\n * An optional embedding function supplied by the consumer.\n * Should accept an array of strings and return a matching array of\n * float-number arrays (one embedding vector per input string).\n */\nexport type EmbedFn = (texts: string[]) => Promise<number[][]>;\n\nexport interface ToolIndexOptions {\n /**\n * Custom embedding function for semantic search.\n * When provided, `search()` uses cosine-similarity in addition to keywords.\n * @example\n * ```ts\n * import { embed } from 'ai';\n * const embedFn: EmbedFn = async (texts) => {\n * const { embeddings } = await embed({ model: openai('text-embedding-3-small'), values: texts });\n * return embeddings;\n * };\n * ```\n */\n embedFn?: EmbedFn;\n\n /**\n * Relative weight of keyword score vs embedding score when both are active.\n * 0 = embedding only · 1 = keyword only · 0.4 (default) blends both.\n * @default 0.4\n */\n keywordWeight?: number;\n}\n\n// ---------------------------------------------------------------------------\n// ToolIndex\n// ---------------------------------------------------------------------------\n\nexport class ToolIndex {\n /** All indexed tools keyed by name (supports duplicates). */\n private tools = new Map<string, IndexedTool[]>();\n\n /** Precomputed lightweight summaries keyed by document. */\n private toolSummaries = new Map<string, ToolSummary>();\n\n /** Pre-computed search text for keyword matching (lowercase), keyed by document. */\n private searchTexts = new Map<string, string>();\n\n /** Pre-computed IDF values per token (computed once on build). */\n private idf = new Map<string, number>();\n\n /** Per-tool TF vectors (Map<token, tf>). */\n private tfVectors = new Map<string, Map<string, number>>();\n\n /** Optional: pre-computed embedding vectors per tool. */\n private embeddings = new Map<string, number[]>();\n\n /** BM25: document lengths in tokens for each tool. */\n private docLengths = new Map<string, number>();\n\n /** BM25: average document length across the entire index. */\n private avgDocLength = 0;\n\n private options: Required<ToolIndexOptions>;\n\n constructor(options: ToolIndexOptions = {}) {\n this.options = {\n embedFn: options.embedFn ?? (undefined as unknown as EmbedFn),\n keywordWeight: options.keywordWeight ?? 0.4,\n };\n }\n\n // -----------------------------------------------------------------------\n // Indexing\n // -----------------------------------------------------------------------\n\n /**\n * Build (or rebuild) the index from the given tool set.\n * Call this after connecting / reconnecting to MCP servers.\n */\n async buildIndex(tools: IndexedTool[]): Promise<void> {\n this.tools.clear();\n this.toolSummaries.clear();\n this.searchTexts.clear();\n this.idf.clear();\n this.tfVectors.clear();\n this.embeddings.clear();\n this.docLengths.clear();\n this.avgDocLength = 0;\n\n // 1. Populate tool map + search text\n const allTokenSets: Map<string, Set<string>> = new Map();\n let totalLength = 0;\n\n for (const tool of tools) {\n const docKey = this.getDocumentKey(tool);\n\n if (!this.tools.has(tool.name)) {\n this.tools.set(tool.name, []);\n }\n this.tools.get(tool.name)!.push(tool);\n this.toolSummaries.set(docKey, {\n name: tool.name,\n description: tool.description ?? '',\n serverName: tool.serverName,\n serverId: tool.serverId,\n sessionId: tool.sessionId,\n });\n\n const rawText = this.buildSearchableText(tool);\n const text = rawText.toLowerCase();\n this.searchTexts.set(docKey, text);\n\n const tokens = this.tokenize(rawText);\n const tf = new Map<string, number>();\n const uniqueTokens = new Set<string>();\n\n for (const tok of tokens) {\n tf.set(tok, (tf.get(tok) ?? 0) + 1);\n uniqueTokens.add(tok);\n }\n\n // Normalize TF\n const maxTf = Math.max(...tf.values(), 1);\n for (const [k, v] of tf) {\n tf.set(k, v / maxTf);\n }\n\n this.tfVectors.set(docKey, tf);\n allTokenSets.set(docKey, uniqueTokens);\n\n const length = tokens.length;\n this.docLengths.set(docKey, length);\n totalLength += length;\n }\n\n // Compute average document length\n this.avgDocLength = totalLength / (tools.length || 1);\n\n // 2. Compute IDF\n const totalDocs = tools.length || 1;\n const dfCounts = new Map<string, number>();\n\n for (const tokenSet of allTokenSets.values()) {\n for (const tok of tokenSet) {\n dfCounts.set(tok, (dfCounts.get(tok) ?? 0) + 1);\n }\n }\n\n for (const [tok, df] of dfCounts) {\n this.idf.set(tok, Math.log(totalDocs / df) + 1);\n }\n\n // 3. Build embeddings if an embedFn was provided\n if (this.options.embedFn) {\n const names = [...this.searchTexts.keys()];\n const texts = names.map((n) => this.searchTexts.get(n)!);\n\n try {\n const vectors = await this.options.embedFn(texts);\n for (let i = 0; i < names.length; i++) {\n if (vectors[i]) {\n this.embeddings.set(names[i], vectors[i]);\n }\n }\n } catch (err) {\n console.warn('[ToolIndex] Embedding generation failed, falling back to keyword-only search:', err);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Search\n // -----------------------------------------------------------------------\n\n /**\n * Search the index and return the top-K most relevant tools.\n *\n * When an `embedFn` is configured the final score is a weighted blend of\n * keyword TF-IDF similarity and embedding cosine-similarity:\n *\n * `score = keywordWeight × keyword_score + (1 - keywordWeight) × cosine_score`\n */\n async search(query: string, topK = 5, options: ToolSearchOptions = {}): Promise<ToolSummary[]> {\n if (this.tools.size === 0) return [];\n\n const queryLower = query.toLowerCase().trim();\n\n // Fast path: Exact tool name match (supports duplicate names across servers)\n const exactMatches = [...this.toolSummaries.values()].filter(\n (summary) => summary.name.toLowerCase() === queryLower && this.matchesServer(summary, options)\n );\n if (exactMatches.length > 0) {\n return exactMatches.slice(0, topK);\n }\n\n // Fast path: MCP prefix match (e.g. \"mcp__github\")\n if (queryLower.startsWith('mcp__') && queryLower.length > 5) {\n const prefixMatches = [...this.toolSummaries.values()]\n .filter((t) => t.name.toLowerCase().startsWith(queryLower) && this.matchesServer(t, options))\n .slice(0, topK);\n if (prefixMatches.length > 0) return prefixMatches;\n }\n\n const queryTermsRaw = queryLower.split(/\\s+/).filter((t) => t.length > 0);\n const requiredTerms: string[] = [];\n const optionalTerms: string[] = [];\n\n for (const term of queryTermsRaw) {\n if (term.startsWith('+') && term.length > 1) {\n requiredTerms.push(term.slice(1));\n } else {\n optionalTerms.push(term);\n }\n }\n\n const allScoringTerms =\n requiredTerms.length > 0 ? [...requiredTerms, ...optionalTerms] : queryTermsRaw;\n const normalizedQueryText = allScoringTerms.join(' ').trim();\n const queryTokens = this.tokenize(allScoringTerms.join(' '));\n\n // Pre-filter: only keep documents that contain ALL required terms\n const candidateKeys = new Set<string>();\n for (const docKey of this.toolSummaries.keys()) {\n const summary = this.toolSummaries.get(docKey)!;\n if (!this.matchesServer(summary, options)) continue;\n\n if (requiredTerms.length > 0) {\n const text = this.searchTexts.get(docKey) || '';\n const nameLower = summary.name.toLowerCase();\n const matchesAll = requiredTerms.every(\n (term) => text.includes(term) || nameLower.includes(term)\n );\n if (!matchesAll) continue;\n }\n candidateKeys.add(docKey);\n }\n\n // 1. Keyword scores (BM25)\n const keywordScores = new Map<string, number>();\n\n const k1 = 1.2;\n const b = 0.75;\n\n for (const docKey of candidateKeys) {\n const docTf = this.tfVectors.get(docKey);\n if (!docTf) continue;\n \n const summary = this.toolSummaries.get(docKey)!;\n\n let score = 0;\n const docLen = this.docLengths.get(docKey) ?? 0;\n\n for (const tok of queryTokens) {\n const tfVal = docTf.get(tok) ?? 0;\n if (tfVal === 0) continue;\n\n const idf = this.idf.get(tok) ?? 0;\n // BM25 formula:\n // score = idf * (tf * (k1 + 1)) / (tf + k1 * (1 - b + b * (docLen / avgDocLength)))\n const numerator = tfVal * (k1 + 1);\n const denominator = tfVal + k1 * (1 - b + b * (docLen / this.avgDocLength));\n\n score += idf * (numerator / denominator);\n }\n\n // Name heuristics: give massive boosts for exact server/tool name matches\n const serverLower = (summary.serverName || summary.serverId || '').toLowerCase();\n const toolLower = summary.name.toLowerCase();\n\n for (const term of allScoringTerms) {\n if (serverLower.includes(term)) {\n score += 10;\n }\n if (toolLower.includes(term)) {\n score += 5;\n }\n }\n\n if (score > 0) {\n keywordScores.set(docKey, score);\n }\n }\n\n // 2. Embedding scores (optional)\n let embeddingScores: Map<string, number> | null = null;\n\n if (this.options.embedFn && this.embeddings.size > 0) {\n try {\n const [queryEmbedding] = await this.options.embedFn([normalizedQueryText]);\n if (queryEmbedding) {\n embeddingScores = new Map();\n for (const docKey of candidateKeys) {\n const vec = this.embeddings.get(docKey);\n if (vec) {\n embeddingScores.set(docKey, this.cosineSimilarity(queryEmbedding, vec));\n }\n }\n }\n } catch {\n // Silently fall back to keyword only for this query\n }\n }\n\n // 3. Blend scores\n const kw = this.options.keywordWeight;\n const finalScores: Array<{ docKey: string; score: number }> = [];\n\n for (const docKey of candidateKeys) {\n const kwScore = keywordScores.get(docKey) ?? 0;\n const embScore = embeddingScores?.get(docKey) ?? 0;\n\n const score = embeddingScores ? kw * kwScore + (1 - kw) * embScore : kwScore;\n\n if (score > 0) {\n finalScores.push({ docKey, score });\n }\n }\n\n // 4. Sort and return top-K\n finalScores.sort((a, b) => b.score - a.score);\n\n return finalScores.slice(0, topK).map(({ docKey }) => {\n return this.toolSummaries.get(docKey)!;\n });\n }\n\n /**\n * Search tools using a regex pattern.\n * Matches against name, description, and parameter metadata.\n */\n searchRegex(pattern: string, topK = 5): ToolSummary[] {\n if (this.tools.size === 0) return [];\n\n try {\n // Handle Anthropic-style (?i) case-insensitive flag which JS doesn't support natively in string\n let flags = '';\n let cleanPattern = pattern;\n if (pattern.includes('(?i)')) {\n flags = 'i';\n cleanPattern = pattern.replace(/\\(\\?i\\)/g, '');\n }\n\n const regex = new RegExp(cleanPattern, flags || undefined);\n const matches: Array<{ docKey: string; score: number }> = [];\n\n for (const [docKey, text] of this.searchTexts) {\n const tool = this.toolSummaries.get(docKey);\n if (!tool) continue;\n\n if (regex.test(text) || regex.test(tool.name)) {\n // Use a simple heuristic for ranking regex matches: \n // 1. Exact name match (highest)\n // 2. Name starts with pattern\n // 3. Name contains pattern\n // 4. Description contains pattern (lowest)\n let score = 1;\n if (tool.name === cleanPattern) score = 10;\n else if (tool.name.startsWith(cleanPattern)) score = 5;\n else if (tool.name.toLowerCase().includes(cleanPattern.toLowerCase())) score = 2;\n\n matches.push({ docKey, score });\n }\n }\n\n matches.sort((a, b) => b.score - a.score);\n\n return matches.slice(0, topK).map(({ docKey }) => {\n return this.toolSummaries.get(docKey)!;\n });\n } catch (err) {\n console.warn('[ToolIndex] Regex search failed:', err);\n return [];\n }\n }\n\n // -----------------------------------------------------------------------\n // Accessors\n // -----------------------------------------------------------------------\n\n /**\n * Get tool definition(s) by name.\n * If namespace is provided, exact sessionId/serverId matches take precedence.\n * Falls back to serverName fragment matching only when explicitly allowed.\n */\n getTool(name: string, namespace?: string, options: ToolLookupOptions = {}): IndexedTool[] {\n const list = this.tools.get(name) ?? [];\n if (!namespace) return list;\n\n const exactMatches = list.filter(\n (t) => t.sessionId === namespace || t.serverId === namespace\n );\n if (exactMatches.length > 0) return exactMatches;\n\n if (!options.allowServerNameFragment) return [];\n\n const namespaceLower = namespace.toLowerCase();\n return list.filter((t) => t.serverName.toLowerCase().includes(namespaceLower));\n }\n\n /** All indexed tool names. */\n getToolNames(): string[] {\n return [...this.tools.keys()];\n }\n\n /** List indexed servers with tool counts. */\n listServers(options: ToolSearchOptions = {}): ToolServerSummary[] {\n const servers = new Map<string, ToolServerSummary>();\n\n for (const summary of this.toolSummaries.values()) {\n if (!this.matchesServer(summary, options)) continue;\n\n const key = `${summary.sessionId}::${summary.serverId}`;\n const existing = servers.get(key);\n if (existing) {\n existing.toolCount += 1;\n } else {\n servers.set(key, {\n serverName: summary.serverName,\n serverId: summary.serverId,\n sessionId: summary.sessionId,\n toolCount: 1,\n });\n }\n }\n\n return [...servers.values()].sort((a, b) => {\n const byName = a.serverName.localeCompare(b.serverName);\n return byName !== 0 ? byName : a.serverId.localeCompare(b.serverId);\n });\n }\n\n /** List tools deterministically, optionally scoped to a server. */\n listTools(options: ToolSearchOptions & { limit?: number; cursor?: string } = {}): ToolListResult {\n const offset = Math.max(Number(options.cursor) || 0, 0);\n const limit = Math.max(Number(options.limit) || 20, 1);\n const tools = [...this.toolSummaries.values()]\n .filter((summary) => this.matchesServer(summary, options))\n .sort((a, b) => {\n const byServer = a.serverName.localeCompare(b.serverName);\n if (byServer !== 0) return byServer;\n return a.name.localeCompare(b.name);\n });\n\n const page = tools.slice(offset, offset + limit);\n const nextOffset = offset + page.length;\n\n return {\n tools: page,\n totalCount: tools.length,\n returnedCount: page.length,\n nextCursor: nextOffset < tools.length ? String(nextOffset) : undefined,\n servers: this.listServers(options),\n };\n }\n\n /** Number of indexed tools (including duplicates). */\n get size(): number {\n let count = 0;\n for (const list of this.tools.values()) {\n count += list.length;\n }\n return count;\n }\n\n // -----------------------------------------------------------------------\n // Internals\n // -----------------------------------------------------------------------\n\n /** Build a single searchable string from tool metadata. */\n private buildSearchableText(tool: Tool): string {\n const parts: string[] = [tool.name];\n if (tool.description) parts.push(tool.description);\n\n if (tool.inputSchema && typeof tool.inputSchema === 'object') {\n this.collectSchemaSearchText(tool.inputSchema, parts);\n }\n\n return parts.join(' ');\n }\n\n /** Recursively collect JSON Schema argument names and descriptions. */\n private collectSchemaSearchText(\n schema: unknown,\n parts: string[],\n seen = new WeakSet<object>()\n ): void {\n if (!schema || typeof schema !== 'object') return;\n if (seen.has(schema)) return;\n seen.add(schema);\n\n if (Array.isArray(schema)) {\n for (const item of schema) {\n this.collectSchemaSearchText(item, parts, seen);\n }\n return;\n }\n\n const schemaObject = schema as Record<string, unknown>;\n this.pushStringValue(schemaObject.description, parts);\n this.pushStringValue(schemaObject.title, parts);\n\n const properties = schemaObject.properties;\n if (properties && typeof properties === 'object' && !Array.isArray(properties)) {\n for (const [propertyName, propertySchema] of Object.entries(properties)) {\n parts.push(propertyName);\n this.collectSchemaSearchText(propertySchema, parts, seen);\n }\n }\n\n const patternProperties = schemaObject.patternProperties;\n if (\n patternProperties &&\n typeof patternProperties === 'object' &&\n !Array.isArray(patternProperties)\n ) {\n for (const [propertyPattern, propertySchema] of Object.entries(patternProperties)) {\n parts.push(propertyPattern);\n this.collectSchemaSearchText(propertySchema, parts, seen);\n }\n }\n\n const dependentSchemas = schemaObject.dependentSchemas;\n if (\n dependentSchemas &&\n typeof dependentSchemas === 'object' &&\n !Array.isArray(dependentSchemas)\n ) {\n for (const [propertyName, dependentSchema] of Object.entries(dependentSchemas)) {\n parts.push(propertyName);\n this.collectSchemaSearchText(dependentSchema, parts, seen);\n }\n }\n\n for (const key of [\n 'items',\n 'additionalProperties',\n 'contains',\n 'propertyNames',\n 'if',\n 'then',\n 'else',\n 'not',\n ]) {\n this.collectSchemaSearchText(schemaObject[key], parts, seen);\n }\n\n for (const key of ['allOf', 'anyOf', 'oneOf', 'prefixItems']) {\n this.collectSchemaSearchText(schemaObject[key], parts, seen);\n }\n\n for (const key of ['$defs', 'definitions']) {\n const definitions = schemaObject[key];\n if (definitions && typeof definitions === 'object' && !Array.isArray(definitions)) {\n for (const [definitionName, definitionSchema] of Object.entries(definitions)) {\n parts.push(definitionName);\n this.collectSchemaSearchText(definitionSchema, parts, seen);\n }\n }\n }\n }\n\n private pushStringValue(value: unknown, parts: string[]): void {\n if (typeof value === 'string' && value.trim()) {\n parts.push(value);\n }\n }\n\n private getDocumentKey(tool: IndexedTool): string {\n return `${tool.sessionId}::${tool.serverId}::${tool.name}`;\n }\n\n private matchesServer(summary: ToolSummary, options: ToolSearchOptions): boolean {\n if (options.serverId && summary.serverId !== options.serverId) {\n return false;\n }\n\n if (options.serverName) {\n const serverNameQuery = options.serverName.toLowerCase();\n const serverName = summary.serverName.toLowerCase();\n const serverId = summary.serverId.toLowerCase();\n if (!serverName.includes(serverNameQuery) && !serverId.includes(serverNameQuery)) {\n return false;\n }\n }\n\n return true;\n }\n\n /** Simple whitespace + camelCase + snake_case tokenizer. */\n private tokenize(text: string): string[] {\n return text\n // Split camelCase: \"getWeather\" → \"get Weather\"\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Split snake_case / kebab-case\n .replace(/[_-]/g, ' ')\n .toLowerCase()\n // Remove non-alphanumeric (except spaces)\n .replace(/[^a-z0-9\\s]/g, '')\n // Split on whitespace\n .split(/\\s+/)\n .filter((t) => t.length > 1); // drop single-char noise\n }\n\n /** Cosine similarity between two vectors. */\n private cosineSimilarity(a: number[], b: number[]): number {\n const len = Math.min(a.length, b.length);\n let dot = 0;\n let magA = 0;\n let magB = 0;\n\n for (let i = 0; i < len; i++) {\n dot += a[i] * b[i];\n magA += a[i] * a[i];\n magB += b[i] * b[i];\n }\n\n const denom = Math.sqrt(magA) * Math.sqrt(magB);\n return denom > 0 ? dot / denom : 0;\n }\n}\n","/**\n * SchemaCompressor — Utilities for compact tool representations.\n *\n * Provides compact representations of tools (name + description only,\n * no inputSchema).\n *\n * @packageDocumentation\n */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * A minimal tool representation containing only what an LLM needs to\n * *decide whether* to use a tool. The full `inputSchema` is deferred.\n */\nexport interface CompactTool {\n name: string;\n description?: string;\n /**\n * Human-readable hint about the expected parameters.\n * e.g. \"(location: string, unit?: 'celsius' | 'fahrenheit')\"\n */\n parameterHint?: string;\n}\n\n// ---------------------------------------------------------------------------\n// SchemaCompressor\n// ---------------------------------------------------------------------------\n\nexport class SchemaCompressor {\n /**\n * Convert a full MCP Tool definition to a compact summary.\n *\n * The compact form omits `inputSchema` entirely and optionally generates\n * a short `parameterHint` from the schema's top-level properties.\n */\n static toCompact(tool: Tool): CompactTool {\n const compact: CompactTool = {\n name: tool.name,\n description: tool.description,\n };\n\n // Build parameter hint from schema\n if (tool.inputSchema && typeof tool.inputSchema === 'object') {\n const schema = tool.inputSchema as {\n properties?: Record<string, { type?: string; enum?: unknown[] }>;\n required?: string[];\n };\n\n if (schema.properties) {\n const required = new Set(schema.required ?? []);\n const parts: string[] = [];\n\n for (const [key, val] of Object.entries(schema.properties)) {\n const type = val?.type ?? 'any';\n const enumSuffix =\n val?.enum && Array.isArray(val.enum)\n ? `: ${val.enum.map((e) => `'${e}'`).join(' | ')}`\n : `: ${type}`;\n\n parts.push(required.has(key) ? `${key}${enumSuffix}` : `${key}?${enumSuffix}`);\n }\n\n if (parts.length > 0) {\n compact.parameterHint = `(${parts.join(', ')})`;\n }\n }\n }\n\n return compact;\n }\n\n /**\n * Convert an array of tools to compact form, optionally limiting the count.\n */\n static compactAll(tools: Tool[], options?: { maxTools?: number }): CompactTool[] {\n const limited = options?.maxTools ? tools.slice(0, options.maxTools) : tools;\n return limited.map((t) => SchemaCompressor.toCompact(t));\n }\n}\n","/**\n * Meta-tools — Injectable tool definitions that let the LLM discover and\n * load MCP tools on-demand, following Anthropic's Tool Search pattern.\n *\n * Instead of injecting 50+ full tool schemas into the context window, you\n * inject just these 4 meta-tools. The LLM calls them to find and load\n * only the tools it actually needs.\n *\n * Meta-tools:\n * • `mcp_search_tools` — Search/list available tools\n * • `mcp_search_tool_regex` — Regex pattern search\n * • `mcp_get_tool_schema` — Get full inputSchema for a discovered tool\n * • `mcp_execute_tool` — Execute a discovered tool\n *\n * @packageDocumentation\n */\n\nimport type { Tool, CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport type { ToolRouter } from './tool-router.js';\nimport type { IndexedTool, ToolLookupOptions } from './tool-index.js';\n\n// ---------------------------------------------------------------------------\n// Tool Definitions\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the `mcp_search_tools` tool definition.\n *\n * This tool lets the LLM search the full catalog of available MCP tools\n * using a BM25 natural-language query. Returns tool names and descriptions\n * without the full inputSchema to save context space.\n */\nexport function createSearchToolDefinition(): Tool {\n return {\n name: 'mcp_search_tools',\n description:\n 'Search the catalog of available tools. Returns tool names, descriptions, and server info. ' +\n 'Use this FIRST to find relevant tools before calling them.\\n\\n' +\n 'Query forms:\\n' +\n '- \"select:Read,Edit,Grep\" — fetch these exact tools by name\\n' +\n '- \"notebook jupyter\" — keyword search, up to limit best matches\\n' +\n '- \"+slack send\" — require \"slack\" in the name, rank by remaining terms',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Query to find tools. Use \"select:<tool_name>\" for direct selection, or keywords to search. Prefix keywords with + to require them.',\n },\n operation: {\n type: 'string',\n enum: ['search', 'list'],\n description:\n 'Operation to perform. Use \"search\" to find relevant tools by capability. Use \"list\" with serverId or serverName when the user asks for every tool from a connected MCP server.',\n },\n serverId: {\n type: 'string',\n description: 'Optional server ID to restrict search/list results to one MCP server.',\n },\n serverName: {\n type: 'string',\n description:\n 'Optional server name fragment to restrict search/list results to matching MCP servers, e.g. \"supabase\".',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 5 for search, 20 for list; max: 20 for search, 100 for list).',\n },\n cursor: {\n type: 'string',\n description: 'Optional pagination cursor returned by operation \"list\".',\n },\n },\n required: ['query'],\n },\n };\n}\n\n/**\n * Creates the `mcp_list_servers` tool definition.\n *\n * This tool lets the LLM inspect connected MCP servers before doing\n * server-scoped tool discovery.\n */\nexport function createListServersToolDefinition(): Tool {\n return {\n name: 'mcp_list_servers',\n description:\n 'List connected MCP servers and their tool counts. ' +\n 'Use this when mcp_search_tools returns no matches, then retry mcp_search_tools with serverId or serverName.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description:\n 'Optional server filter text. Matches server name or serverId, e.g. \"web\" or \"supabase\".',\n },\n },\n },\n };\n}\n\n/**\n * Creates the `mcp_search_tool_regex` tool definition.\n * \n * Matches Anthropic's tool_search_tool_regex exactly (takes a 'query' regex pattern).\n */\nexport function createRegexSearchToolDefinition(): Tool {\n return {\n name: 'mcp_search_tool_regex',\n description:\n 'Search the catalog of available tools using a Python-style regex pattern. ' +\n 'Matches against tool names, descriptions, and parameter descriptions. ' +\n 'Example patterns: \"^github_\", \"weather\", \"(?i)slack\".',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Regex pattern to search for (e.g., \"^get_.*_data\", \"database\").',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 5, max: 20).',\n },\n },\n required: ['query'],\n },\n };\n}\n\n/**\n * Creates the `mcp_get_tool_schema` tool definition.\n *\n * After discovering tools via `mcp_search_tools` or\n * `mcp_search_tool_regex`, the LLM calls this to load the full\n * input and output schemas for a specific tool so it can construct the\n * correct arguments and plan around the result shape.\n */\nexport function createGetSchemaToolDefinition(): Tool {\n return {\n name: 'mcp_get_tool_schema',\n description:\n 'Get the full input schema (parameters) and output schema (result shape) for a specific tool. ' +\n 'Call this after mcp_search_tools to get the parameter details ' +\n 'needed to call a tool correctly and understand what it returns. ' +\n 'Do NOT call the discovered tool directly; after reading the schema, call mcp_execute_tool.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n toolName: {\n type: 'string',\n description: 'The exact tool name returned by mcp_search_tools.',\n },\n serverId: {\n type: 'string',\n description:\n 'Optional: The server ID provided in mcp_search_tools. Required if multiple tools have the same name.',\n },\n },\n required: ['toolName'],\n },\n };\n}\n\n/**\n * Creates the `mcp_execute_tool` tool definition.\n *\n * This is the execution meta-tool — the LLM calls this to execute any\n * tool discovered via `mcp_search_tools` or `mcp_search_tool_regex`.\n * The LLM should first call `mcp_get_tool_schema` to know the correct\n * arguments.\n *\n * Instead of registering every real tool with the framework, we proxy\n * all execution through a single meta-tool.\n */\nexport function createExecuteToolDefinition(): Tool {\n return {\n name: 'mcp_execute_tool',\n description:\n 'Execute a tool that was discovered via mcp_search_tools. ' +\n 'You MUST call mcp_get_tool_schema first to know the correct parameters. ' +\n 'Pass the exact tool name and its arguments.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n toolName: {\n type: 'string',\n description: 'The exact tool name from mcp_search_tools results.',\n },\n serverId: {\n type: 'string',\n description:\n 'Optional: The server ID provided in mcp_search_tools. Required if multiple tools have the same name.',\n },\n args: {\n type: 'object',\n description:\n \"Arguments matching the tool's inputSchema. Omit or pass {} if the tool takes no parameters.\",\n additionalProperties: true,\n },\n },\n required: ['toolName'],\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Meta-tool Executors\n// ---------------------------------------------------------------------------\n\n/**\n * Callback for executing a real MCP tool via the correct client.\n * Provided by adapters that wire up client routing.\n */\nexport type CallToolFn = (\n toolName: string,\n args: Record<string, unknown>,\n namespace?: string\n) => Promise<any>;\n\n/**\n * Execute a meta-tool call and return the result in MCP CallToolResult format.\n *\n * @param toolName - One of the meta-tool names (mcp_search_tools, mcp_list_servers, mcp_search_tool_regex, etc.)\n * @param args - The arguments from the LLM's tool call\n * @param router - The ToolRouter to query\n * @param callToolFn - Optional callback for executing real tools (required for mcp_execute_tool)\n * @returns MCP-compatible CallToolResult, or null if this isn't a meta-tool\n */\nexport async function executeMetaTool(\n toolName: string,\n args: Record<string, unknown>,\n router: ToolRouter,\n callToolFn?: CallToolFn\n): Promise<CallToolResult | null> {\n const resolveToolSchema = async (\n name: string,\n namespace?: string,\n options?: ToolLookupOptions\n ): Promise<{ tool?: IndexedTool; error?: CallToolResult }> => {\n try {\n if (typeof (router as ToolRouter & { resolveToolSchema?: unknown }).resolveToolSchema === 'function') {\n return {\n tool: await (router as ToolRouter & {\n resolveToolSchema: (\n toolName: string,\n namespace?: string,\n options?: ToolLookupOptions\n ) => Promise<IndexedTool | undefined>;\n }).resolveToolSchema(name, namespace, options),\n };\n }\n return { tool: router.getToolSchema(name, namespace, options) };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n error: {\n content: [{ type: 'text', text: errorMessage }],\n isError: true,\n },\n };\n }\n };\n\n switch (toolName) {\n case 'mcp_search_tools': {\n const query = String(args.query ?? '');\n const operation = String(args.operation ?? 'search');\n const serverId = String(args.serverId ?? '') || undefined;\n const serverName = String(args.serverName ?? '') || undefined;\n\n if (operation === 'list') {\n const limit = Math.min(Number(args.limit) || 20, 100);\n const cursor = String(args.cursor ?? '') || undefined;\n const result = await router.listTools({\n serverId,\n serverName: serverName ?? (!serverId && query ? query : undefined),\n limit,\n cursor,\n });\n\n const serverText = result.servers.length > 0\n ? result.servers\n .map((server) => `${server.serverName} (serverId: ${server.serverId}, tools: ${server.toolCount})`)\n .join(', ')\n : 'none';\n\n const lines: string[] = [\n 'operation: list',\n `servers: ${serverText}`,\n `totalCount: ${result.totalCount}`,\n `returnedCount: ${result.returnedCount}`,\n `nextCursor: ${result.nextCursor ?? 'null'}`,\n '',\n ];\n\n if (result.tools.length > 0) {\n lines.push(...formatToolSummaries(result.tools));\n } else {\n lines.push(\n serverId || serverName\n ? 'No tools found for the requested server scope.'\n : 'No tools found. Try operation \"search\" or provide serverId/serverName.'\n );\n }\n\n return {\n content: [{ type: 'text', text: lines.join('\\n') }],\n isError: false,\n };\n }\n\n const limit = Math.min(Number(args.limit) || 5, 20);\n const searchOptions = { serverId, serverName };\n\n // Fast path: Check for select: prefix\n const selectMatch = query.match(/^select:(.+)$/i);\n if (selectMatch) {\n const requested = selectMatch[1]!\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n\n const found: any[] = [];\n const errors: string[] = [];\n \n const namespace = serverId ?? serverName;\n\n for (const requestedToolName of requested) {\n const { tool, error } = await resolveToolSchema(requestedToolName, namespace, {\n allowServerNameFragment: Boolean(serverName && !serverId),\n });\n if (error) {\n const errorMsg = error.content[0]?.type === 'text' ? error.content[0].text : 'Unknown error';\n errors.push(`- **${requestedToolName}**: ${errorMsg}`);\n } else if (tool) {\n found.push(tool);\n } else {\n errors.push(`- **${requestedToolName}**: Tool not found. Try searching with mcp_search_tools.`);\n }\n }\n\n const lines: string[] = [];\n\n if (found.length > 0) {\n lines.push(...found.map((t, i) =>\n `${i + 1}. **${t.name}** (serverName: ${t.serverName}, serverId: ${t.serverId})\\n ${t.description}`\n ));\n }\n \n if (errors.length > 0) {\n if (lines.length > 0) lines.push(\"\"); // Add empty line spacing\n lines.push(\"Errors resolving some tools:\");\n lines.push(...errors);\n }\n\n const text = lines.length > 0 \n ? lines.join('\\n') \n : `No tools found matching select query: ${requested.join(', ')}`;\n\n return {\n content: [{ type: 'text', text }],\n isError: found.length === 0,\n };\n }\n\n const results = await router.searchTools(query, limit, searchOptions);\n\n const text = results.length === 0\n ? 'No tools found matching your query. Call mcp_list_servers to inspect connected servers, then retry mcp_search_tools with serverId or serverName.'\n : formatToolSummaries(results).join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_list_servers': {\n const query = String(args.query ?? '').trim();\n const servers = await router.listServers({\n serverName: query || undefined,\n });\n\n const text = servers.length === 0\n ? 'No connected servers found.'\n : servers\n .map(\n (server, i) =>\n `${i + 1}. **${server.serverName}** (serverId: ${server.serverId})\\n` +\n ` Tool count: ${server.toolCount}`\n )\n .join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_search_tool_regex': {\n const pattern = String(args.query ?? '');\n const limit = Math.min(Number(args.limit) || 5, 20);\n\n const results = await router.searchToolsRegex(pattern, limit);\n\n const text = results.length === 0\n ? 'No tools matched your regex pattern. Try a broader pattern.'\n : formatToolSummaries(results).join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_get_tool_schema': {\n const name = String(args.toolName ?? '');\n const namespace = String(args.serverId ?? '') || undefined;\n const { tool, error } = await resolveToolSchema(name, namespace);\n\n if (error) {\n return error;\n }\n\n if (!tool) {\n return {\n content: [\n {\n type: 'text',\n text: `Tool \"${name}\" not found. Use mcp_search_tools to find available tools first.`,\n },\n ],\n isError: true,\n };\n }\n\n const schema = {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n executionInstructions: {\n nextTool: 'mcp_execute_tool',\n toolName: tool.name,\n serverId: tool.serverId,\n note:\n 'Do not call this discovered tool directly unless it was explicitly registered as a runtime tool. Execute it via mcp_execute_tool and pass these parameters inside args.',\n },\n };\n\n return {\n content: [{ type: 'text', text: JSON.stringify(schema, null, 2) }],\n isError: false,\n };\n }\n\n case 'mcp_execute_tool': {\n const targetToolName = String(args.toolName ?? '');\n const namespace = String(args.serverId ?? '') || undefined;\n const toolArgs = (args.args as Record<string, unknown>) ?? {};\n\n if (!targetToolName) {\n return {\n content: [{ type: 'text', text: 'Missing required parameter \"toolName\". Specify which tool to execute.' }],\n isError: true,\n };\n }\n\n // Verify the tool exists in our index\n const { tool, error } = await resolveToolSchema(targetToolName, namespace);\n if (error) {\n return error;\n }\n\n if (!tool) {\n return {\n content: [\n {\n type: 'text',\n text: `Tool \"${targetToolName}\" not found. Use mcp_search_tools to discover available tools first.`,\n },\n ],\n isError: true,\n };\n }\n\n if (!callToolFn) {\n return {\n content: [{ type: 'text', text: 'Tool execution is not available. No callToolFn was configured.' }],\n isError: true,\n };\n }\n\n try {\n const result = await callToolFn(targetToolName, toolArgs, namespace);\n\n // Normalize result to text\n if (result && typeof result === 'object' && 'content' in result) {\n // Already MCP CallToolResult format\n return result as CallToolResult;\n }\n\n const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: 'text', text: `Tool execution failed: ${errorMessage}` }],\n isError: true,\n };\n }\n }\n\n default:\n return null;\n }\n}\n\nfunction formatToolSummaries(\n tools: Array<{\n name: string;\n description: string;\n serverName: string;\n serverId: string;\n }>\n): string[] {\n return tools.map(\n (t, i) =>\n `${i + 1}. **${t.name}** (serverName: ${t.serverName}, serverId: ${t.serverId})\\n` +\n ` ${t.description}`\n );\n}\n\n/** Check if a tool name is one of the meta-tools. */\nexport function isMetaTool(toolName: string): boolean {\n return (\n toolName === 'mcp_search_tools' ||\n toolName === 'mcp_list_servers' ||\n toolName === 'mcp_search_tool_regex' ||\n toolName === 'mcp_get_tool_schema' ||\n toolName === 'mcp_execute_tool'\n );\n}\n\n/**\n * Unwraps a meta-tool proxy call (like mcp_execute_tool) to find the real target tool name and arguments.\n * Also automatically strips routing prefixes like tool_{serverId}_.\n * \n * Useful for frontend components that need to determine the actual tool being executed by an AI agent.\n */\nexport function resolveMetaToolProxy(\n toolName: string,\n args: Record<string, unknown> | null | undefined\n): { toolName: string; args: Record<string, unknown> } {\n // Unwrap mcp_execute_tool proxy arguments\n if (toolName === 'mcp_execute_tool') {\n const innerName = args?.toolName;\n const innerArgs = args?.args;\n return {\n toolName: typeof innerName === 'string' && innerName ? innerName : toolName,\n args: innerArgs && typeof innerArgs === 'object' && !Array.isArray(innerArgs)\n ? (innerArgs as Record<string, unknown>)\n : {},\n };\n }\n\n // Strip tool_<serverId>_ prefix used by AIAdapter\n const match = toolName.match(/(?:tool_[^_]+_)?(.+)$/);\n const resolvedName = match?.[1] ?? toolName;\n\n return { toolName: resolvedName, args: args ?? {} };\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/server/storage/redis.ts","../src/index.ts","../src/server/index.ts","../src/server/mcp/oauth-client.ts","../src/server/mcp/storage-oauth-provider.ts","../src/server/storage/index.ts","../src/server/storage/redis-backend.ts","../src/shared/utils.ts","../src/server/storage/session-lifecycle.ts","../src/shared/constants.ts","../src/server/storage/memory-backend.ts","../src/server/storage/file-backend.ts","../src/server/storage/sqlite-backend.ts","../src/server/storage/supabase-backend.ts","../src/server/storage/crypto.ts","../src/server/storage/neon-backend.ts","../src/server/storage/types.ts","../src/shared/events.ts","../src/shared/errors.ts","../src/server/mcp/multi-session-client.ts","../src/server/handlers/sse-handler.ts","../src/shared/event-routing.ts","../src/server/handlers/nextjs-handler.ts","../src/client/index.ts","../src/client/core/sse-client.ts","../src/client/core/app-host.ts","../src/client/utils/app-host-utils.ts","../src/client/core/constants.ts","../src/shared/index.ts","../src/shared/types.ts","../src/shared/tool-utils.ts","../src/shared/tool-router.ts","../src/shared/tool-index.ts","../src/shared/schema-compressor.ts","../src/shared/meta-tools.ts"],"names":["customAlphabet","redis","sessions","path","fs","path2","fs2","randomBytes","createCipheriv","createDecipheriv","getRedis","nanoid","SSEClientTransport","StreamableHTTPClientTransport","Client","SDKUnauthorizedError","ListToolsResultSchema","CallToolResultSchema","ListPromptsResultSchema","GetPromptResultSchema","ListResourcesResultSchema","ReadResourceResultSchema","manager","data","AppBridge","PostMessageTransport","b","limit","text"],"mappings":"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","file":"index.js","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\n * Redis connection management with dependency injection support\n * Allows configuration and testing without environment variables\n */\nimport type { Redis } from 'ioredis';\n\nexport interface RedisConfig {\n /**\n * Redis connection URL (defaults to REDIS_URL env var)\n */\n url?: string;\n\n /**\n * Enable lazy connection (default: true)\n */\n lazyConnect?: boolean;\n\n /**\n * Maximum retries per request (default: 1)\n */\n maxRetriesPerRequest?: number;\n\n /**\n * Enable verbose logging (default: false)\n */\n verbose?: boolean;\n /**\n * @internal For testing only - bypass ioredis import\n */\n RedisConstructor?: any;\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __redis: Redis | undefined;\n var __redisConfig: RedisConfig | undefined;\n}\n\nlet redisInstance: Redis | null = null;\n\n/**\n * Initialize Redis with custom configuration\n * Call this before any Redis operations if you need custom config\n * @param config - Redis configuration options\n */\nexport async function initRedis(config: RedisConfig): Promise<Redis> {\n if (redisInstance) {\n // Already initialized, return existing instance\n return redisInstance;\n }\n\n const url = config.url ?? process.env.REDIS_URL;\n\n if (!url) {\n throw new Error(\n 'Redis URL is required. Set REDIS_URL environment variable or pass url in config.'\n );\n }\n\n let Redis: typeof import('ioredis').Redis;\n if (config.RedisConstructor) {\n Redis = config.RedisConstructor;\n } else {\n try {\n const ioredis = await import('ioredis');\n Redis = ioredis.Redis;\n } catch (error) {\n throw new Error(\n 'ioredis is not installed. Install it with:\\n' +\n ' npm install ioredis\\n\\n' +\n 'Or use a different storage backend:\\n' +\n ' MCP_TS_STORAGE_TYPE=memory (for development)\\n' +\n ' MCP_TS_STORAGE_TYPE=file (for local persistence)'\n );\n }\n }\n\n redisInstance = new Redis(url, {\n lazyConnect: config.lazyConnect ?? true,\n maxRetriesPerRequest: config.maxRetriesPerRequest ?? 1,\n });\n\n if (config.verbose !== false) {\n redisInstance.on('ready', () => {\n console.log('✅ Redis connected');\n });\n\n redisInstance.on('error', (err) => {\n console.error('❌ Redis error:', err.message);\n });\n\n redisInstance.on('reconnecting', () => {\n console.log('🔄 Redis reconnecting...');\n });\n }\n\n // Store globally for hot reloading scenarios\n global.__redis = redisInstance;\n global.__redisConfig = config;\n\n return redisInstance;\n}\n\n/**\n * Get the Redis instance\n * Automatically initializes with default config if not already initialized\n */\nexport async function getRedis(): Promise<Redis> {\n if (redisInstance) {\n return redisInstance;\n }\n\n // Check for existing global instance (hot reload scenario)\n if (global.__redis) {\n redisInstance = global.__redis;\n return redisInstance;\n }\n\n // Initialize with default config\n return await initRedis({});\n}\n\n/**\n * Set a custom Redis instance (useful for testing with mocks)\n * @param instance - Redis instance or mock\n */\nexport function setRedisInstance(instance: Redis): void {\n redisInstance = instance;\n global.__redis = instance;\n}\n\n/**\n * Close Redis connection and clear instance\n */\nexport async function closeRedis(): Promise<void> {\n if (redisInstance) {\n await redisInstance.quit();\n redisInstance = null;\n global.__redis = undefined;\n }\n}\n\n/**\n * Default Redis export for backward compatibility\n * Will auto-initialize on first access\n * Note: This is a lazy proxy that initializes Redis on first method call\n */\nexport const redis = new Proxy({} as Redis, {\n get(_target, prop) {\n // Return a function that handles async initialization\n return async (...args: any[]) => {\n const instance = await getRedis();\n const value = (instance as any)[prop];\n if (typeof value === 'function') {\n return value.apply(instance, args);\n }\n return value;\n };\n },\n});\n","/**\n * MCP Redis\n * Redis-backed MCP client with OAuth 2.1 and real-time SSE connections\n *\n * @packageDocumentation\n */\n\n// Re-export everything from subpackages\nexport * from './server';\nexport * from './client';\nexport * from './shared';\n","/**\n * MCP Redis Server Package\n * Node.js server-side exports for MCP connection management with Redis\n */\n\n/** Core MCP client and session management */\nexport { MCPClient } from './mcp/oauth-client.js';\nexport { UnauthorizedError } from '../shared/errors.js';\nexport { sessions, onSessionMutation, type SessionStore } from './storage/index.js';\nexport { StorageOAuthClientProvider } from './mcp/storage-oauth-provider.js';\nexport { MultiSessionClient } from './mcp/multi-session-client.js';\n\n/** SSE handler for real-time connections */\nexport { createSSEHandler, SSEConnectionManager, type SSEHandlerOptions, type ClientMetadata } from './handlers/sse-handler.js';\n\n/** Next.js App Router handler (recommended for Next.js 13+) */\nexport { createNextMcpHandler, type NextMcpHandlerOptions } from './handlers/nextjs-handler.js';\n\n/** Session provider abstraction */\n\n/** Utilities */\nexport { sanitizeServerLabel } from '../shared/utils';\n\n/** Re-export shared types */\nexport type {\n McpConnectionEvent,\n McpConnectionState,\n McpObservabilityEvent,\n Emitter,\n Disposable,\n Event,\n} from '../shared/events';\n\nexport type {\n ToolClient,\n ToolClientProvider,\n ToolInfo,\n McpRpcRequest,\n McpRpcResponse,\n ConnectRequest,\n ConnectResponse,\n ListToolsResponse,\n CallToolRequest,\n CallToolResponse,\n} from '../shared/types';\n\nexport type {\n Session,\n SessionMutationEvent,\n SessionMutationListener,\n SessionMutationType,\n} from './storage/types.js';\n\n/** Re-export MCP SDK types for convenience */\nexport type {\n OAuthClientMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nexport type {\n ListToolsResult,\n CallToolResult,\n Tool,\n} from '@modelcontextprotocol/sdk/types.js';\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { nanoid } from 'nanoid';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport {\n UnauthorizedError as SDKUnauthorizedError,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport {\n ListToolsRequest,\n ListToolsResult,\n ListToolsResultSchema,\n CallToolRequest,\n CallToolResult,\n CallToolResultSchema,\n ListPromptsRequest,\n ListPromptsResult,\n ListPromptsResultSchema,\n GetPromptRequest,\n GetPromptResult,\n GetPromptResultSchema,\n ListResourcesRequest,\n ListResourcesResult,\n ListResourcesResultSchema,\n ReadResourceRequest,\n ReadResourceResult,\n ReadResourceResultSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { StorageOAuthClientProvider, type AgentsOAuthProvider } from './storage-oauth-provider.js';\nimport { Emitter, type McpConnectionEvent, type McpObservabilityEvent, type McpConnectionState } from '../../shared/events.js';\nimport { UnauthorizedError } from '../../shared/errors.js';\nimport { sessions } from '../storage/index.js';\nimport type { Session, SessionStatus } from '../storage/types.js';\nimport {\n MCP_CLIENT_NAME,\n MCP_CLIENT_VERSION,\n} from '../../shared/constants.js';\n\n/**\n * Supported MCP transport types\n */\nexport type TransportType = 'sse' | 'streamable-http';\n\n/**\n * Extended capabilities including MCP App support\n */\nimport type { ClientCapabilities } from '@modelcontextprotocol/sdk/types.js';\n\ninterface McpAppClientCapabilities extends Omit<ClientCapabilities, 'extensions'> {\n extensions?: {\n 'io.modelcontextprotocol/ui'?: {\n mimeTypes: string[];\n };\n [key: string]: any;\n };\n}\n\nexport interface MCPOAuthClientOptions {\n serverUrl?: string;\n serverName?: string;\n callbackUrl?: string;\n onRedirect?: (url: string) => void;\n userId: string;\n serverId?: string; /** Optional - loaded from session if not provided */\n sessionId: string; /** Required - primary key for session lookup */\n transportType?: TransportType;\n clientId?: string;\n clientSecret?: string;\n headers?: Record<string, string>;\n /** OAuth Client Metadata (optional - user application info) */\n clientName?: string;\n clientUri?: string;\n logoUri?: string;\n policyUri?: string;\n}\n\n/**\n * MCP Client with OAuth 2.1 authentication support\n * Manages connections to MCP servers with automatic token refresh and session restoration\n * Emits connection lifecycle events for observability\n */\nexport class MCPClient {\n private client: Client | null = null;\n public oauthProvider: AgentsOAuthProvider | null = null;\n private transport: StreamableHTTPClientTransport | SSEClientTransport | null = null;\n private userId: string;\n private serverId?: string;\n private sessionId: string;\n private serverName?: string;\n private transportType: TransportType | undefined;\n private serverUrl: string | undefined;\n private callbackUrl: string | undefined;\n private onRedirect: ((url: string) => void) | undefined;\n private clientId?: string;\n private clientSecret?: string;\n private headers?: Record<string, string>;\n /** OAuth Client Metadata */\n private clientName?: string;\n private clientUri?: string;\n private logoUri?: string;\n private policyUri?: string;\n private createdAt?: number;\n\n\n /** Event emitters for connection lifecycle */\n private readonly _onConnectionEvent = new Emitter<McpConnectionEvent>();\n public readonly onConnectionEvent = this._onConnectionEvent.event;\n\n private readonly _onObservabilityEvent = new Emitter<McpObservabilityEvent>();\n public readonly onObservabilityEvent = this._onObservabilityEvent.event;\n\n private currentState: McpConnectionState = 'DISCONNECTED';\n\n /**\n * Creates a new MCP client instance\n * Can be initialized with minimal options (userId + sessionId) for session restoration\n * @param options - Client configuration options\n */\n constructor(options: MCPOAuthClientOptions) {\n this.serverUrl = options.serverUrl;\n this.serverName = options.serverName;\n this.callbackUrl = options.callbackUrl;\n this.onRedirect = options.onRedirect;\n this.userId = options.userId;\n this.serverId = options.serverId;\n this.sessionId = options.sessionId;\n this.transportType = options.transportType;\n this.clientId = options.clientId;\n this.clientSecret = options.clientSecret;\n this.headers = options.headers;\n this.clientName = options.clientName;\n this.clientUri = options.clientUri;\n this.logoUri = options.logoUri;\n this.policyUri = options.policyUri;\n }\n\n /**\n * Emit a connection state change event\n * @private\n */\n private emitStateChange(newState: McpConnectionState): void {\n const previousState = this.currentState;\n this.currentState = newState;\n\n if (!this.serverId) return;\n\n this._onConnectionEvent.fire({\n type: 'state_changed',\n sessionId: this.sessionId,\n serverId: this.serverId,\n serverName: this.serverName || this.serverId,\n serverUrl: this.serverUrl || '',\n createdAt: this.createdAt,\n state: newState,\n previousState,\n timestamp: Date.now(),\n });\n\n this._onObservabilityEvent.fire({\n type: 'mcp:client:state_change',\n level: 'info',\n message: `Connection state: ${previousState} → ${newState}`,\n displayMessage: `State changed to ${newState}`,\n sessionId: this.sessionId,\n serverId: this.serverId,\n payload: { previousState, newState },\n timestamp: Date.now(),\n id: nanoid(),\n });\n }\n\n /**\n * Emit an error event\n * @private\n */\n private emitError(error: string, errorType: 'connection' | 'auth' | 'validation' | 'unknown' = 'unknown'): void {\n if (!this.serverId) return;\n\n this._onConnectionEvent.fire({\n type: 'error',\n sessionId: this.sessionId,\n serverId: this.serverId,\n error,\n errorType,\n timestamp: Date.now(),\n });\n\n this._onObservabilityEvent.fire({\n type: 'mcp:client:error',\n level: 'error',\n message: error,\n displayMessage: error,\n sessionId: this.sessionId,\n serverId: this.serverId,\n payload: { errorType, error },\n timestamp: Date.now(),\n id: nanoid(),\n });\n }\n\n /**\n * Emit a progress event\n * @private\n */\n private emitProgress(message: string): void {\n if (!this.serverId) return;\n\n this._onConnectionEvent.fire({\n type: 'progress',\n sessionId: this.sessionId,\n serverId: this.serverId,\n message,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Get current connection state\n */\n getConnectionState(): McpConnectionState {\n return this.currentState;\n }\n\n /**\n * Helper to create a transport instance\n * @param type - The transport type to create\n * @returns Configured transport instance\n * @private\n */\n private getTransport(type: TransportType): StreamableHTTPClientTransport | SSEClientTransport {\n if (!this.serverUrl) {\n throw new Error('Server URL is required to create transport');\n }\n\n const baseUrl = new URL(this.serverUrl);\n const hasAuthorizationHeader = Object.keys(this.headers || {})\n .some((key) => key.toLowerCase() === 'authorization');\n const transportOptions = {\n ...(!hasAuthorizationHeader && { authProvider: this.oauthProvider! }),\n ...(this.headers && { requestInit: { headers: this.headers } }),\n /**\n * Custom fetch implementation to handle connection timeouts.\n * Observation: SDK 1.24.0+ connections may hang indefinitely in some environments.\n * This wrapper enforces a timeout and properly uses AbortController to unblock the request.\n */\n fetch: async (url: RequestInfo | URL, init?: RequestInit) => {\n const timeout = 30000;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n const signal = init?.signal ?\n // @ts-ignore: AbortSignal.any is available in Node 20+\n (AbortSignal.any ? AbortSignal.any([init.signal, controller.signal]) : controller.signal) :\n controller.signal;\n\n try {\n const response = await fetch(url, { ...init, signal });\n \n const hasSessionHeader = init?.headers && new Headers(init.headers as HeadersInit).has('mcp-session-id');\n\n if (response.status === 404 && hasSessionHeader) {\n throw new Error(\"MCP_SESSION_EXPIRED: Downstream session was not found on the server.\");\n }\n\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n };\n\n if (type === 'sse') {\n return new SSEClientTransport(baseUrl, transportOptions);\n } else {\n return new StreamableHTTPClientTransport(baseUrl, transportOptions);\n }\n }\n\n /**\n * Initializes client components (client, transport, OAuth provider)\n * Loads missing configuration from Redis session store if needed\n * This method is idempotent and safe to call multiple times\n * @private\n */\n private async initialize(): Promise<void> {\n if (this.client && this.oauthProvider) {\n return;\n }\n\n this.emitStateChange('INITIALIZING');\n this.emitProgress('Loading session configuration...');\n\n let existingSession: Session | null = null;\n\n if (!this.serverUrl || !this.callbackUrl || !this.serverId) {\n existingSession = await sessions.get(this.userId, this.sessionId);\n if (!existingSession) {\n throw new Error(`Session not found: ${this.sessionId}`);\n }\n\n this.serverUrl = this.serverUrl || existingSession.serverUrl;\n this.callbackUrl = this.callbackUrl || existingSession.callbackUrl;\n /**\n * Do NOT load transportType from session if not explicitly provided.\n * We want to re-negotiate (try streamable -> sse) on new connections if in \"Auto\" mode.\n * this.transportType = this.transportType || sessionData.transportType; \n */\n this.serverName = this.serverName || existingSession.serverName;\n this.serverId = this.serverId || existingSession.serverId || 'unknown';\n this.headers = this.headers || existingSession.headers;\n this.createdAt = existingSession.createdAt;\n }\n\n if (!this.serverUrl || !this.callbackUrl || !this.serverId) {\n throw new Error('Missing required connection metadata');\n }\n\n if (!this.oauthProvider) {\n if (!this.serverId) {\n throw new Error('serverId required for OAuth provider initialization');\n }\n this.oauthProvider = new StorageOAuthClientProvider({\n userId: this.userId,\n serverId: this.serverId,\n sessionId: this.sessionId,\n redirectUrl: this.callbackUrl!,\n clientName: this.clientName,\n clientUri: this.clientUri,\n logoUri: this.logoUri,\n policyUri: this.policyUri,\n clientId: this.clientId,\n clientSecret: this.clientSecret,\n onRedirect: (redirectUrl: string) => {\n if (this.onRedirect) {\n this.onRedirect(redirectUrl);\n }\n }\n });\n }\n\n if (!this.client) {\n this.client = new Client(\n {\n name: MCP_CLIENT_NAME,\n version: MCP_CLIENT_VERSION,\n },\n {\n capabilities: {\n extensions: {\n 'io.modelcontextprotocol/ui': {\n mimeTypes: ['text/html+mcp'],\n },\n },\n } as McpAppClientCapabilities\n }\n );\n }\n\n // Create session in the session store if it doesn't exist yet\n // This is needed BEFORE OAuth flow starts because the OAuth provider\n // will call saveCodeVerifier() which requires the session to exist\n if (existingSession === null) {\n existingSession = await sessions.get(this.userId, this.sessionId);\n }\n if (!existingSession && this.serverId && this.serverUrl && this.callbackUrl) {\n this.createdAt = Date.now();\n const updatedAt = this.createdAt;\n console.log(`[MCPClient] Creating pending session ${this.sessionId} for connection setup`);\n await sessions.create({\n sessionId: this.sessionId,\n userId: this.userId,\n serverId: this.serverId,\n serverName: this.serverName,\n serverUrl: this.serverUrl,\n callbackUrl: this.callbackUrl,\n transportType: this.transportType || 'streamable-http',\n headers: this.headers,\n createdAt: this.createdAt,\n updatedAt,\n status: 'pending',\n });\n }\n }\n\n /**\n * Saves current session state to the session store\n * Creates new session if it doesn't exist, updates if it does\n * @param status - Session lifecycle status used by storage cleanup\n * @private\n */\n private async saveSession(\n status: SessionStatus = 'active',\n existingSession?: Session | null\n ): Promise<void> {\n if (!this.sessionId || !this.serverId || !this.serverUrl || !this.callbackUrl) {\n return;\n }\n\n const sessionData = {\n sessionId: this.sessionId,\n userId: this.userId,\n serverId: this.serverId,\n serverName: this.serverName,\n serverUrl: this.serverUrl,\n callbackUrl: this.callbackUrl,\n transportType: (this.transportType || 'streamable-http') as TransportType,\n headers: this.headers,\n createdAt: this.createdAt || Date.now(),\n updatedAt: Date.now(),\n status,\n };\n if (status === 'active') {\n (sessionData as typeof sessionData & { authUrl: null }).authUrl = null;\n }\n\n // Try to update first, create if doesn't exist\n if (existingSession === undefined) {\n existingSession = await sessions.get(this.userId, this.sessionId);\n }\n if (existingSession) {\n await sessions.update(this.userId, this.sessionId, sessionData);\n } else {\n await sessions.create(sessionData);\n }\n }\n\n /**\n * Removes transient setup/auth sessions without masking the original error.\n * @private\n */\n private async deleteTransientSession(): Promise<void> {\n try {\n await sessions.delete(this.userId, this.sessionId);\n } catch {\n // Best effort only: preserve the original connection/auth error.\n }\n }\n\n /**\n * Try to connect using available transports\n * @returns The corrected transport type object if successful\n * @private\n */\n private async tryConnect(): Promise<{ transportType: TransportType }> {\n /**\n * If exact transport type is known, only try that.\n * Otherwise (auto mode), try streamable_http first, then sse.\n */\n const transportsToTry: TransportType[] = this.transportType\n ? [this.transportType]\n : ['streamable-http', 'sse'];\n\n let lastError: unknown;\n\n for (const currentType of transportsToTry) {\n const isLastAttempt = currentType === transportsToTry[transportsToTry.length - 1];\n\n try {\n const transport = this.getTransport(currentType);\n\n /** Update local state with the transport we are about to try */\n this.transport = transport;\n\n /** Race connection against timeout */\n await this.client!.connect(transport);\n\n /** Success! Return the type that worked */\n return { transportType: currentType };\n\n } catch (error: any) {\n lastError = error;\n\n /** Check for Auth Errors - these should fail immediately, no fallback */\n const isAuthError = error instanceof SDKUnauthorizedError ||\n (error instanceof Error && error.message.toLowerCase().includes('unauthorized'));\n\n if (isAuthError) {\n throw error;\n }\n\n /** If this was the last transport to try, throw the error */\n if (isLastAttempt) {\n throw error;\n }\n\n /** Otherwise, log and continue to next transport */\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.emitProgress(`Connection attempt with ${currentType} failed: ${errorMessage}. Retrying...`);\n this._onObservabilityEvent.fire({\n level: 'warn',\n message: `Transport ${currentType} failed, falling back`,\n sessionId: this.sessionId,\n serverId: this.serverId,\n metadata: {\n failedTransport: currentType,\n error: errorMessage\n },\n timestamp: Date.now(),\n });\n }\n }\n\n throw lastError || new Error('No transports available');\n }\n\n /**\n * Connects to the MCP server\n * Automatically validates and refreshes OAuth tokens if needed\n * Saves session to Redis on first successful connection\n * @throws {UnauthorizedError} When OAuth authorization is required\n * @throws {Error} When connection fails for other reasons\n */\n async connect(): Promise<void> {\n // Re-entry guard: if a previous SDK Client is still attached to a transport\n // (e.g. a stale session from a prior connect() call on the same MCPClient\n // instance), close and detach it before proceeding. The MCP SDK client will\n // throw if asked to connect while a transport is already attached, and the\n // stale transport would send an expired mcp-session-id to the remote server\n // causing \"Session not found. Reconnect without session header.\" errors.\n //\n // We also null out this.client so that initialize() creates a fresh Client\n // instance with a clean transport slot, rather than reusing the old one.\n // The oauthProvider is intentionally preserved — OAuth tokens remain valid\n // across reconnects; only the transport session needs to be renegotiated.\n if (this.client?.transport) {\n this.transport = null;\n try {\n await this.client.close();\n } catch {\n // Closing a transport that may have already failed is best-effort.\n }\n this.client = null;\n }\n\n await this.initialize();\n\n if (!this.client || !this.oauthProvider) {\n const error = 'Client or OAuth provider not initialized';\n this.emitError(error, 'connection');\n this.emitStateChange('FAILED');\n throw new Error(error);\n }\n\n try {\n this.emitStateChange('CONNECTING');\n\n /** Use the tryConnect loop to handle transport fallbacks */\n const { transportType } = await this.tryConnect();\n\n /** Update transport type to the one that actually worked */\n this.transportType = transportType;\n\n this.emitStateChange('CONNECTED');\n this.emitProgress('Connected successfully');\n\n // Refresh session metadata on every successful connect so active sessions\n // record ongoing usage and don't look dormant to session cleanup jobs.\n console.log(`[MCPClient] Saving active session ${this.sessionId} (connect success)`);\n await this.saveSession('active');\n } catch (error) {\n /** Handle Authentication Errors */\n if (\n error instanceof SDKUnauthorizedError ||\n (error instanceof Error && error.message.toLowerCase().includes('unauthorized'))\n ) {\n /** Set when the SDK calls redirectToAuthorization on the OAuth provider */\n let authUrl = '';\n if (this.oauthProvider) {\n authUrl = (this.oauthProvider.authUrl || '').trim();\n }\n\n /**\n * 401 without a usable URL means metadata/DCR failed or the server never started\n * an interactive OAuth flow — not recoverable as \"pending OAuth\".\n */\n if (!authUrl) {\n const detail =\n error instanceof Error && error.message.trim().length > 0\n ? error.message.trim()\n : 'Unauthorized';\n const message =\n detail.toLowerCase() === 'unauthorized'\n ? 'OAuth authorization URL not available'\n : `OAuth authorization URL not available: ${detail}`;\n this.emitError(message, 'auth');\n this.emitStateChange('FAILED');\n \n // Remove terminal setup failures immediately. Active sessions are not\n // deleted here because this branch only runs before OAuth is available.\n await this.deleteTransientSession();\n \n throw new Error(message);\n }\n\n this.emitStateChange('AUTHENTICATING');\n console.log(`[MCPClient] Saving pending OAuth session ${this.sessionId}`);\n await this.saveSession('pending');\n\n if (this.serverId) {\n this._onConnectionEvent.fire({\n type: 'auth_required',\n sessionId: this.sessionId,\n serverId: this.serverId,\n authUrl,\n timestamp: Date.now(),\n });\n\n if (authUrl && this.onRedirect) {\n this.onRedirect(authUrl);\n }\n }\n\n throw new UnauthorizedError('OAuth authorization required');\n }\n\n /** Handle Generic Errors */\n const errorMessage = error instanceof Error ? error.message : 'Connection failed';\n this.emitError(errorMessage, 'connection');\n this.emitStateChange('FAILED');\n\n // Remove transient sessions that failed before becoming restorable.\n // Existing active sessions may still hold usable credentials for reconnect.\n try {\n const existingSession = await sessions.get(this.userId, this.sessionId);\n if (!existingSession || existingSession.status !== 'active') {\n await sessions.delete(this.userId, this.sessionId);\n }\n } catch {\n // Best effort only: preserve the original connection error.\n }\n\n throw error;\n }\n }\n\n /**\n * Completes OAuth authorization flow by exchanging authorization code for tokens\n * Creates new authenticated client and transport, then establishes connection\n * Saves active session to Redis after successful authentication\n * @param authCode - Authorization code received from OAuth callback\n */\n\n // TODO: needs to be optimized\n async finishAuth(authCode: string, state?: string): Promise<void> {\n this.emitStateChange('AUTHENTICATING');\n this.emitProgress('Exchanging authorization code for tokens...');\n\n await this.initialize();\n\n if (!this.oauthProvider) {\n const error = 'OAuth provider not initialized';\n this.emitError(error, 'auth');\n this.emitStateChange('FAILED');\n throw new Error(error);\n }\n\n if (state) {\n const stateCheck = await this.oauthProvider.checkState(state);\n if (!stateCheck.valid) {\n const error = stateCheck.error || 'Invalid OAuth state';\n this.emitError(error, 'auth');\n this.emitStateChange('FAILED');\n throw new Error(error);\n }\n\n await this.oauthProvider.consumeState(state);\n }\n\n /**\n * Determine which transports to try for finishing auth\n * If transportType is set, use only that. Otherwise try streamable_http then sse.\n */\n const transportsToTry: TransportType[] = this.transportType\n ? [this.transportType]\n : ['streamable-http', 'sse'];\n\n let lastError: unknown;\n let tokensExchanged = false;\n let authenticatedStateEmitted = false;\n\n for (const currentType of transportsToTry) {\n const isLastAttempt = currentType === transportsToTry[transportsToTry.length - 1];\n\n try {\n const transport = this.getTransport(currentType);\n\n /** Update local state with the transport we are about to try */\n this.transport = transport;\n\n if (!tokensExchanged) {\n await transport.finishAuth(authCode);\n tokensExchanged = true;\n } else {\n this.emitProgress(`Tokens already exchanged, skipping auth step for ${currentType}...`);\n }\n\n if (!authenticatedStateEmitted) {\n this.emitStateChange('AUTHENTICATED');\n authenticatedStateEmitted = true;\n }\n\n this.emitProgress('Creating authenticated client...');\n\n this.client = new Client(\n {\n name: MCP_CLIENT_NAME,\n version: MCP_CLIENT_VERSION,\n },\n {\n capabilities: {\n extensions: {\n 'io.modelcontextprotocol/ui': {\n mimeTypes: ['text/html+mcp'],\n },\n },\n } as McpAppClientCapabilities\n }\n );\n\n this.emitStateChange('CONNECTING');\n\n /** We explicitly try to connect with the transport we just auth'd with first */\n await this.client.connect(this.transport);\n\n /** Connection succeeded — lock in the transport type */\n this.transportType = currentType;\n\n this.emitStateChange('CONNECTED');\n console.log(`[MCPClient] Saving active session ${this.sessionId} (OAuth complete)`);\n await this.saveSession('active');\n\n return; // Success, exit function\n\n } catch (error) {\n lastError = error;\n\n const isAuthError = error instanceof SDKUnauthorizedError ||\n (error instanceof Error && error.message.toLowerCase().includes('unauthorized'));\n\n if (isAuthError) {\n throw error;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Don't retry if the authorization code was rejected (it's one-time use)\n if (!tokensExchanged && errorMessage.toLowerCase().includes('invalid authorization code')) {\n const msg = error instanceof Error ? error.message : 'Authentication failed';\n this.emitError(msg, 'auth');\n this.emitStateChange('FAILED');\n await this.deleteTransientSession();\n throw error;\n }\n\n if (isLastAttempt) {\n const msg = error instanceof Error ? error.message : 'Authentication failed';\n this.emitError(msg, 'auth');\n this.emitStateChange('FAILED');\n await this.deleteTransientSession();\n throw error;\n }\n\n // Log and retry\n this.emitProgress(`Auth attempt with ${currentType} failed: ${errorMessage}. Retrying...`);\n }\n }\n\n if (lastError) {\n const errorMessage = lastError instanceof Error ? lastError.message : 'Authentication failed';\n this.emitError(errorMessage, 'auth');\n this.emitStateChange('FAILED');\n await this.deleteTransientSession();\n throw lastError;\n }\n }\n\n /**\n * Lists all available tools from the connected MCP server\n * @returns List of tools with their schemas and descriptions\n * @throws {Error} When client is not connected\n */\n async listTools(): Promise<ListToolsResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n this.emitStateChange('DISCOVERING');\n\n try {\n const request: ListToolsRequest = {\n method: 'tools/list',\n params: {},\n };\n\n const result = await this.withRetry(() =>\n this.client!.request(request, ListToolsResultSchema)\n );\n\n if (this.serverId) {\n this._onConnectionEvent.fire({\n type: 'tools_discovered',\n sessionId: this.sessionId,\n serverId: this.serverId,\n toolCount: result.tools.length,\n tools: result.tools,\n timestamp: Date.now(),\n });\n }\n\n this.emitStateChange('READY');\n this.emitProgress(`Discovered ${result.tools.length} tools`);\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to list tools';\n this.emitError(errorMessage, 'validation');\n this.emitStateChange('FAILED');\n throw error;\n }\n }\n\n /**\n * Executes a tool on the connected MCP server\n * @param toolName - Name of the tool to execute\n * @param toolArgs - Arguments to pass to the tool\n * @returns Tool execution result\n * @throws {Error} When client is not connected\n */\n async callTool(toolName: string, toolArgs: Record<string, unknown>): Promise<CallToolResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n const request: CallToolRequest = {\n method: 'tools/call',\n params: {\n name: toolName,\n arguments: toolArgs,\n },\n };\n\n try {\n const result = await this.withRetry(() =>\n this.client!.request(request, CallToolResultSchema)\n );\n\n this._onObservabilityEvent.fire({\n type: 'mcp:client:tool_call',\n level: 'info',\n message: `Tool ${toolName} called successfully`,\n displayMessage: `Called tool ${toolName}`,\n sessionId: this.sessionId,\n serverId: this.serverId,\n payload: {\n toolName,\n args: toolArgs,\n },\n timestamp: Date.now(),\n id: nanoid(),\n });\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : `Failed to call tool ${toolName}`;\n\n this._onObservabilityEvent.fire({\n type: 'mcp:client:error',\n level: 'error',\n message: errorMessage,\n displayMessage: `Failed to call tool ${toolName}`,\n sessionId: this.sessionId,\n serverId: this.serverId,\n payload: {\n errorType: 'tool_execution',\n error: errorMessage,\n toolName,\n args: toolArgs,\n },\n timestamp: Date.now(),\n id: nanoid(),\n });\n\n throw error;\n }\n }\n\n /**\n * Lists all available prompts from the connected MCP server\n * @returns List of available prompts\n * @throws {Error} When client is not connected\n */\n async listPrompts(): Promise<ListPromptsResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n this.emitStateChange('DISCOVERING');\n\n try {\n const request: ListPromptsRequest = {\n method: 'prompts/list',\n params: {},\n };\n\n const result = await this.withRetry(() =>\n this.client!.request(request, ListPromptsResultSchema)\n );\n\n this.emitStateChange('READY');\n this.emitProgress(`Discovered ${result.prompts.length} prompts`);\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to list prompts';\n this.emitError(errorMessage, 'validation');\n this.emitStateChange('FAILED');\n throw error;\n }\n }\n\n /**\n * Gets a specific prompt with arguments\n * @param name - Name of the prompt\n * @param args - Arguments for the prompt\n * @returns Prompt content\n * @throws {Error} When client is not connected\n */\n async getPrompt(name: string, args?: Record<string, string>): Promise<GetPromptResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n const request: GetPromptRequest = {\n method: 'prompts/get',\n params: {\n name,\n arguments: args,\n },\n };\n\n return await this.withRetry(() =>\n this.client!.request(request, GetPromptResultSchema)\n );\n }\n\n /**\n * Lists all available resources from the connected MCP server\n * @returns List of available resources\n * @throws {Error} When client is not connected\n */\n async listResources(): Promise<ListResourcesResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n this.emitStateChange('DISCOVERING');\n\n try {\n const request: ListResourcesRequest = {\n method: 'resources/list',\n params: {},\n };\n\n const result = await this.withRetry(() =>\n this.client!.request(request, ListResourcesResultSchema)\n );\n\n this.emitStateChange('READY');\n this.emitProgress(`Discovered ${result.resources.length} resources`);\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to list resources';\n this.emitError(errorMessage, 'validation');\n this.emitStateChange('FAILED');\n throw error;\n }\n }\n\n /**\n * Reads a specific resource\n * @param uri - URI of the resource to read\n * @returns Resource content\n * @throws {Error} When client is not connected\n */\n async readResource(uri: string): Promise<ReadResourceResult> {\n if (!this.client) {\n throw new Error('Not connected to server');\n }\n\n const request: ReadResourceRequest = {\n method: 'resources/read',\n params: {\n uri,\n },\n };\n\n return await this.withRetry(() =>\n this.client!.request(request, ReadResourceResultSchema)\n );\n }\n\n /**\n * Wraps an MCP request with automatic transport-session recovery.\n *\n * When the downstream MCP server rejects the request with a 404 indicating\n * the transport session has expired, this method tears down the stale SDK\n * client and transport, calls {@link reconnect} to negotiate a fresh session,\n * and retries the request once.\n *\n * Non-transient errors (network failures, auth errors, etc.) propagate as-is.\n */\n private async withRetry<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n if (!(error instanceof Error && error.message.includes('MCP_SESSION_EXPIRED'))) throw error;\n if (this.client) {\n try { await this.client.close(); } catch {}\n this.transport = null;\n this.client = null;\n }\n await this.reconnect();\n return await fn();\n }\n }\n\n /**\n * Reconnects to MCP server using existing OAuth provider from Redis\n * Used for session restoration in serverless environments\n * Creates new client and transport without re-initializing OAuth provider\n * @throws {Error} When OAuth provider is not initialized\n */\n async reconnect(): Promise<void> {\n await this.initialize();\n\n if (!this.oauthProvider) {\n throw new Error('OAuth provider not initialized');\n }\n\n // Close the client initialize() may have created — we need a fresh\n // client that will negotiate a new transport session.\n if (this.client) {\n try { await this.client.close(); } catch {}\n }\n\n this.client = new Client(\n {\n name: MCP_CLIENT_NAME,\n version: MCP_CLIENT_VERSION,\n },\n { capabilities: {} }\n );\n\n // Use default logic to get transport, defaulting to what's stored or auto\n const tt = this.transportType || 'streamable-http';\n this.transport = this.getTransport(tt);\n\n await this.client.connect(this.transport);\n }\n\n /**\n * Completely removes the session from Redis including all OAuth data\n * Invalidates credentials and disconnects the client\n */\n async clearSession(): Promise<void> {\n try {\n await this.initialize();\n } catch (error) {\n console.warn('[MCPClient] Initialization failed during clearSession:', error);\n }\n\n if (this.oauthProvider) {\n await (this.oauthProvider as any).invalidateCredentials('all');\n }\n\n await sessions.delete(this.userId, this.sessionId);\n await this.disconnect();\n }\n\n /**\n * Checks if the client is currently connected to an MCP server\n * @returns True if connected, false otherwise\n */\n isConnected(): boolean {\n return this.client !== null;\n }\n\n /**\n * Disconnects from the MCP server and cleans up resources.\n * Does not remove session from Redis — use clearSession() for that.\n *\n * For Streamable HTTP sessions, sends an HTTP DELETE to the MCP endpoint\n * before closing, as recommended by the MCP Streamable HTTP spec\n * (section \"Session Management\", rule 5). This is best-effort — errors\n * (e.g. server already restarted, 404/405 responses) are silently ignored.\n */\n async disconnect(): Promise<void> {\n // Per the MCP Streamable HTTP spec (2025-11-25), clients SHOULD send an\n // HTTP DELETE with the mcp-session-id header when they no longer need a\n // session. The server MAY respond with 405 if it doesn't support explicit\n // termination — terminateSession() handles that gracefully.\n // SSEClientTransport has no session concept, so we guard with instanceof.\n if (this.transport instanceof StreamableHTTPClientTransport) {\n try {\n await this.transport.terminateSession();\n } catch {\n // Best-effort: server may be unreachable or may have already expired\n // the session. Either way, we proceed with local cleanup.\n }\n }\n\n if (this.client) {\n this.client.close();\n }\n this.client = null;\n this.oauthProvider = null;\n this.transport = null;\n\n // Emit disconnected event\n if (this.serverId) {\n this._onConnectionEvent.fire({\n type: 'disconnected',\n sessionId: this.sessionId,\n serverId: this.serverId,\n timestamp: Date.now(),\n });\n\n this._onObservabilityEvent.fire({\n type: 'mcp:client:disconnect',\n level: 'info',\n message: `Disconnected from ${this.serverId}`,\n sessionId: this.sessionId,\n serverId: this.serverId,\n payload: {},\n timestamp: Date.now(),\n id: nanoid(),\n });\n }\n\n this.emitStateChange('DISCONNECTED');\n }\n\n /**\n * Dispose of all event emitters\n * Call this when the client is no longer needed\n */\n dispose(): void {\n this._onConnectionEvent.dispose();\n this._onObservabilityEvent.dispose();\n }\n\n /**\n * Gets the server URL\n * @returns Server URL or empty string if not set\n */\n getServerUrl(): string {\n return this.serverUrl || '';\n }\n\n /**\n * Gets the OAuth callback URL\n * @returns Callback URL or empty string if not set\n */\n getCallbackUrl(): string {\n return this.callbackUrl || '';\n }\n\n /**\n * Gets the transport type being used\n * @returns Transport type (defaults to 'streamable-http')\n */\n getTransportType(): TransportType {\n return this.transportType || 'streamable-http';\n }\n\n /**\n * Gets the human-readable server name\n * @returns Server name or undefined\n */\n getServerName(): string | undefined {\n // Temporarily avoid deriving serverName from serverVersion metadata.\n // const info = (this.client as any)?.getServerVersion();\n // return info?.title ?? info?.name ?? this.serverName;\n return this.serverName;\n }\n\n /**\n * Gets the server ID\n * @returns Server ID or undefined\n */\n getServerId(): string | undefined {\n return this.serverId;\n }\n\n /**\n * Gets the session ID\n * @returns Session ID\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n}\n","import type { OAuthClientProvider } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type {\n OAuthClientInformationFull,\n OAuthClientInformationMixed,\n OAuthClientMetadata,\n OAuthTokens\n} from \"@modelcontextprotocol/sdk/shared/auth.js\";\nimport { nanoid } from \"nanoid\";\nimport { sessions, type SessionCredentials } from \"../storage/index.js\";\nimport {\n DEFAULT_CLIENT_NAME,\n DEFAULT_CLIENT_URI,\n DEFAULT_LOGO_URI,\n DEFAULT_POLICY_URI,\n SOFTWARE_ID,\n SOFTWARE_VERSION,\n STATE_EXPIRATION_MS,\n} from '../../shared/constants.js';\nimport { formatOAuthState, parseOAuthState } from '../../shared/utils.js';\n\n/**\n * Extension of OAuthClientProvider interface with additional methods\n * Enables server-specific tracking and state management\n */\nexport interface AgentsOAuthProvider extends OAuthClientProvider {\n authUrl: string | undefined;\n clientId: string | undefined;\n serverId: string | undefined;\n checkState(\n state: string\n ): Promise<{ valid: boolean; serverId?: string; error?: string }>;\n consumeState(state: string): Promise<void>;\n deleteCodeVerifier(): Promise<void>;\n}\n\nexport interface StorageOAuthClientProviderOptions {\n userId: string;\n serverId: string;\n sessionId: string;\n redirectUrl: string;\n clientName?: string;\n clientUri?: string;\n logoUri?: string;\n policyUri?: string;\n clientId?: string;\n clientSecret?: string;\n onRedirect?: (url: string) => void;\n}\n\n/**\n * Storage-backed OAuth provider implementation for MCP\n * Stores OAuth tokens, client information, and PKCE verifiers using the configured SessionStore\n */\nexport class StorageOAuthClientProvider implements AgentsOAuthProvider {\n public readonly userId: string;\n public readonly serverId: string;\n public readonly sessionId: string;\n public readonly redirectUrl: string;\n\n private readonly clientName?: string;\n private readonly clientUri?: string;\n private readonly logoUri?: string;\n private readonly policyUri?: string;\n private readonly clientSecret?: string;\n\n private _authUrl: string | undefined;\n private _clientId: string | undefined;\n private onRedirectCallback?: (url: string) => void;\n\n /**\n * Creates a new session-backed OAuth provider\n * @param options - Provider configuration\n */\n constructor(options: StorageOAuthClientProviderOptions) {\n this.userId = options.userId;\n this.serverId = options.serverId;\n this.sessionId = options.sessionId;\n this.redirectUrl = options.redirectUrl;\n this.clientName = options.clientName;\n this.clientUri = options.clientUri;\n this.logoUri = options.logoUri;\n this.policyUri = options.policyUri;\n this._clientId = options.clientId;\n this.clientSecret = options.clientSecret;\n this.onRedirectCallback = options.onRedirect;\n }\n\n get clientMetadata(): OAuthClientMetadata {\n return {\n client_name: this.clientName || DEFAULT_CLIENT_NAME,\n client_uri: this.clientUri || DEFAULT_CLIENT_URI,\n logo_uri: this.logoUri || DEFAULT_LOGO_URI,\n policy_uri: this.policyUri || DEFAULT_POLICY_URI,\n grant_types: [\"authorization_code\", \"refresh_token\"],\n redirect_uris: [this.redirectUrl],\n response_types: [\"code\"],\n token_endpoint_auth_method: this.clientSecret ? \"client_secret_basic\" : \"none\",\n software_id: SOFTWARE_ID,\n software_version: SOFTWARE_VERSION,\n };\n }\n\n get clientId() {\n return this._clientId;\n }\n\n set clientId(clientId_: string | undefined) {\n this._clientId = clientId_;\n }\n\n /**\n * Loads OAuth credentials from the session store\n * @private\n */\n private async getCredentials(): Promise<SessionCredentials> {\n const data = await sessions.getCredentials(this.userId, this.sessionId);\n if (!data) {\n return { userId: this.userId, sessionId: this.sessionId };\n }\n return data;\n }\n\n /**\n * Saves OAuth credentials to the session store\n * @param data - Partial OAuth credentials to save\n * @private\n * @throws Error if session doesn't exist (session must be created by controller layer)\n */\n private async patchCredentials(data: Partial<SessionCredentials>): Promise<void> {\n await sessions.patchCredentials(this.userId, this.sessionId, data);\n }\n\n /**\n * Retrieves stored OAuth client information\n */\n async clientInformation(): Promise<OAuthClientInformationMixed | undefined> {\n const data = await this.getCredentials();\n\n if (data.clientId && !this._clientId) {\n this._clientId = data.clientId;\n }\n\n if (data.clientInformation) {\n return data.clientInformation;\n }\n\n if (!this._clientId) {\n return undefined;\n }\n\n return {\n client_id: this._clientId,\n ...(this.clientSecret ? { client_secret: this.clientSecret } : {}),\n };\n }\n\n /**\n * Stores OAuth client information\n */\n async saveClientInformation(clientInformation: OAuthClientInformationFull): Promise<void> {\n await this.patchCredentials({\n clientInformation,\n clientId: clientInformation.client_id\n });\n this.clientId = clientInformation.client_id;\n }\n\n /**\n * Stores OAuth tokens\n */\n async saveTokens(tokens: OAuthTokens): Promise<void> {\n await this.patchCredentials({ tokens });\n }\n\n get authUrl() {\n return this._authUrl;\n }\n\n async state(): Promise<string> {\n const nonce = nanoid(32);\n await this.patchCredentials({\n oauthState: {\n nonce,\n sessionId: this.sessionId,\n serverId: this.serverId,\n createdAt: Date.now(),\n },\n codeVerifier: null,\n });\n return formatOAuthState(nonce, this.sessionId);\n }\n\n async checkState(state: string): Promise<{ valid: boolean; serverId?: string; error?: string }> {\n const parsed = parseOAuthState(state);\n if (!parsed) {\n return { valid: false, error: \"Invalid OAuth state\" };\n }\n\n if (parsed.sessionId !== this.sessionId) {\n return { valid: false, error: \"OAuth state mismatch\" };\n }\n\n const data = await sessions.getCredentials(this.userId, parsed.sessionId);\n\n if (!data) {\n return { valid: false, error: \"Session not found\" };\n }\n\n const oauthState = data.oauthState;\n if (!oauthState) {\n return { valid: false, error: \"OAuth state not found\" };\n }\n\n if (\n oauthState.nonce !== parsed.nonce ||\n oauthState.sessionId !== parsed.sessionId ||\n oauthState.serverId !== this.serverId\n ) {\n return { valid: false, error: \"OAuth state mismatch\" };\n }\n\n if (Date.now() - oauthState.createdAt > STATE_EXPIRATION_MS) {\n return { valid: false, error: \"OAuth state expired\" };\n }\n\n return { valid: true, serverId: oauthState.serverId };\n }\n\n async consumeState(state: string): Promise<void> {\n const result = await this.checkState(state);\n if (!result.valid) {\n throw new Error(result.error || \"Invalid OAuth state\");\n }\n\n await this.patchCredentials({ oauthState: null });\n }\n\n async redirectToAuthorization(authUrl: URL): Promise<void> {\n this._authUrl = authUrl.toString();\n await sessions.update(this.userId, this.sessionId, { authUrl: this._authUrl });\n if (this.onRedirectCallback) {\n this.onRedirectCallback(authUrl.toString());\n }\n }\n\n async invalidateCredentials(\n scope: \"all\" | \"client\" | \"tokens\" | \"verifier\"\n ): Promise<void> {\n if (scope === \"all\") {\n await sessions.delete(this.userId, this.sessionId);\n } else {\n const updates: Partial<SessionCredentials> = {};\n\n if (scope === \"client\") {\n updates.clientInformation = null;\n updates.clientId = null;\n } else if (scope === \"tokens\") {\n updates.tokens = null;\n } else if (scope === \"verifier\") {\n updates.codeVerifier = null;\n }\n await this.patchCredentials(updates);\n }\n }\n\n async saveCodeVerifier(verifier: string): Promise<void> {\n const data = await this.getCredentials();\n if (data.codeVerifier) {\n return;\n }\n\n await this.patchCredentials({ codeVerifier: verifier });\n }\n\n async codeVerifier(): Promise<string> {\n const data = await this.getCredentials();\n\n if (data.clientId && !this._clientId) {\n this._clientId = data.clientId;\n }\n\n if (!data.codeVerifier) {\n throw new Error(\"No code verifier found\");\n }\n return data.codeVerifier;\n }\n\n async deleteCodeVerifier(): Promise<void> {\n await this.patchCredentials({ codeVerifier: null });\n }\n\n async tokens(): Promise<OAuthTokens | undefined> {\n const data = await this.getCredentials();\n\n if (data.clientId && !this._clientId) {\n this._clientId = data.clientId;\n }\n\n return data.tokens ?? undefined;\n }\n}\n","\nimport { RedisStorageBackend } from './redis-backend';\nimport { MemoryStorageBackend } from './memory-backend';\nimport { FileStorageBackend } from './file-backend';\nimport { SqliteStorage } from './sqlite-backend.js';\nimport { SupabaseStorageBackend } from './supabase-backend.js';\nimport { NeonStorageBackend, type NeonStorageOptions } from './neon-backend.js';\nimport type { SessionStore, Session, SessionMutationEvent, SessionMutationListener } from './types.js';\n\n// Re-export types\nexport * from './types.js';\nexport { generateSessionId } from '../../shared/utils.js';\nexport { RedisStorageBackend, MemoryStorageBackend, FileStorageBackend, SqliteStorage, SupabaseStorageBackend, NeonStorageBackend };\n\nexport function createSupabaseStorageBackend(client: any): SupabaseStorageBackend {\n return new SupabaseStorageBackend(client);\n}\n\nexport function createNeonStorageBackend(sql: any, options?: NeonStorageOptions): NeonStorageBackend {\n return new NeonStorageBackend(sql, options);\n}\n\nfunction warnIfNeonConnectionStringIsInsecure(connectionString: string): void {\n try {\n const url = new URL(connectionString);\n const sslMode = url.searchParams.get('sslmode');\n const channelBinding = url.searchParams.get('channel_binding');\n\n if (!sslMode) {\n console.warn('[mcp-ts][Storage] Neon connection string does not include sslmode. Neon recommends sslmode=verify-full for the strongest certificate verification.');\n } else if (!['verify-full', 'require'].includes(sslMode)) {\n console.warn(`[mcp-ts][Storage] Neon connection string uses sslmode=${sslMode}. Use sslmode=verify-full or sslmode=require for secure connections.`);\n }\n\n if (!channelBinding) {\n console.warn('[mcp-ts][Storage] Neon connection string does not include channel_binding=require. Add it when supported by your runtime and connection path.');\n }\n } catch {\n console.warn('[mcp-ts][Storage] Neon connection string could not be parsed for SSL checks.');\n }\n}\n\nlet storageInstance: SessionStore | null = null;\nlet storagePromise: Promise<SessionStore> | null = null;\nconst sessionMutationListeners = new Set<SessionMutationListener>();\n\nfunction emitSessionMutation(event: SessionMutationEvent): void {\n for (const listener of sessionMutationListeners) {\n try {\n const result = listener(event);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n void (result as Promise<void>).catch((error) => {\n console.error('[mcp-ts][Storage] Session mutation listener failed:', error);\n });\n }\n } catch (error) {\n console.error('[mcp-ts][Storage] Session mutation listener failed:', error);\n }\n }\n}\n\nfunction createSessionMutationEvent(prop: PropertyKey, args: any[]): SessionMutationEvent | null {\n const timestamp = Date.now();\n\n if (prop === 'create') {\n const [session] = args as [Session];\n if (!session?.userId || !session?.sessionId) return null;\n return {\n type: 'create',\n userId: session.userId,\n sessionId: session.sessionId,\n session,\n timestamp,\n };\n }\n\n if (prop === 'update') {\n const [userId, sessionId, patch] = args as [string, string, Partial<Session>];\n if (!userId || !sessionId) return null;\n return {\n type: 'update',\n userId,\n sessionId,\n patch,\n timestamp,\n };\n }\n\n if (prop === 'delete') {\n const [userId, sessionId] = args as [string, string];\n if (!userId || !sessionId) return null;\n return {\n type: 'delete',\n userId,\n sessionId,\n timestamp,\n };\n }\n\n return null;\n}\n\nasync function initializeStorage<T extends SessionStore>(store: T): Promise<T> {\n if (typeof store.init === 'function') {\n await store.init();\n }\n return store;\n}\n\nasync function createStorage(): Promise<SessionStore> {\n const type = process.env.MCP_TS_STORAGE_TYPE?.toLowerCase();\n\n // Explicit selection\n if (type === 'redis') {\n if (!process.env.REDIS_URL) {\n console.warn('[Storage] MCP_TS_STORAGE_TYPE is \"redis\" but REDIS_URL is missing');\n }\n try {\n const { getRedis } = await import('./redis.js');\n const redis = await getRedis();\n console.log('[mcp-ts][Storage] Explicit selection: \"redis\"');\n return await initializeStorage(new RedisStorageBackend(redis));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Failed to initialize Redis:', error.message);\n console.log('[mcp-ts][Storage] Falling back to In-Memory storage');\n return await initializeStorage(new MemoryStorageBackend());\n }\n }\n\n if (type === 'file') {\n const filePath = process.env.MCP_TS_STORAGE_FILE;\n console.log(`[mcp-ts][Storage] Explicit selection: \"file\" (${filePath || 'default'})`);\n return await initializeStorage(new FileStorageBackend({ path: filePath }));\n }\n\n if (type === 'sqlite') {\n const dbPath = process.env.MCP_TS_STORAGE_SQLITE_PATH;\n console.log(`[mcp-ts][Storage] Explicit selection: \"sqlite\" (${dbPath || 'default'})`);\n return await initializeStorage(new SqliteStorage({ path: dbPath }));\n }\n\n if (type === 'supabase') {\n const url = process.env.SUPABASE_URL;\n const key = process.env.SUPABASE_SECRET_KEY || process.env.SUPABASE_ANON_KEY;\n \n if (!url || !key) {\n console.warn('[mcp-ts][Storage] Explicit selection \"supabase\" requires SUPABASE_URL and SUPABASE_SECRET_KEY.');\n } else {\n if (!process.env.SUPABASE_SECRET_KEY) {\n console.warn('[mcp-ts][Storage] ⚠️ Warning: Using \"SUPABASE_ANON_KEY\" for server-side storage. You may encounter RLS policy violations. \"SUPABASE_SECRET_KEY\" is recommended.');\n }\n try {\n const { createClient } = await import('@supabase/supabase-js');\n const client = createClient(url, key);\n console.log('[mcp-ts][Storage] Explicit selection: \"supabase\"');\n return await initializeStorage(new SupabaseStorageBackend(client as any));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Failed to initialize Supabase:', error.message);\n console.log('[mcp-ts][Storage] Falling back to In-Memory storage');\n return await initializeStorage(new MemoryStorageBackend());\n }\n }\n }\n\n if (type === 'neon') {\n const connectionString = process.env.NEON_DATABASE_URL || process.env.DATABASE_URL;\n\n if (!connectionString) {\n console.warn('[mcp-ts][Storage] Explicit selection \"neon\" requires NEON_DATABASE_URL or DATABASE_URL.');\n } else {\n try {\n const { neon } = await import('@neondatabase/serverless');\n warnIfNeonConnectionStringIsInsecure(connectionString);\n const sql = neon(connectionString);\n console.log('[mcp-ts][Storage] Explicit selection: \"neon\"');\n return await initializeStorage(new NeonStorageBackend(sql));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Failed to initialize Neon:', error.message);\n console.log('[mcp-ts][Storage] Falling back to In-Memory storage');\n return await initializeStorage(new MemoryStorageBackend());\n }\n }\n }\n\n if (type === 'memory') {\n console.log('[mcp-ts][Storage] Explicit selection: \"memory\"');\n return await initializeStorage(new MemoryStorageBackend());\n }\n\n // Automatic inference (Fallback)\n if (process.env.REDIS_URL) {\n try {\n const { getRedis } = await import('./redis.js');\n const redis = await getRedis();\n console.log('[mcp-ts][Storage] Auto-detection: \"redis\" (via REDIS_URL)');\n return await initializeStorage(new RedisStorageBackend(redis));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Redis auto-detection failed:', error.message);\n console.log('[mcp-ts][Storage] Falling back to next available backend');\n }\n }\n\n if (process.env.MCP_TS_STORAGE_FILE) {\n console.log(`[mcp-ts][Storage] Auto-detection: \"file\" (${process.env.MCP_TS_STORAGE_FILE})`);\n return await initializeStorage(new FileStorageBackend({ path: process.env.MCP_TS_STORAGE_FILE }));\n }\n\n if (process.env.MCP_TS_STORAGE_SQLITE_PATH) {\n console.log(`[mcp-ts][Storage] Auto-detection: \"sqlite\" (${process.env.MCP_TS_STORAGE_SQLITE_PATH})`);\n return await initializeStorage(new SqliteStorage({ path: process.env.MCP_TS_STORAGE_SQLITE_PATH }));\n }\n\n if (process.env.SUPABASE_URL && (process.env.SUPABASE_SECRET_KEY || process.env.SUPABASE_ANON_KEY)) {\n try {\n const { createClient } = await import('@supabase/supabase-js');\n const url = process.env.SUPABASE_URL;\n const key = process.env.SUPABASE_SECRET_KEY || process.env.SUPABASE_ANON_KEY!;\n \n if (!process.env.SUPABASE_SECRET_KEY) {\n console.warn('[mcp-ts][Storage] ⚠️ Warning: Using \"SUPABASE_ANON_KEY\" for server-side storage. You may encounter RLS policy violations. \"SUPABASE_SECRET_KEY\" is recommended.');\n }\n\n const client = createClient(url, key);\n console.log('[mcp-ts][Storage] Auto-detection: \"supabase\" (via SUPABASE_URL)');\n return await initializeStorage(new SupabaseStorageBackend(client as any));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Supabase auto-detection failed:', error.message);\n }\n }\n\n if (process.env.NEON_DATABASE_URL) {\n try {\n const { neon } = await import('@neondatabase/serverless');\n warnIfNeonConnectionStringIsInsecure(process.env.NEON_DATABASE_URL);\n const sql = neon(process.env.NEON_DATABASE_URL);\n console.log('[mcp-ts][Storage] Auto-detection: \"neon\" (via NEON_DATABASE_URL)');\n return await initializeStorage(new NeonStorageBackend(sql));\n } catch (error: any) {\n console.error('[mcp-ts][Storage] Neon auto-detection failed:', error.message);\n }\n }\n\n console.log('[mcp-ts][Storage] Defaulting to: \"memory\"');\n return await initializeStorage(new MemoryStorageBackend());\n}\n\nasync function getStorage(): Promise<SessionStore> {\n if (storageInstance) {\n return storageInstance;\n }\n\n if (!storagePromise) {\n storagePromise = createStorage().catch((error) => {\n storagePromise = null;\n throw error;\n });\n }\n\n storageInstance = await storagePromise;\n return storageInstance;\n}\n\n/**\n * Set the storage instance (for testing)\n * @internal\n * @param instance - SessionStore instance or null to reset\n */\nexport function _setStorageInstanceForTesting(instance: SessionStore | null): void {\n storageInstance = instance;\n if (!instance) {\n storagePromise = null;\n }\n}\n\nexport function onSessionMutation(listener: SessionMutationListener): () => void {\n sessionMutationListeners.add(listener);\n return () => {\n sessionMutationListeners.delete(listener);\n };\n}\n\nexport function _resetSessionMutationListenersForTesting(): void {\n sessionMutationListeners.clear();\n}\n\n/**\n * Global session store instance\n * Uses lazy initialization with a Proxy to handle async setup transparently\n */\nexport const sessions: SessionStore = new Proxy({} as SessionStore, {\n get(_target, prop) {\n return async (...args: any[]) => {\n const instance = await getStorage();\n const value = (instance as any)[prop];\n if (typeof value === 'function') {\n const result = await value.apply(instance, args);\n const event = createSessionMutationEvent(prop, args);\n if (event) {\n emitSessionMutation(event);\n }\n return result;\n }\n return value;\n };\n },\n});\n","import type { Redis } from 'ioredis';\nimport type { SessionStore, Session, SessionCredentials } from './types.js';\nimport { generateSessionId } from '../../shared/utils.js';\nimport {\n mergeSessionUpdate,\n normalizeNewSession,\n normalizeStoredSession,\n resolveSessionRedisTtlSeconds,\n} from './session-lifecycle.js';\n\n/**\n * Redis implementation of SessionStore\n */\nexport class RedisStorageBackend implements SessionStore {\n private readonly KEY_PREFIX = 'mcp:session:';\n private readonly CREDENTIALS_KEY_PREFIX = 'mcp:credentials:';\n private readonly USER_ID_KEY_PREFIX = 'mcp:userId:';\n private readonly USER_ID_KEY_SUFFIX = ':sessions';\n\n constructor(private redis: Redis) { }\n \n async init(): Promise<void> {\n try {\n await this.redis.ping();\n console.log('[mcp-ts][Storage] Redis: ✓ Connected to server.');\n } catch (error: any) {\n throw new Error(`[RedisStorageBackend] Failed to connect to Redis: ${error.message}`);\n }\n }\n\n /**\n * Generates Redis key for a specific session\n * @private\n */\n private getSessionKey(userId: string, sessionId: string): string {\n return `${this.KEY_PREFIX}${userId}:${sessionId}`;\n }\n\n private getCredentialsKey(userId: string, sessionId: string): string {\n return `${this.CREDENTIALS_KEY_PREFIX}${userId}:${sessionId}`;\n }\n\n /**\n * Generates Redis key for tracking all sessions for a user\n * @private\n */\n private getUserIdKey(userId: string): string {\n return `${this.USER_ID_KEY_PREFIX}${userId}${this.USER_ID_KEY_SUFFIX}`;\n }\n\n private parseUserIdFromKey(userIdKey: string): string {\n return userIdKey.slice(\n this.USER_ID_KEY_PREFIX.length,\n userIdKey.length - this.USER_ID_KEY_SUFFIX.length\n );\n }\n\n private async scanKeys(pattern: string): Promise<string[]> {\n const redis = this.redis as Redis & {\n scan?: (cursor: string, ...args: Array<string | number>) => Promise<[string, string[]]>;\n };\n\n if (typeof redis.scan !== 'function') {\n return await this.redis.keys(pattern);\n }\n\n const keys = new Set<string>();\n let cursor = '0';\n\n try {\n do {\n const [nextCursor, batch] = await redis.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n for (const key of batch) {\n keys.add(key);\n }\n } while (cursor !== '0');\n } catch (error) {\n console.warn('[RedisStorageBackend] SCAN failed, falling back to KEYS:', error);\n return await this.redis.keys(pattern);\n }\n\n return Array.from(keys);\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n async create(session: Session): Promise<void> {\n const { sessionId, userId } = session;\n if (!sessionId || !userId) throw new Error('userId and sessionId required');\n\n const sessionKey = this.getSessionKey(userId, sessionId);\n const userIdKey = this.getUserIdKey(userId);\n const sessionWithLifecycle = normalizeNewSession(session);\n const effectiveTtl = resolveSessionRedisTtlSeconds(sessionWithLifecycle);\n\n const result = await this.redis.set(\n sessionKey,\n JSON.stringify(sessionWithLifecycle),\n 'EX',\n effectiveTtl,\n 'NX'\n );\n\n if (result !== 'OK') {\n throw new Error(`Session ${sessionId} already exists`);\n }\n\n await this.redis.sadd(userIdKey, sessionId);\n }\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n\n /** Lua script for atomic get-and-set with expiration refresh. */\n const script = `\n local currentStr = redis.call(\"GET\", KEYS[1])\n if not currentStr then\n return 0\n end\n\n local current = cjson.decode(currentStr)\n local updated = cjson.decode(ARGV[1])\n\n redis.call(\"SET\", KEYS[1], cjson.encode(updated), \"EX\", ARGV[2])\n return 1\n `;\n\n const current = await this.get(userId, sessionId);\n if (!current) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n const updated = mergeSessionUpdate(current, data);\n const effectiveTtl = resolveSessionRedisTtlSeconds(updated);\n\n const result = await this.redis.eval(\n script,\n 1,\n sessionKey,\n JSON.stringify(updated),\n effectiveTtl\n );\n\n if (result === 0) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n const credentialsKey = this.getCredentialsKey(userId, sessionId);\n const sessionExists = await this.redis.exists(sessionKey);\n if (!sessionExists) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n const session = await this.get(userId, sessionId);\n const currentTtl = await this.redis.ttl(sessionKey);\n const effectiveTtl = currentTtl > 0 && session\n ? currentTtl\n : resolveSessionRedisTtlSeconds(session ?? { status: 'pending' });\n const currentStr = await this.redis.get(credentialsKey);\n const current = currentStr ? JSON.parse(currentStr) as SessionCredentials : { sessionId, userId };\n const credentials = { ...current, ...data, sessionId, userId };\n if (effectiveTtl > 0) {\n await this.redis.set(credentialsKey, JSON.stringify(credentials), 'EX', effectiveTtl);\n } else {\n await this.redis.set(credentialsKey, JSON.stringify(credentials));\n }\n }\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n try {\n const sessionKey = this.getSessionKey(userId, sessionId);\n const sessionDataStr = await this.redis.get(sessionKey);\n\n if (!sessionDataStr) {\n return null;\n }\n\n const session: Session = JSON.parse(sessionDataStr);\n return normalizeStoredSession(session);\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to get session:', error);\n return null;\n }\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n const session = await this.get(userId, sessionId);\n if (!session) return null;\n\n const credentialsStr = await this.redis.get(this.getCredentialsKey(userId, sessionId));\n return credentialsStr ? JSON.parse(credentialsStr) as SessionCredentials : { sessionId, userId };\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n await this.patchCredentials(userId, sessionId, {\n clientInformation: null,\n tokens: null,\n codeVerifier: null,\n clientId: null,\n oauthState: null,\n });\n }\n\n async listIds(userId: string): Promise<string[]> {\n const sessions = await this.list(userId);\n return sessions.map((session) => session.sessionId);\n }\n\n async list(userId: string): Promise<Session[]> {\n try {\n const userIdKey = this.getUserIdKey(userId);\n const sessionIds = await this.redis.smembers(userIdKey);\n if (sessionIds.length === 0) return [];\n\n const results = await Promise.all(\n sessionIds.map(async (sessionId) => {\n const data = await this.redis.get(this.getSessionKey(userId, sessionId));\n return data ? (JSON.parse(data) as Session) : null;\n })\n );\n\n const staleSessionIds = sessionIds.filter((_, index) => results[index] === null);\n if (staleSessionIds.length > 0) {\n await this.redis.srem(userIdKey, ...staleSessionIds);\n }\n\n return results\n .filter((session): session is Session => session !== null)\n .map((session) => normalizeStoredSession(session));\n } catch (error) {\n console.error(`[RedisStorageBackend] Failed to get session data for ${userId}:`, error);\n return [];\n }\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n try {\n const sessionKey = this.getSessionKey(userId, sessionId);\n const credentialsKey = this.getCredentialsKey(userId, sessionId);\n const userIdKey = this.getUserIdKey(userId);\n\n await this.redis.srem(userIdKey, sessionId);\n await this.redis.del(sessionKey, credentialsKey);\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to remove session:', error);\n }\n }\n\n async listAllIds(): Promise<string[]> {\n try {\n const keys = await this.scanKeys(`${this.KEY_PREFIX}*`);\n const sessions = await Promise.all(\n keys.map(async (key) => {\n const data = await this.redis.get(key);\n if (!data) {\n return null;\n }\n\n try {\n return normalizeStoredSession(JSON.parse(data) as Session).sessionId;\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to parse session while listing all session IDs:', error);\n return null;\n }\n })\n );\n\n return sessions.filter((sessionId): sessionId is string => sessionId !== null);\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to get all sessions:', error);\n return [];\n }\n }\n\n async clearAll(): Promise<void> {\n try {\n const keys = await this.scanKeys(`${this.KEY_PREFIX}*`);\n const credentialKeys = await this.scanKeys(`${this.CREDENTIALS_KEY_PREFIX}*`);\n const userIdKeys = await this.scanKeys(`${this.USER_ID_KEY_PREFIX}*${this.USER_ID_KEY_SUFFIX}`);\n const allKeys = [...keys, ...credentialKeys, ...userIdKeys];\n if (allKeys.length > 0) {\n await this.redis.del(...allKeys);\n }\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to clear sessions:', error);\n }\n }\n\n async cleanupExpired(): Promise<void> {\n try {\n const userIdKeys = await this.scanKeys(`${this.USER_ID_KEY_PREFIX}*${this.USER_ID_KEY_SUFFIX}`);\n\n for (const userIdKey of userIdKeys) {\n const userId = this.parseUserIdFromKey(userIdKey);\n const sessionIds = await this.redis.smembers(userIdKey);\n\n if (sessionIds.length === 0) {\n await this.redis.del(userIdKey);\n continue;\n }\n\n const existenceChecks = await Promise.all(\n sessionIds.map((sessionId) => this.redis.exists(this.getSessionKey(userId, sessionId)))\n );\n\n const staleSessionIds = sessionIds.filter((_, index) => existenceChecks[index] === 0);\n if (staleSessionIds.length > 0) {\n await this.redis.srem(userIdKey, ...staleSessionIds);\n await this.redis.del(...staleSessionIds.map((sessionId) => this.getCredentialsKey(userId, sessionId)));\n }\n\n const remainingCount = await this.redis.scard(userIdKey);\n if (remainingCount === 0) {\n await this.redis.del(userIdKey);\n }\n }\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to cleanup expired sessions:', error);\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.redis.quit();\n } catch (error) {\n console.error('[RedisStorageBackend] Failed to disconnect:', error);\n }\n }\n}\n","import { customAlphabet } from 'nanoid';\n\nconst OAUTH_STATE_SEPARATOR = '.';\n\n/** first char: letters only (required by OpenAI) */\nconst firstChar = customAlphabet(\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n 1\n);\n\n/** remaining chars: alphanumeric */\nconst rest = customAlphabet(\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',\n 11\n);\n\n/**\n * Sanitize server name to create a valid server label\n * Must start with a letter and contain only letters, digits, '-' and '_'\n */\nexport function sanitizeServerLabel(name: string): string {\n let sanitized = name\n .replace(/[^a-zA-Z0-9-_]/g, '_')\n .replace(/_{2,}/g, '_')\n .toLowerCase();\n\n if (!/^[a-zA-Z]/.test(sanitized)) {\n sanitized = 's_' + sanitized;\n }\n\n return sanitized;\n}\n\n/**\n * Generates a standard 12-character session ID compliant with external tool restrictions.\n * First character is always a letter.\n */\nexport function generateSessionId(): string {\n return firstChar() + rest();\n}\n\nexport interface ParsedOAuthState {\n nonce: string;\n sessionId: string;\n}\n\nexport function formatOAuthState(nonce: string, sessionId: string): string {\n return `${nonce}${OAUTH_STATE_SEPARATOR}${sessionId}`;\n}\n\nexport function parseOAuthState(state: string): ParsedOAuthState | undefined {\n const separatorIndex = state.indexOf(OAUTH_STATE_SEPARATOR);\n if (separatorIndex <= 0 || separatorIndex === state.length - 1) {\n return undefined;\n }\n\n const nonce = state.slice(0, separatorIndex);\n const sessionId = state.slice(separatorIndex + 1);\n if (!nonce || !sessionId || sessionId.includes(OAUTH_STATE_SEPARATOR)) {\n return undefined;\n }\n\n return { nonce, sessionId };\n}\n","import {\n DORMANT_SESSION_EXPIRATION_MS,\n DORMANT_SESSION_EXPIRATION_SECONDS,\n STATE_EXPIRATION_MS,\n} from '../../shared/constants.js';\nimport type { Session, SessionStatus } from './types.js';\n\nexport function resolveSessionExpiresAt(status: SessionStatus = 'pending', referenceTime = Date.now()): number | null {\n return status === 'active' ? null : referenceTime + STATE_EXPIRATION_MS;\n}\n\nexport function resolveSessionRedisTtlSeconds(session: Pick<Session, 'status'>): number {\n return session.status === 'active'\n ? DORMANT_SESSION_EXPIRATION_SECONDS\n : Math.floor(STATE_EXPIRATION_MS / 1000);\n}\n\nexport function normalizeNewSession(session: Session, now = Date.now()): Session {\n const createdAt = session.createdAt || now;\n const updatedAt = session.updatedAt ?? createdAt;\n const status = session.status ?? 'pending';\n\n return {\n ...session,\n status,\n createdAt,\n updatedAt,\n expiresAt: resolveSessionExpiresAt(status, status === 'active' ? updatedAt : createdAt),\n };\n}\n\nexport function mergeSessionUpdate(\n current: Session,\n data: Partial<Session>,\n now = Date.now()\n): Session {\n const updatedAt = data.updatedAt ?? now;\n const updated = {\n ...current,\n ...data,\n updatedAt,\n };\n const status = updated.status ?? 'pending';\n\n return {\n ...updated,\n status,\n expiresAt: resolveSessionExpiresAt(status, updatedAt),\n };\n}\n\nexport function normalizeStoredSession(session: Session): Session {\n const createdAt = session.createdAt || Date.now();\n const updatedAt = session.updatedAt ?? createdAt;\n const status = session.status ?? 'pending';\n const expiresAt = status === 'active'\n ? null\n : session.expiresAt ?? resolveSessionExpiresAt(status, createdAt);\n\n return {\n ...session,\n status,\n createdAt,\n updatedAt,\n expiresAt,\n };\n}\n\nexport function isSessionExpired(session: Session, now = Date.now()): boolean {\n const hydrated = normalizeStoredSession(session);\n\n if (hydrated.status === 'active') {\n return hydrated.updatedAt !== undefined &&\n hydrated.updatedAt < now - DORMANT_SESSION_EXPIRATION_MS;\n }\n\n return typeof hydrated.expiresAt === 'number' && hydrated.expiresAt < now;\n}\n","/**\n * Centralized constants for MCP Redis library\n * Eliminates magic numbers and enables consistent configuration\n */\n\n// Session lifecycle\nexport const STATE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes for OAuth state\nexport const PENDING_SESSION_EXPIRATION_SECONDS = Math.floor(STATE_EXPIRATION_MS / 1000);\nexport const DORMANT_SESSION_EXPIRATION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days\nexport const DORMANT_SESSION_EXPIRATION_SECONDS = Math.floor(DORMANT_SESSION_EXPIRATION_MS / 1000);\n\n// Heartbeat and Connection\nexport const DEFAULT_HEARTBEAT_INTERVAL_MS = 30000; // 30 seconds\n\n// Redis Key Prefixes\nexport const REDIS_KEY_PREFIX = 'mcp:session:';\n\n// Client Information\nexport const DEFAULT_CLIENT_NAME = 'MCP Assistant';\nexport const DEFAULT_CLIENT_URI = 'https://mcp-assistant.in';\nexport const DEFAULT_LOGO_URI = 'https://mcp-assistant.in/logo.svg';\nexport const DEFAULT_POLICY_URI = 'https://mcp-assistant.in/privacy';\nexport const SOFTWARE_ID = '@mcp-ts';\nexport const SOFTWARE_VERSION = '2.3.4';\n\n// MCP Client Configuration\nexport const MCP_CLIENT_NAME = 'mcp-ts-oauth-client';\nexport const MCP_CLIENT_VERSION = '2.0';\n","import type { SessionStore, Session, SessionCredentials } from './types.js';\nimport { generateSessionId } from '../../shared/utils.js';\nimport { isSessionExpired, mergeSessionUpdate, normalizeNewSession } from './session-lifecycle.js';\n\n/**\n * In-memory implementation of SessionStore\n * Useful for local development or testing\n */\nexport class MemoryStorageBackend implements SessionStore {\n // Map<userId:sessionId, Session>\n private sessions = new Map<string, Session>();\n private credentials = new Map<string, SessionCredentials>();\n\n // Map<userId, Set<sessionId>>\n private userIdSessions = new Map<string, Set<string>>();\n\n constructor() { }\n\n async init(): Promise<void> {\n console.log('[mcp-ts][Storage] Memory: ✓ internal memory store active.');\n }\n\n private getSessionKey(userId: string, sessionId: string): string {\n return `${userId}:${sessionId}`;\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n async create(session: Session): Promise<void> {\n const { sessionId, userId } = session;\n if (!sessionId || !userId) throw new Error('userId and sessionId required');\n\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (this.sessions.has(sessionKey)) {\n throw new Error(`Session ${sessionId} already exists`);\n }\n\n this.sessions.set(sessionKey, normalizeNewSession(session));\n\n // Update index\n if (!this.userIdSessions.has(userId)) {\n this.userIdSessions.set(userId, new Set());\n }\n this.userIdSessions.get(userId)!.add(sessionId);\n }\n\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n if (!userId || !sessionId) throw new Error('userId and sessionId required');\n\n const sessionKey = this.getSessionKey(userId, sessionId);\n const current = this.sessions.get(sessionKey);\n\n if (!current) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const updated = mergeSessionUpdate(current, data);\n\n this.sessions.set(sessionKey, updated);\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (!this.sessions.has(sessionKey)) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const current = this.credentials.get(sessionKey) ?? { sessionId, userId };\n this.credentials.set(sessionKey, { ...current, ...data, sessionId, userId });\n }\n\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n return this.sessions.get(sessionKey) || null;\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (!this.sessions.has(sessionKey)) return null;\n return this.credentials.get(sessionKey) ?? { sessionId, userId };\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n await this.patchCredentials(userId, sessionId, {\n clientInformation: null,\n tokens: null,\n codeVerifier: null,\n clientId: null,\n oauthState: null,\n });\n }\n\n async listIds(userId: string): Promise<string[]> {\n const set = this.userIdSessions.get(userId);\n return set ? Array.from(set) : [];\n }\n\n async list(userId: string): Promise<Session[]> {\n const set = this.userIdSessions.get(userId);\n if (!set) return [];\n\n const results: Session[] = [];\n for (const sessionId of set) {\n const session = this.sessions.get(this.getSessionKey(userId, sessionId));\n if (session) {\n results.push(session);\n }\n }\n return results;\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n const sessionKey = this.getSessionKey(userId, sessionId);\n this.sessions.delete(sessionKey);\n this.credentials.delete(sessionKey);\n\n const set = this.userIdSessions.get(userId);\n if (set) {\n set.delete(sessionId);\n if (set.size === 0) {\n this.userIdSessions.delete(userId);\n }\n }\n }\n\n async listAllIds(): Promise<string[]> {\n return Array.from(this.sessions.values()).map(s => s.sessionId);\n }\n\n async clearAll(): Promise<void> {\n this.sessions.clear();\n this.credentials.clear();\n this.userIdSessions.clear();\n }\n\n async cleanupExpired(): Promise<void> {\n for (const [key, session] of this.sessions.entries()) {\n if (!isSessionExpired(session)) continue;\n\n this.sessions.delete(key);\n this.credentials.delete(key);\n\n const set = this.userIdSessions.get(session.userId);\n if (set) {\n set.delete(session.sessionId);\n if (set.size === 0) {\n this.userIdSessions.delete(session.userId);\n }\n }\n }\n }\n\n async disconnect(): Promise<void> {\n // No-op for memory\n }\n}\n","import { promises as fs } from 'fs';\nimport * as path from 'path';\nimport type { SessionStore, Session, SessionCredentials } from './types.js';\nimport { generateSessionId } from '../../shared/utils.js';\nimport {\n mergeSessionUpdate,\n normalizeNewSession,\n normalizeStoredSession,\n isSessionExpired,\n} from './session-lifecycle.js';\n\n/**\n * File system implementation of SessionStore\n * Persists sessions to a JSON file\n */\nexport class FileStorageBackend implements SessionStore {\n private filePath: string;\n private memoryCache: Map<string, Session> | null = null;\n private credentialsCache: Map<string, SessionCredentials> | null = null;\n private initialized = false;\n\n /**\n * @param options.path Path to the JSON file storage (default: ./sessions.json)\n */\n constructor(options: { path?: string } = {}) {\n this.filePath = options.path || './sessions.json';\n }\n\n /**\n * Initialize storage: ensure file exists and load into memory cache\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Ensure directory exists\n const dir = path.dirname(this.filePath);\n await fs.mkdir(dir, { recursive: true });\n\n // Try to read file\n const data = await fs.readFile(this.filePath, 'utf-8');\n const json = JSON.parse(data);\n\n this.memoryCache = new Map();\n this.credentialsCache = new Map();\n if (Array.isArray(json.sessions)) {\n json.sessions.forEach((s: Session) => {\n const session = normalizeStoredSession(s);\n this.memoryCache!.set(this.getSessionKey(session.userId || 'unknown', session.sessionId), session);\n });\n }\n if (Array.isArray(json.credentials)) {\n json.credentials.forEach((c: SessionCredentials) => {\n this.credentialsCache!.set(this.getSessionKey(c.userId, c.sessionId), c);\n });\n }\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n // File does not exist, initialize empty\n this.memoryCache = new Map();\n this.credentialsCache = new Map();\n await this.flush();\n } else {\n console.error('[FileStorage] Failed to load sessions:', error);\n throw error;\n }\n }\n\n this.initialized = true;\n console.log(`[mcp-ts][Storage] File: ✓ storage directory at ${path.dirname(this.filePath)} verified.`);\n }\n\n private async ensureInitialized() {\n if (!this.initialized) await this.init();\n }\n\n private async flush(): Promise<void> {\n if (!this.memoryCache || !this.credentialsCache) return;\n await fs.writeFile(this.filePath, JSON.stringify({\n sessions: Array.from(this.memoryCache.values()),\n credentials: Array.from(this.credentialsCache.values()),\n }, null, 2), 'utf-8');\n }\n\n private getSessionKey(userId: string, sessionId: string): string {\n return `${userId}:${sessionId}`;\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n async create(session: Session): Promise<void> {\n await this.ensureInitialized();\n const { sessionId, userId } = session;\n if (!sessionId || !userId) throw new Error('userId and sessionId required');\n\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (this.memoryCache!.has(sessionKey)) {\n throw new Error(`Session ${sessionId} already exists`);\n }\n\n this.memoryCache!.set(sessionKey, normalizeNewSession(session));\n await this.flush();\n }\n\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n await this.ensureInitialized();\n if (!userId || !sessionId) throw new Error('userId and sessionId required');\n\n const sessionKey = this.getSessionKey(userId, sessionId);\n const current = this.memoryCache!.get(sessionKey);\n\n if (!current) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const updated = mergeSessionUpdate(current, data);\n\n this.memoryCache!.set(sessionKey, updated);\n await this.flush();\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n await this.ensureInitialized();\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (!this.memoryCache!.has(sessionKey)) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const current = this.credentialsCache!.get(sessionKey) ?? { sessionId, userId };\n this.credentialsCache!.set(sessionKey, { ...current, ...data, sessionId, userId });\n await this.flush();\n }\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n await this.ensureInitialized();\n const sessionKey = this.getSessionKey(userId, sessionId);\n return this.memoryCache!.get(sessionKey) || null;\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n await this.ensureInitialized();\n const sessionKey = this.getSessionKey(userId, sessionId);\n if (!this.memoryCache!.has(sessionKey)) return null;\n return this.credentialsCache!.get(sessionKey) ?? { sessionId, userId };\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n await this.patchCredentials(userId, sessionId, {\n clientInformation: null,\n tokens: null,\n codeVerifier: null,\n clientId: null,\n oauthState: null,\n });\n }\n\n async list(userId: string): Promise<Session[]> {\n await this.ensureInitialized();\n return Array.from(this.memoryCache!.values()).filter(s => s.userId === userId);\n }\n\n async listIds(userId: string): Promise<string[]> {\n await this.ensureInitialized();\n return Array.from(this.memoryCache!.values())\n .filter(s => s.userId === userId)\n .map(s => s.sessionId);\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n await this.ensureInitialized();\n const sessionKey = this.getSessionKey(userId, sessionId);\n const deleted = this.memoryCache!.delete(sessionKey);\n this.credentialsCache!.delete(sessionKey);\n if (deleted) {\n await this.flush();\n }\n }\n\n async listAllIds(): Promise<string[]> {\n await this.ensureInitialized();\n return Array.from(this.memoryCache!.values()).map(s => s.sessionId);\n }\n\n async clearAll(): Promise<void> {\n await this.ensureInitialized();\n this.memoryCache!.clear();\n this.credentialsCache!.clear();\n await this.flush();\n }\n\n async cleanupExpired(): Promise<void> {\n await this.ensureInitialized();\n let changed = false;\n\n for (const [key, session] of this.memoryCache!.entries()) {\n if (!isSessionExpired(session)) continue;\n\n this.memoryCache!.delete(key);\n this.credentialsCache!.delete(key);\n changed = true;\n }\n\n if (changed) {\n await this.flush();\n }\n }\n\n async disconnect(): Promise<void> {\n // No explicit disconnect needed for file\n }\n}\n","import type { Database } from 'better-sqlite3';\nimport type { SessionStore, Session, SessionCredentials } from './types.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { generateSessionId } from '../../shared/utils.js';\nimport {\n mergeSessionUpdate,\n normalizeNewSession,\n normalizeStoredSession,\n isSessionExpired,\n} from './session-lifecycle.js';\n\nexport interface SqliteStorageOptions {\n path?: string;\n table?: string;\n}\n\nexport class SqliteStorage implements SessionStore {\n private db: Database | null = null;\n private table: string;\n private credentialsTable: string;\n private initialized = false;\n private dbPath: string;\n\n constructor(options: SqliteStorageOptions = {}) {\n this.dbPath = options.path || './sessions.db';\n this.table = options.table || 'mcp_sessions';\n this.credentialsTable = `${this.table}_credentials`;\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Dynamic import for peer dependency\n const DatabaseConstructor = (await import('better-sqlite3')).default;\n\n // Ensure directory exists\n const dir = path.dirname(this.dbPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n this.db = new DatabaseConstructor(this.dbPath);\n this.db.pragma('foreign_keys = ON');\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS ${this.table} (\n sessionId TEXT PRIMARY KEY,\n userId TEXT NOT NULL,\n data TEXT NOT NULL,\n expiresAt INTEGER\n );\n CREATE INDEX IF NOT EXISTS idx_${this.table}_userId ON ${this.table}(userId);\n CREATE TABLE IF NOT EXISTS ${this.credentialsTable} (\n sessionId TEXT NOT NULL,\n userId TEXT NOT NULL,\n data TEXT NOT NULL,\n PRIMARY KEY (userId, sessionId),\n FOREIGN KEY (sessionId) REFERENCES ${this.table}(sessionId) ON DELETE CASCADE\n );\n `);\n\n this.initialized = true;\n console.log(`[mcp-ts][Storage] SQLite: ✓ database at ${this.dbPath} verified.`);\n } catch (error: any) {\n if (error.code === 'MODULE_NOT_FOUND' || error.message?.includes('better-sqlite3')) {\n throw new Error(\n 'better-sqlite3 is not installed. Please install it with: npm install better-sqlite3'\n );\n }\n throw error;\n }\n }\n\n private ensureInitialized() {\n if (!this.initialized) {\n throw new Error('SqliteStorage not initialized. Call init() first.');\n }\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n async create(session: Session): Promise<void> {\n this.ensureInitialized();\n const { sessionId, userId } = session;\n\n if (!sessionId || !userId) {\n throw new Error('userId and sessionId required');\n }\n\n const sessionWithLifecycle = normalizeNewSession(session);\n\n try {\n const stmt = this.db!.prepare(\n `INSERT INTO ${this.table} (sessionId, userId, data, expiresAt) VALUES (?, ?, ?, ?)`\n );\n stmt.run(sessionId, userId, JSON.stringify(sessionWithLifecycle), sessionWithLifecycle.expiresAt ?? null);\n } catch (error: any) {\n if (error.code === 'SQLITE_CONSTRAINT_PRIMARYKEY') {\n throw new Error(`Session ${sessionId} already exists`);\n }\n throw error;\n }\n }\n\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n this.ensureInitialized();\n if (!sessionId || !userId) {\n throw new Error('userId and sessionId required');\n }\n\n const currentSession = await this.get(userId, sessionId);\n if (!currentSession) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n const updatedSession = mergeSessionUpdate(currentSession, data);\n\n const stmt = this.db!.prepare(\n `UPDATE ${this.table} SET data = ?, expiresAt = ? WHERE sessionId = ? AND userId = ?`\n );\n\n stmt.run(JSON.stringify(updatedSession), updatedSession.expiresAt ?? null, sessionId, userId);\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n this.ensureInitialized();\n if (!await this.get(userId, sessionId)) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n const current = await this.getCredentials(userId, sessionId) ?? { sessionId, userId };\n const credentials = { ...current, ...data, sessionId, userId };\n const stmt = this.db!.prepare(\n `INSERT INTO ${this.credentialsTable} (sessionId, userId, data)\n VALUES (?, ?, ?)\n ON CONFLICT(userId, sessionId) DO UPDATE SET data = excluded.data`\n );\n stmt.run(sessionId, userId, JSON.stringify(credentials));\n\n }\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n this.ensureInitialized();\n\n const stmt = this.db!.prepare(\n `SELECT data FROM ${this.table} WHERE sessionId = ? AND userId = ?`\n );\n const row = stmt.get(sessionId, userId) as { data: string } | undefined;\n\n if (!row) return null;\n return normalizeStoredSession(JSON.parse(row.data) as Session);\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n this.ensureInitialized();\n if (!await this.get(userId, sessionId)) return null;\n\n const stmt = this.db!.prepare(\n `SELECT data FROM ${this.credentialsTable} WHERE sessionId = ? AND userId = ?`\n );\n const row = stmt.get(sessionId, userId) as { data: string } | undefined;\n return row ? JSON.parse(row.data) as SessionCredentials : { sessionId, userId };\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n await this.patchCredentials(userId, sessionId, {\n clientInformation: null,\n tokens: null,\n codeVerifier: null,\n clientId: null,\n oauthState: null,\n });\n }\n\n async list(userId: string): Promise<Session[]> {\n this.ensureInitialized();\n\n const stmt = this.db!.prepare(\n `SELECT data FROM ${this.table} WHERE userId = ?`\n );\n const rows = stmt.all(userId) as { data: string }[];\n\n return rows.map(row => normalizeStoredSession(JSON.parse(row.data) as Session));\n }\n\n async listIds(userId: string): Promise<string[]> {\n this.ensureInitialized();\n\n const stmt = this.db!.prepare(\n `SELECT sessionId FROM ${this.table} WHERE userId = ?`\n );\n const rows = stmt.all(userId) as { sessionId: string }[];\n\n return rows.map(row => row.sessionId);\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n this.ensureInitialized();\n const stmt = this.db!.prepare(\n `DELETE FROM ${this.table} WHERE sessionId = ? AND userId = ?`\n );\n this.db!.prepare(\n `DELETE FROM ${this.credentialsTable} WHERE sessionId = ? AND userId = ?`\n ).run(sessionId, userId);\n stmt.run(sessionId, userId);\n }\n\n async listAllIds(): Promise<string[]> {\n this.ensureInitialized();\n const stmt = this.db!.prepare(`SELECT sessionId FROM ${this.table}`);\n const rows = stmt.all() as { sessionId: string }[];\n return rows.map(row => row.sessionId);\n }\n\n async clearAll(): Promise<void> {\n this.ensureInitialized();\n this.db!.prepare(`DELETE FROM ${this.credentialsTable}`).run();\n const stmt = this.db!.prepare(`DELETE FROM ${this.table}`);\n stmt.run();\n }\n\n async cleanupExpired(): Promise<void> {\n this.ensureInitialized();\n const rows = this.db!.prepare(`SELECT sessionId, userId, data FROM ${this.table}`).all() as {\n sessionId: string;\n userId: string;\n data: string;\n }[];\n const deleteStmt = this.db!.prepare(`DELETE FROM ${this.table} WHERE sessionId = ? AND userId = ?`);\n\n for (const row of rows) {\n const session = normalizeStoredSession(JSON.parse(row.data) as Session);\n if (isSessionExpired(session)) {\n deleteStmt.run(row.sessionId, row.userId);\n }\n }\n\n this.db!.prepare(\n `DELETE FROM ${this.credentialsTable}\n WHERE NOT EXISTS (\n SELECT 1 FROM ${this.table}\n WHERE ${this.table}.sessionId = ${this.credentialsTable}.sessionId\n AND ${this.table}.userId = ${this.credentialsTable}.userId\n )`\n ).run();\n }\n\n async disconnect(): Promise<void> {\n if (this.db) {\n this.db.close();\n }\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { SessionStore, Session, SessionCredentials } from './types.js';\nimport { generateSessionId } from '../../shared/utils.js';\nimport { encryptObject, decryptObject } from './crypto.js';\nimport { resolveSessionExpiresAt } from './session-lifecycle.js';\nimport { DORMANT_SESSION_EXPIRATION_MS } from '../../shared/constants.js';\n\nexport class SupabaseStorageBackend implements SessionStore {\n constructor(private supabase: SupabaseClient) {}\n\n async init(): Promise<void> {\n await this.assertTable('mcp_sessions', 'session_id');\n await this.assertTable('mcp_credentials', 'session_id');\n console.log('[mcp-ts][Storage] Supabase: storage tables verified.');\n }\n\n private async assertTable(table: string, column: string): Promise<void> {\n const { error } = await this.supabase\n .from(table)\n .select(column)\n .limit(0);\n\n if (!error) return;\n\n if (error.code === '42P01') {\n throw new Error(\n `[SupabaseStorage] Table \"${table}\" not found in your database. ` +\n 'Please run \"npx mcp-ts supabase-init\" to set up the required storage schema.'\n );\n }\n\n throw new Error(`[SupabaseStorage] Initialization check failed for \"${table}\": ${error.message}`);\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n private mapRowToSessionData(row: any): Session {\n return {\n sessionId: row.session_id,\n serverId: row.server_id,\n serverName: row.server_name,\n serverUrl: row.server_url,\n transportType: row.transport_type,\n callbackUrl: row.callback_url,\n createdAt: new Date(row.created_at).getTime(),\n updatedAt: new Date(row.updated_at ?? row.created_at).getTime(),\n expiresAt: row.expires_at ? new Date(row.expires_at).getTime() : null,\n userId: row.user_id,\n headers: decryptObject(row.headers),\n authUrl: row.auth_url,\n status: row.status ?? 'pending',\n };\n }\n\n private mapRowToCredentials(row: any, userId: string, sessionId: string): SessionCredentials {\n return {\n sessionId,\n userId,\n clientInformation: decryptObject(row?.client_information),\n tokens: decryptObject(row?.tokens),\n codeVerifier: decryptObject(row?.code_verifier),\n clientId: row?.client_id,\n oauthState: row?.oauth_state,\n };\n }\n\n private hasCredentialData(data: Partial<SessionCredentials>): boolean {\n return (\n 'clientInformation' in data ||\n 'tokens' in data ||\n 'codeVerifier' in data ||\n 'clientId' in data ||\n 'oauthState' in data\n );\n }\n\n async create(session: Session): Promise<void> {\n const { sessionId, userId } = session;\n if (!sessionId || !userId) throw new Error('userId and sessionId required');\n\n const status = session.status ?? 'pending';\n const createdAt = new Date(session.createdAt || Date.now()).toISOString();\n const updatedAt = new Date(session.updatedAt ?? session.createdAt ?? Date.now()).toISOString();\n const expiresAt = resolveSessionExpiresAt(status, new Date(createdAt).getTime());\n\n const { error } = await this.supabase\n .from('mcp_sessions')\n .insert({\n session_id: sessionId,\n user_id: userId,\n server_id: session.serverId,\n server_name: session.serverName,\n server_url: session.serverUrl,\n transport_type: session.transportType,\n callback_url: session.callbackUrl,\n created_at: createdAt,\n updated_at: updatedAt,\n headers: encryptObject(session.headers),\n auth_url: session.authUrl ?? null,\n status,\n expires_at: expiresAt === null ? null : new Date(expiresAt).toISOString(),\n });\n\n if (error) {\n if (error.code === '23505') {\n throw new Error(`Session ${sessionId} already exists`);\n }\n throw new Error(`Failed to create session in Supabase: ${error.message}`);\n }\n\n }\n\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n const updateData: any = {\n updated_at: new Date().toISOString(),\n };\n\n if ('serverId' in data) updateData.server_id = data.serverId;\n if ('serverName' in data) updateData.server_name = data.serverName;\n if ('serverUrl' in data) updateData.server_url = data.serverUrl;\n if ('transportType' in data) updateData.transport_type = data.transportType;\n if ('callbackUrl' in data) updateData.callback_url = data.callbackUrl;\n if ('status' in data) {\n const status = data.status ?? 'pending';\n const expiresAt = resolveSessionExpiresAt(status);\n updateData.status = status;\n updateData.expires_at = expiresAt === null ? null : new Date(expiresAt).toISOString();\n }\n if ('headers' in data) updateData.headers = encryptObject(data.headers);\n if ('authUrl' in data) updateData.auth_url = data.authUrl ?? null;\n\n const shouldUpdateSession = Object.keys(updateData).some((key) => key !== 'updated_at');\n\n let updatedRows: any[] | null = null;\n if (shouldUpdateSession) {\n const result = await this.supabase\n .from('mcp_sessions')\n .update(updateData)\n .eq('user_id', userId)\n .eq('session_id', sessionId)\n .select('id');\n\n if (result.error) {\n throw new Error(`Failed to update session: ${result.error.message}`);\n }\n updatedRows = result.data;\n } else {\n const result = await this.supabase\n .from('mcp_sessions')\n .select('id')\n .eq('user_id', userId)\n .eq('session_id', sessionId);\n\n if (result.error) {\n throw new Error(`Failed to update session: ${result.error.message}`);\n }\n updatedRows = result.data;\n }\n\n if (!updatedRows || updatedRows.length === 0) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n if (!this.hasCredentialData(data)) return;\n\n const row: any = {\n user_id: userId,\n session_id: sessionId,\n updated_at: new Date().toISOString(),\n };\n\n if ('clientInformation' in data) row.client_information = data.clientInformation == null ? null : encryptObject(data.clientInformation);\n if ('tokens' in data) row.tokens = data.tokens == null ? null : encryptObject(data.tokens);\n if ('codeVerifier' in data) row.code_verifier = data.codeVerifier == null ? null : encryptObject(data.codeVerifier);\n if ('clientId' in data) row.client_id = data.clientId ?? null;\n if ('oauthState' in data) row.oauth_state = data.oauthState ?? null;\n\n const { error } = await this.supabase\n .from('mcp_credentials')\n .upsert(row, { onConflict: 'user_id,session_id' });\n\n if (error) {\n throw new Error(`Failed to update credentials: ${error.message}`);\n }\n\n }\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n const { data, error } = await this.supabase\n .from('mcp_sessions')\n .select('*')\n .eq('user_id', userId)\n .eq('session_id', sessionId)\n .maybeSingle();\n\n if (error) {\n console.error('[SupabaseStorage] Failed to get session:', error);\n return null;\n }\n\n if (!data) return null;\n\n return this.mapRowToSessionData(data);\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n const { data, error } = await this.supabase\n .from('mcp_credentials')\n .select('*')\n .eq('user_id', userId)\n .eq('session_id', sessionId)\n .maybeSingle();\n\n if (error) {\n console.error('[SupabaseStorage] Failed to get credentials:', error);\n return null;\n }\n\n if (data) {\n return this.mapRowToCredentials(data, userId, sessionId);\n }\n\n const { data: sessionRows, error: sessionError } = await this.supabase\n .from('mcp_sessions')\n .select('id')\n .eq('user_id', userId)\n .eq('session_id', sessionId);\n\n if (sessionError || !sessionRows || sessionRows.length === 0) {\n return null;\n }\n\n return { sessionId, userId };\n }\n\n async list(userId: string): Promise<Session[]> {\n const { data, error } = await this.supabase\n .from('mcp_sessions')\n .select('*')\n .eq('user_id', userId);\n\n if (error) {\n console.error(`[SupabaseStorage] Failed to get session data for ${userId}:`, error);\n return [];\n }\n\n return data.map(row => this.mapRowToSessionData(row));\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n const { error } = await this.supabase\n .from('mcp_credentials')\n .delete()\n .eq('user_id', userId)\n .eq('session_id', sessionId);\n\n if (error) {\n throw new Error(`Failed to clear credentials: ${error.message}`);\n }\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n const { error } = await this.supabase\n .from('mcp_sessions')\n .delete()\n .eq('user_id', userId)\n .eq('session_id', sessionId);\n\n if (error) {\n console.error('[SupabaseStorage] Failed to remove session:', error);\n }\n }\n\n async listIds(userId: string): Promise<string[]> {\n const { data, error } = await this.supabase\n .from('mcp_sessions')\n .select('session_id')\n .eq('user_id', userId);\n\n if (error) {\n console.error(`[SupabaseStorage] Failed to get sessions for ${userId}:`, error);\n return [];\n }\n\n return data.map(row => row.session_id);\n }\n\n async listAllIds(): Promise<string[]> {\n const { data, error } = await this.supabase\n .from('mcp_sessions')\n .select('session_id');\n\n if (error) {\n console.error('[SupabaseStorage] Failed to get all sessions:', error);\n return [];\n }\n\n return data.map(row => row.session_id);\n }\n\n async clearAll(): Promise<void> {\n const { error: credentialsError } = await this.supabase\n .from('mcp_credentials')\n .delete()\n .neq('session_id', '');\n\n if (credentialsError) {\n console.error('[SupabaseStorage] Failed to clear credentials:', credentialsError);\n }\n\n const { error } = await this.supabase\n .from('mcp_sessions')\n .delete()\n .neq('session_id', '');\n\n if (error) {\n console.error('[SupabaseStorage] Failed to clear sessions:', error);\n }\n }\n\n async cleanupExpired(): Promise<void> {\n const { error: transientError } = await this.supabase\n .from('mcp_sessions')\n .delete()\n .not('expires_at', 'is', null)\n .neq('status', 'active')\n .lt('expires_at', new Date().toISOString());\n\n if (transientError) {\n console.error('[SupabaseStorage] Failed to cleanup expired inactive sessions:', transientError);\n }\n\n const dormantCutoff = new Date(Date.now() - DORMANT_SESSION_EXPIRATION_MS).toISOString();\n const { error: dormantError } = await this.supabase\n .from('mcp_sessions')\n .delete()\n .eq('status', 'active')\n .lt('updated_at', dormantCutoff);\n\n if (dormantError) {\n console.error('[SupabaseStorage] Failed to cleanup dormant active sessions:', dormantError);\n }\n }\n\n async disconnect(): Promise<void> {\n // Supabase client handles its own connection pooling over HTTP.\n }\n}\n","import { randomBytes, createCipheriv, createDecipheriv } from 'node:crypto';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst IV_LENGTH = 12;\nconst ENCRYPTION_PREFIX = 'enc:1:';\n\nlet warningLogged = false;\n\nfunction getKey(): Buffer | null {\n const keyString = process.env.STORAGE_ENCRYPTION_KEY;\n if (!keyString) return null;\n \n // Ensure key is 32 bytes (256 bits)\n if (keyString.length === 64) {\n return Buffer.from(keyString, 'hex');\n } else {\n const keyBuffer = Buffer.alloc(32);\n keyBuffer.write(keyString, 0, 32, 'utf-8');\n return keyBuffer;\n }\n}\n\n/**\n * Encrypts an object into a secure string.\n * Falls back to returning the original object if the encryption key is missing or encryption fails.\n */\nexport function encryptObject(data: any): any {\n if (data === undefined || data === null) return data;\n \n const key = getKey();\n if (!key) {\n if (!warningLogged) {\n console.warn('[mcp-ts][Storage] WARNING: STORAGE_ENCRYPTION_KEY is not set. Saving sensitive data in plain-text.');\n warningLogged = true;\n }\n return data; // Fallback to plain-text\n }\n\n try {\n const text = JSON.stringify(data);\n const iv = randomBytes(IV_LENGTH);\n const cipher = createCipheriv(ALGORITHM, key, iv);\n \n let encrypted = cipher.update(text, 'utf-8', 'hex');\n encrypted += cipher.final('hex');\n const authTag = cipher.getAuthTag().toString('hex');\n \n return `${ENCRYPTION_PREFIX}${iv.toString('hex')}:${authTag}:${encrypted}`;\n } catch (e) {\n console.error('[mcp-ts][Storage] Encryption failed, falling back to plain-text.', e);\n return data;\n }\n}\n\n/**\n * Decrypts a secure string back into an object.\n * Returns the original data if it is unencrypted or if decryption fails.\n */\nexport function decryptObject(data: any): any {\n if (data === undefined || data === null) return data;\n if (typeof data !== 'string' || !data.startsWith(ENCRYPTION_PREFIX)) {\n return data; // Already unencrypted or old plain-text data\n }\n\n const key = getKey();\n if (!key) {\n console.warn('[mcp-ts][Storage] WARNING: Found encrypted data but STORAGE_ENCRYPTION_KEY is missing. Returning raw encrypted string.');\n return data;\n }\n\n try {\n const parts = data.split(':');\n if (parts.length !== 5) {\n return data;\n }\n\n const iv = Buffer.from(parts[2], 'hex');\n const authTag = Buffer.from(parts[3], 'hex');\n const encryptedText = parts[4];\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n\n let decrypted = decipher.update(encryptedText, 'hex', 'utf-8');\n decrypted += decipher.final('utf-8');\n\n return JSON.parse(decrypted);\n } catch (e) {\n console.error('[mcp-ts][Storage] Decryption failed.', e);\n return data;\n }\n}\n","import type { SessionStore, Session, SessionCredentials } from './types.js';\nimport type { SessionStatus } from './types.js';\nimport { DORMANT_SESSION_EXPIRATION_MS } from '../../shared/constants.js';\nimport { generateSessionId } from '../../shared/utils.js';\nimport { encryptObject, decryptObject } from './crypto.js';\nimport { resolveSessionExpiresAt } from './session-lifecycle.js';\n\nexport interface NeonStorageOptions {\n schema?: string;\n table?: string;\n credentialsTable?: string;\n}\n\ntype NeonSql = {\n query(queryWithPlaceholders: string, params?: unknown[]): Promise<any[]>;\n};\n\ntype NeonSessionRow = {\n id?: string;\n session_id: string;\n server_id?: string | null;\n server_name?: string | null;\n server_url: string;\n transport_type: 'sse' | 'streamable-http';\n callback_url: string;\n created_at: string | Date;\n updated_at?: string | Date | null;\n expires_at?: string | Date | null;\n user_id: string;\n headers?: unknown;\n auth_url?: string | null;\n status?: SessionStatus | null;\n};\n\ntype NeonCredentialsRow = {\n session_id: string;\n user_id: string;\n client_information?: unknown;\n tokens?: unknown;\n code_verifier?: unknown;\n client_id?: string | null;\n oauth_state?: unknown;\n};\n\nexport class NeonStorageBackend implements SessionStore {\n private readonly tableName: string;\n private readonly credentialsTableName: string;\n\n constructor(\n private readonly sql: NeonSql,\n options: NeonStorageOptions = {}\n ) {\n const schema = options.schema || 'public';\n const table = options.table || 'mcp_sessions';\n const credentialsTable = options.credentialsTable || 'mcp_credentials';\n this.tableName = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(table)}`;\n this.credentialsTableName = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(credentialsTable)}`;\n }\n\n async init(): Promise<void> {\n await this.assertTable(this.tableName, 'mcp_sessions');\n await this.assertTable(this.credentialsTableName, 'mcp_credentials');\n console.log('[mcp-ts][Storage] Neon: storage tables verified.');\n }\n\n private async assertTable(qualifiedName: string, displayName: string): Promise<void> {\n const [{ exists } = { exists: null }] = await this.sql.query(\n 'SELECT to_regclass($1) AS exists',\n [qualifiedName.replace(/\"/g, '')]\n ) as Array<{ exists: string | null }>;\n\n if (!exists) {\n throw new Error(\n `[NeonStorage] Table \"${displayName}\" not found in your database. ` +\n 'Please create it using the Neon storage guide in docs/storage-backends/neon.md.'\n );\n }\n }\n\n generateSessionId(): string {\n return generateSessionId();\n }\n\n private quoteIdentifier(identifier: string): string {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {\n throw new Error(`Invalid Neon storage identifier: ${identifier}`);\n }\n return `\"${identifier}\"`;\n }\n\n private mapRowToSessionData(row: NeonSessionRow): Session {\n return {\n sessionId: row.session_id,\n serverId: row.server_id ?? undefined,\n serverName: row.server_name ?? undefined,\n serverUrl: row.server_url,\n transportType: row.transport_type,\n callbackUrl: row.callback_url,\n createdAt: new Date(row.created_at).getTime(),\n updatedAt: new Date(row.updated_at ?? row.created_at).getTime(),\n expiresAt: row.expires_at ? new Date(row.expires_at).getTime() : null,\n userId: row.user_id,\n headers: decryptObject(row.headers),\n authUrl: row.auth_url ?? undefined,\n status: row.status ?? 'pending',\n };\n }\n\n private mapRowToCredentials(row: NeonCredentialsRow, userId: string, sessionId: string): SessionCredentials {\n return {\n sessionId,\n userId,\n clientInformation: decryptObject(row.client_information),\n tokens: decryptObject(row.tokens),\n codeVerifier: decryptObject(row.code_verifier),\n clientId: row.client_id ?? undefined,\n oauthState: row.oauth_state as SessionCredentials['oauthState'],\n };\n }\n\n private hasCredentialData(data: Partial<SessionCredentials>): boolean {\n return (\n 'clientInformation' in data ||\n 'tokens' in data ||\n 'codeVerifier' in data ||\n 'clientId' in data ||\n 'oauthState' in data\n );\n }\n\n async create(session: Session): Promise<void> {\n const { sessionId, userId } = session;\n if (!sessionId || !userId) throw new Error('userId and sessionId required');\n\n const status = session.status ?? 'pending';\n const createdAt = new Date(session.createdAt || Date.now()).toISOString();\n const updatedAt = new Date(session.updatedAt ?? session.createdAt ?? Date.now()).toISOString();\n const expiresAt = resolveSessionExpiresAt(status, new Date(createdAt).getTime());\n\n try {\n await this.sql.query(\n `INSERT INTO ${this.tableName} (\n session_id,\n user_id,\n server_id,\n server_name,\n server_url,\n transport_type,\n callback_url,\n created_at,\n updated_at,\n headers,\n auth_url,\n status,\n expires_at\n ) VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8,\n $9, $10, $11, $12, $13\n )`,\n [\n sessionId,\n userId,\n session.serverId,\n session.serverName,\n session.serverUrl,\n session.transportType,\n session.callbackUrl,\n createdAt,\n updatedAt,\n encryptObject(session.headers),\n session.authUrl ?? null,\n status,\n expiresAt === null ? null : new Date(expiresAt).toISOString(),\n ]\n );\n } catch (error: any) {\n if (error.code === '23505') {\n throw new Error(`Session ${sessionId} already exists`);\n }\n throw new Error(`Failed to create session in Neon: ${error.message}`);\n }\n\n }\n\n async update(userId: string, sessionId: string, data: Partial<Session>): Promise<void> {\n const currentSession = await this.get(userId, sessionId);\n if (!currentSession) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n\n const updatedSession = { ...currentSession, ...data };\n const status = updatedSession.status ?? 'pending';\n const expiresAt = resolveSessionExpiresAt(status);\n\n const shouldUpdateSession = (\n 'serverId' in data ||\n 'serverName' in data ||\n 'serverUrl' in data ||\n 'transportType' in data ||\n 'callbackUrl' in data ||\n 'status' in data ||\n 'headers' in data ||\n 'authUrl' in data\n );\n\n if (shouldUpdateSession) {\n const updatedRows = await this.sql.query(\n `UPDATE ${this.tableName}\n SET\n server_id = $1,\n server_name = $2,\n server_url = $3,\n transport_type = $4,\n callback_url = $5,\n status = $6,\n headers = $7,\n auth_url = $8,\n expires_at = $9,\n updated_at = now()\n WHERE user_id = $10 AND session_id = $11\n RETURNING id`,\n [\n updatedSession.serverId,\n updatedSession.serverName,\n updatedSession.serverUrl,\n updatedSession.transportType,\n updatedSession.callbackUrl,\n status,\n encryptObject(updatedSession.headers),\n updatedSession.authUrl ?? null,\n expiresAt === null ? null : new Date(expiresAt).toISOString(),\n userId,\n sessionId,\n ]\n ) as Array<{ id: string }>;\n\n if (updatedRows.length === 0) {\n throw new Error(`Session ${sessionId} not found for userId ${userId}`);\n }\n }\n\n }\n\n async patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void> {\n if (!this.hasCredentialData(data)) return;\n\n await this.sql.query(\n `INSERT INTO ${this.credentialsTableName} (\n user_id,\n session_id,\n client_information,\n tokens,\n code_verifier,\n client_id,\n oauth_state,\n updated_at\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, now())\n ON CONFLICT (user_id, session_id)\n DO UPDATE SET\n client_information = CASE WHEN $8 THEN EXCLUDED.client_information ELSE ${this.credentialsTableName}.client_information END,\n tokens = CASE WHEN $9 THEN EXCLUDED.tokens ELSE ${this.credentialsTableName}.tokens END,\n code_verifier = CASE WHEN $10 THEN EXCLUDED.code_verifier ELSE ${this.credentialsTableName}.code_verifier END,\n client_id = CASE WHEN $11 THEN EXCLUDED.client_id ELSE ${this.credentialsTableName}.client_id END,\n oauth_state = CASE WHEN $12 THEN EXCLUDED.oauth_state ELSE ${this.credentialsTableName}.oauth_state END,\n updated_at = now()`,\n [\n userId,\n sessionId,\n 'clientInformation' in data ? (data.clientInformation == null ? null : encryptObject(data.clientInformation)) : null,\n 'tokens' in data ? (data.tokens == null ? null : encryptObject(data.tokens)) : null,\n 'codeVerifier' in data ? (data.codeVerifier == null ? null : encryptObject(data.codeVerifier)) : null,\n 'clientId' in data ? (data.clientId ?? null) : null,\n 'oauthState' in data ? (data.oauthState ?? null) : null,\n 'clientInformation' in data,\n 'tokens' in data,\n 'codeVerifier' in data,\n 'clientId' in data,\n 'oauthState' in data,\n ]\n );\n\n }\n\n async get(userId: string, sessionId: string): Promise<Session | null> {\n try {\n const rows = await this.sql.query(\n `SELECT * FROM ${this.tableName} WHERE user_id = $1 AND session_id = $2`,\n [userId, sessionId]\n ) as NeonSessionRow[];\n\n if (!rows[0]) return null;\n\n return this.mapRowToSessionData(rows[0]);\n } catch (error) {\n console.error('[NeonStorage] Failed to get session:', error);\n return null;\n }\n }\n\n async getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null> {\n try {\n const credentialRows = await this.sql.query(\n `SELECT * FROM ${this.credentialsTableName} WHERE user_id = $1 AND session_id = $2`,\n [userId, sessionId]\n ) as NeonCredentialsRow[];\n\n if (credentialRows[0]) {\n return this.mapRowToCredentials(credentialRows[0], userId, sessionId);\n }\n\n const sessionRows = await this.sql.query(\n `SELECT id FROM ${this.tableName} WHERE user_id = $1 AND session_id = $2`,\n [userId, sessionId]\n ) as Array<{ id: string }>;\n\n return sessionRows[0] ? { sessionId, userId } : null;\n } catch (error) {\n console.error('[NeonStorage] Failed to get credentials:', error);\n return null;\n }\n }\n\n async list(userId: string): Promise<Session[]> {\n try {\n const rows = await this.sql.query(\n `SELECT * FROM ${this.tableName} WHERE user_id = $1`,\n [userId]\n ) as NeonSessionRow[];\n return rows.map((row) => this.mapRowToSessionData(row));\n } catch (error) {\n console.error(`[NeonStorage] Failed to get session data for ${userId}:`, error);\n return [];\n }\n }\n\n async clearCredentials(userId: string, sessionId: string): Promise<void> {\n try {\n await this.sql.query(\n `DELETE FROM ${this.credentialsTableName} WHERE user_id = $1 AND session_id = $2`,\n [userId, sessionId]\n );\n } catch (error) {\n console.error('[NeonStorage] Failed to clear credentials:', error);\n }\n }\n\n async delete(userId: string, sessionId: string): Promise<void> {\n try {\n await this.sql.query(\n `DELETE FROM ${this.tableName} WHERE user_id = $1 AND session_id = $2`,\n [userId, sessionId]\n );\n } catch (error) {\n console.error('[NeonStorage] Failed to remove session:', error);\n }\n }\n\n async listIds(userId: string): Promise<string[]> {\n try {\n const rows = await this.sql.query(\n `SELECT session_id FROM ${this.tableName} WHERE user_id = $1`,\n [userId]\n ) as Array<{ session_id: string }>;\n return rows.map((row) => row.session_id);\n } catch (error) {\n console.error(`[NeonStorage] Failed to get sessions for ${userId}:`, error);\n return [];\n }\n }\n\n async listAllIds(): Promise<string[]> {\n try {\n const rows = await this.sql.query(\n `SELECT session_id FROM ${this.tableName}`\n ) as Array<{ session_id: string }>;\n return rows.map((row) => row.session_id);\n } catch (error) {\n console.error('[NeonStorage] Failed to get all sessions:', error);\n return [];\n }\n }\n\n async clearAll(): Promise<void> {\n try {\n await this.sql.query(`DELETE FROM ${this.credentialsTableName}`);\n await this.sql.query(`DELETE FROM ${this.tableName}`);\n } catch (error) {\n console.error('[NeonStorage] Failed to clear sessions:', error);\n }\n }\n\n async cleanupExpired(): Promise<void> {\n try {\n await this.sql.query(\n `DELETE FROM ${this.tableName}\n WHERE expires_at IS NOT NULL\n AND expires_at < $1\n AND status <> 'active'`,\n [new Date().toISOString()]\n );\n await this.sql.query(\n `DELETE FROM ${this.tableName}\n WHERE status = 'active' AND updated_at < $1`,\n [new Date(Date.now() - DORMANT_SESSION_EXPIRATION_MS).toISOString()]\n );\n } catch (error) {\n console.error('[NeonStorage] Failed to cleanup expired sessions:', error);\n }\n }\n\n async disconnect(): Promise<void> {\n // Neon HTTP queries do not hold a persistent connection.\n }\n}\n","\nimport type { MCPClient } from '../mcp/oauth-client.js';\nimport type {\n OAuthTokens,\n OAuthClientInformationMixed,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nexport interface OAuthState {\n nonce: string;\n sessionId: string;\n serverId: string;\n createdAt: number;\n}\n\nexport type SessionStatus = 'pending' | 'active';\n\nexport interface Session {\n sessionId: string;\n serverId?: string; // Database server ID for mapping\n serverName?: string;\n serverUrl: string;\n transportType: 'sse' | 'streamable-http';\n callbackUrl: string;\n createdAt: number;\n updatedAt?: number;\n /**\n * Storage-owned expiration timestamp for pending/inactive sessions.\n * Active sessions use updatedAt-based dormancy cleanup instead.\n */\n expiresAt?: number | null;\n userId: string;\n headers?: Record<string, string>;\n authUrl?: string | null;\n /**\n * Session status marker used for lifecycle cleanup:\n * - pending: short-lived intermediate/auth-pending session state\n * - active: restorable session after successful connection/auth completion\n */\n status?: SessionStatus;\n}\n\nexport interface SessionCredentials {\n sessionId: string;\n userId: string;\n clientInformation?: OAuthClientInformationMixed | null;\n tokens?: OAuthTokens | null;\n codeVerifier?: string | null;\n clientId?: string | null;\n oauthState?: OAuthState | null;\n}\n\nexport type SessionMutationType = 'create' | 'update' | 'delete';\n\nexport interface SessionMutationEvent {\n type: SessionMutationType;\n userId: string;\n sessionId: string;\n timestamp: number;\n session?: Session;\n patch?: Partial<Session>;\n}\n\nexport type SessionMutationListener = (event: SessionMutationEvent) => void | Promise<void>;\n\nexport interface SetClientOptions {\n sessionId: string;\n serverId?: string; // Database server ID\n serverName?: string; // Human-readable server name\n client?: MCPClient;\n serverUrl?: string;\n callbackUrl?: string;\n transportType?: 'sse' | 'streamable-http';\n userId?: string;\n headers?: Record<string, string>;\n}\n\n/**\n * Interface for MCP session stores.\n */\nexport interface SessionStore {\n /**\n * Optional initialization (e.g., database connection)\n */\n init?(): Promise<void>;\n\n /**\n * Generates a unique session ID\n */\n generateSessionId(): string;\n\n /**\n * Creates a new session. Throws if session already exists.\n * @param session - Session data to create\n */\n create(session: Session): Promise<void>;\n\n /**\n * Updates an existing session with partial data. Throws if session does not exist.\n * @param userId - User identifier\n * @param sessionId - Session identifier\n * @param data - Partial session data to update\n */\n update(userId: string, sessionId: string, data: Partial<Session>): Promise<void>;\n\n /**\n * Patches runtime credentials for an existing session.\n * These values are separated from connection metadata in durable SQL stores.\n */\n patchCredentials(userId: string, sessionId: string, data: Partial<SessionCredentials>): Promise<void>;\n\n /**\n * Retrieves a session\n */\n get(userId: string, sessionId: string): Promise<Session | null>;\n\n /**\n * Retrieves runtime credentials for a session.\n */\n getCredentials(userId: string, sessionId: string): Promise<SessionCredentials | null>;\n\n /**\n * Clears runtime credentials without removing connection metadata.\n */\n clearCredentials(userId: string, sessionId: string): Promise<void>;\n\n /**\n * Gets full session data for all sessions owned by a user\n */\n list(userId: string): Promise<Session[]>;\n\n /**\n * Removes a session\n */\n delete(userId: string, sessionId: string): Promise<void>;\n\n /**\n * Gets all session IDs owned by a user\n */\n listIds(userId: string): Promise<string[]>;\n\n /**\n * Gets all session IDs across all users (Admin)\n */\n listAllIds(): Promise<string[]>;\n\n /**\n * Clears all sessions (Admin)\n */\n clearAll(): Promise<void>;\n\n /**\n * Clean up expired sessions\n */\n cleanupExpired(): Promise<void>;\n\n /**\n * Disconnect from storage backend\n */\n disconnect(): Promise<void>;\n}\n","/**\n * Simple event emitter pattern for MCP connection events\n * Inspired by Cloudflare's agents pattern but adapted for serverless\n */\n\nexport type Disposable = {\n dispose(): void;\n};\n\nexport type Event<T> = (listener: (event: T) => void) => Disposable;\n\n/**\n * Event emitter class for type-safe event handling\n * Similar to Cloudflare's Emitter but simplified for our use case\n */\nexport class Emitter<T> {\n private listeners: Set<(event: T) => void> = new Set();\n\n /**\n * Subscribe to events\n * @param listener - Callback function to handle events\n * @returns Disposable to unsubscribe\n */\n get event(): Event<T> {\n return (listener: (event: T) => void) => {\n this.listeners.add(listener);\n return {\n dispose: () => {\n this.listeners.delete(listener);\n },\n };\n };\n }\n\n /**\n * Fire an event to all listeners\n * @param event - Event data to emit\n */\n fire(event: T): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('[Emitter] Error in event listener:', error);\n }\n }\n }\n\n /**\n * Clear all listeners\n */\n dispose(): void {\n this.listeners.clear();\n }\n\n /**\n * Get number of active listeners\n */\n get listenerCount(): number {\n return this.listeners.size;\n }\n}\n\n/**\n * Connection state types matching your existing ConnectionStatus\n * Extended with more granular states for better observability\n */\nexport type McpConnectionState =\n | 'DISCONNECTED' // Not connected\n | 'CONNECTING' // Establishing transport connection to MCP server\n | 'AUTHENTICATING' // OAuth flow in progress\n | 'AUTHENTICATED' // OAuth complete, pre-connect\n | 'DISCOVERING' // Discovering server capabilities (tools, resources, prompts)\n | 'CONNECTED' // Transport connection established\n | 'READY' // Fully connected and ready to use\n | 'VALIDATING' // Validating existing session\n | 'RECONNECTING' // Attempting to reconnect\n | 'INITIALIZING' // Initializing session or connection\n | 'FAILED'; // Connection error at some point\n\n/**\n * MCP Connection Event Types\n * Discriminated union for type-safe event handling\n */\nexport type McpConnectionEvent =\n | {\n type: 'state_changed';\n sessionId: string;\n serverId: string;\n serverName: string;\n serverUrl: string;\n createdAt?: number;\n state: McpConnectionState;\n previousState: McpConnectionState;\n timestamp: number;\n }\n | {\n type: 'tools_discovered';\n sessionId: string;\n serverId: string;\n toolCount: number;\n tools: any[];\n timestamp: number;\n }\n | {\n type: 'auth_required';\n sessionId: string;\n serverId: string;\n authUrl: string;\n timestamp: number;\n }\n | {\n type: 'error';\n sessionId: string;\n serverId: string;\n error: string;\n errorType: 'connection' | 'auth' | 'validation' | 'unknown';\n timestamp: number;\n }\n | {\n type: 'disconnected';\n sessionId: string;\n serverId: string;\n timestamp: number;\n }\n | {\n type: 'progress';\n sessionId: string;\n serverId: string;\n message: string;\n timestamp: number;\n };\n\n/**\n * Event fired when a tool execution returns a UI resource URI\n */\nexport interface McpAppsUIEvent {\n type: 'mcp-apps-ui';\n sessionId: string;\n resourceUri: string;\n toolName: string;\n result: unknown;\n timestamp: number;\n}\n\n/**\n * Observability event for debugging and monitoring\n */\nexport interface McpObservabilityEvent {\n type?: string;\n level?: 'debug' | 'info' | 'warn' | 'error';\n message?: string;\n displayMessage?: string;\n sessionId?: string;\n serverId?: string;\n payload?: Record<string, any>;\n metadata?: Record<string, any>; // Kept for backward compatibility\n timestamp: number;\n id?: string;\n}\n\n/**\n * DisposableStore for managing multiple disposables\n * Useful for cleanup in React hooks\n */\nexport class DisposableStore {\n private disposables: Set<Disposable> = new Set();\n\n add(disposable: Disposable): void {\n this.disposables.add(disposable);\n }\n\n dispose(): void {\n for (const disposable of this.disposables) {\n disposable.dispose();\n }\n this.disposables.clear();\n }\n}\n","/**\n * Standardized error classes for MCP Redis library\n * Provides consistent error handling across the codebase\n */\n\n/**\n * Base error class for all MCP-related errors\n */\nexport class McpError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = 'McpError';\n // Maintain proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n ...(this.cause ? { cause: this.cause.message } : {}),\n };\n }\n}\n\n/**\n * Thrown when OAuth authorization is required\n */\nexport class UnauthorizedError extends McpError {\n constructor(message: string = 'OAuth authorization required', cause?: Error) {\n super('UNAUTHORIZED', message, cause);\n this.name = 'UnauthorizedError';\n }\n}\n\n/**\n * Thrown when connection to MCP server fails\n */\nexport class ConnectionError extends McpError {\n constructor(message: string, cause?: Error) {\n super('CONNECTION_ERROR', message, cause);\n this.name = 'ConnectionError';\n }\n}\n\n/**\n * Thrown when session is not found or expired\n */\nexport class SessionNotFoundError extends McpError {\n constructor(sessionId: string, cause?: Error) {\n super('SESSION_NOT_FOUND', `Session not found: ${sessionId}`, cause);\n this.name = 'SessionNotFoundError';\n }\n}\n\n/**\n * Thrown when session validation fails\n */\nexport class SessionValidationError extends McpError {\n constructor(message: string, cause?: Error) {\n super('SESSION_VALIDATION_ERROR', message, cause);\n this.name = 'SessionValidationError';\n }\n}\n\n/**\n * Thrown when authentication fails\n */\nexport class AuthenticationError extends McpError {\n constructor(message: string, cause?: Error) {\n super('AUTH_ERROR', message, cause);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Thrown when OAuth state validation fails\n */\nexport class InvalidStateError extends McpError {\n constructor(message: string = 'Invalid OAuth state', cause?: Error) {\n super('INVALID_STATE', message, cause);\n this.name = 'InvalidStateError';\n }\n}\n\n/**\n * Thrown when client is not connected\n */\nexport class NotConnectedError extends McpError {\n constructor(message: string = 'Not connected to server', cause?: Error) {\n super('NOT_CONNECTED', message, cause);\n this.name = 'NotConnectedError';\n }\n}\n\n/**\n * Thrown when required configuration is missing\n */\nexport class ConfigurationError extends McpError {\n constructor(message: string, cause?: Error) {\n super('CONFIGURATION_ERROR', message, cause);\n this.name = 'ConfigurationError';\n }\n}\n\n/**\n * Thrown when tool execution fails\n */\nexport class ToolExecutionError extends McpError {\n constructor(toolName: string, message: string, cause?: Error) {\n super('TOOL_EXECUTION_ERROR', `Tool '${toolName}' failed: ${message}`, cause);\n this.name = 'ToolExecutionError';\n }\n}\n\n/**\n * RPC error codes for SSE communication\n */\nexport const RpcErrorCodes = {\n EXECUTION_ERROR: 'EXECUTION_ERROR',\n MISSING_USER_ID: 'MISSING_USER_ID',\n UNAUTHORIZED: 'UNAUTHORIZED',\n NO_CONNECTION: 'NO_CONNECTION',\n UNKNOWN_METHOD: 'UNKNOWN_METHOD',\n INVALID_PARAMS: 'INVALID_PARAMS',\n} as const;\n\nexport type RpcErrorCode = typeof RpcErrorCodes[keyof typeof RpcErrorCodes];\n","import { MCPClient } from './oauth-client.js';\nimport { sessions, type Session } from '../storage/index.js';\nimport type { ToolClientProvider } from '../../shared/types.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_TIMEOUT_MS = 15000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_RETRY_DELAY_MS = 1000;\nconst CONNECTION_BATCH_SIZE = 5;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MultiSessionOptions {\n /**\n * Connection timeout in milliseconds.\n * @default 15000\n */\n timeout?: number;\n\n /**\n * Maximum number of retry attempts per session.\n * @default 2\n */\n maxRetries?: number;\n\n /**\n * Delay between retry attempts in milliseconds.\n * @default 1000\n */\n retryDelay?: number;\n\n /**\n * Custom session provider. When provided, `connect()` calls this\n * instead of querying the storage backend. Useful when sessions are\n * synced externally (e.g. via Supabase Realtime, WebSocket, or an\n * in-memory cache).\n *\n * Default: reads from the storage backend via `sessions.list(userId)`.\n */\n sessionProvider?: () => Promise<Session[]>;\n\n /**\n * Called after a session is successfully connected.\n */\n onSessionConnected?: (sessionId: string, client: MCPClient) => void;\n\n /**\n * Called when a session is evicted from the in-memory client list\n * because it no longer exists in the active sessions list.\n */\n onSessionEvicted?: (sessionId: string) => void;\n\n /**\n * Called when all retry attempts for a session have been exhausted.\n */\n onSessionFailed?: (sessionId: string, error: unknown) => void;\n}\n\n// ---------------------------------------------------------------------------\n// MultiSessionClient\n// ---------------------------------------------------------------------------\n\n/**\n * Manages multiple MCP client connections for a single user.\n *\n * Cached instances stay alive between requests on long-running servers.\n * On serverless, the underlying session data persists in storage — the\n * client rehydrates from `sessionProvider` (or the default storage backend)\n * each time `connect()` is called.\n *\n * @implements {ToolClientProvider}\n */\nexport class MultiSessionClient implements ToolClientProvider {\n private clients: MCPClient[] = [];\n private connectionPromises = new Map<string, Promise<void>>();\n private userId: string;\n private options: Required<Pick<MultiSessionOptions, 'timeout' | 'maxRetries' | 'retryDelay'>> &\n Pick<MultiSessionOptions, 'sessionProvider' | 'onSessionConnected' | 'onSessionEvicted' | 'onSessionFailed'>;\n\n /**\n * @param userId - Unique identifier for the user (e.g. user ID or email).\n * @param options - Optional tuning and lifecycle hooks.\n */\n constructor(userId: string, options: MultiSessionOptions = {}) {\n this.userId = userId;\n this.options = {\n timeout: DEFAULT_TIMEOUT_MS,\n maxRetries: DEFAULT_MAX_RETRIES,\n retryDelay: DEFAULT_RETRY_DELAY_MS,\n ...options,\n };\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /**\n * Fetches active sessions and establishes connections to all of them.\n *\n * Call this once after creating the client. On long-running servers you\n * can cache the `MultiSessionClient` instance and call `connect()` on\n * each request — already-connected sessions are skipped internally.\n */\n async connect(): Promise<void> {\n const sessions = await this.fetchActiveSessions();\n const activeSessionIds = new Set(sessions.map(s => s.sessionId));\n\n // Evict clients whose sessions no longer appear in the active list.\n // Without this, a stale MCPClient with a live SDK transport would\n // stay in the clients array after its session was deleted externally\n // (e.g. via the SSE handler's clearSession()), causing OAuth refreshes\n // to fail with a FK violation when they try to patchCredentials()\n // against the now-deleted session.\n for (const client of this.clients) {\n if (!activeSessionIds.has(client.getSessionId())) {\n this.options.onSessionEvicted?.(client.getSessionId());\n }\n }\n this.clients = this.clients.filter(c => activeSessionIds.has(c.getSessionId()));\n\n await this.connectInBatches(sessions);\n }\n\n /**\n * Drops all cached `MCPClient` instances and reconnects fresh from storage.\n *\n * Call this when downstream MCP servers have expired their transport sessions\n * (e.g. after a remote server restart) and subsequent tool calls return\n * \"Session not found. Reconnect without session header.\" errors.\n *\n * OAuth tokens are preserved in the storage backend — no re-authentication\n * is required. Only the in-memory transport sessions are cleared.\n */\n async reconnect(): Promise<void> {\n await this.disconnect();\n await this.connect();\n }\n\n /**\n * Returns all currently connected `MCPClient` instances.\n *\n * Use this to enumerate available tools across all connected servers,\n * or to route a tool call to the right client by `serverId`.\n */\n getClients(): MCPClient[] {\n return this.clients;\n }\n\n /**\n * Removes and disconnects a single session by ID.\n *\n * @returns `true` if the session was found and removed, `false` if not found.\n */\n async removeSession(sessionId: string): Promise<boolean> {\n const idx = this.clients.findIndex(c => c.getSessionId() === sessionId);\n if (idx === -1) return false;\n const [client] = this.clients.splice(idx, 1);\n await client.disconnect();\n return true;\n }\n\n /**\n * Gracefully disconnects all active MCP clients and clears the internal list.\n *\n * For Streamable HTTP sessions, each client sends an HTTP DELETE to its MCP\n * endpoint per the spec before closing locally. All disconnects run in\n * parallel so shutdown is not serialised across many sessions.\n *\n * Call this during server shutdown or when a user logs out to free up\n * underlying transport resources (SSE streams, HTTP connections, etc.).\n */\n async disconnect(): Promise<void> {\n await Promise.all(this.clients.map((client) => client.disconnect()));\n this.clients = [];\n }\n\n // -----------------------------------------------------------------------\n // Internals\n // -----------------------------------------------------------------------\n\n /**\n * Resolves the list of sessions to connect.\n *\n * Uses the custom `sessionProvider` when provided, otherwise falls back\n * to querying the storage backend via `sessions.list(userId)`.\n */\n private async fetchActiveSessions(): Promise<Session[]> {\n const sessionList = this.options.sessionProvider\n ? await this.options.sessionProvider()\n : await sessions.list(this.userId);\n\n return sessionList.filter(s =>\n s.serverId &&\n s.serverUrl &&\n s.callbackUrl &&\n s.status === 'active'\n );\n }\n\n /**\n * Connects a list of sessions in controlled batches.\n *\n * Batching prevents overwhelming the event loop or external servers when\n * a user has many active MCP sessions. Within each batch, sessions are\n * connected concurrently using `Promise.all`.\n */\n private async connectInBatches(sessions: Session[]): Promise<void> {\n for (let i = 0; i < sessions.length; i += CONNECTION_BATCH_SIZE) {\n const batch = sessions.slice(i, i + CONNECTION_BATCH_SIZE);\n await Promise.all(batch.map(session => this.connectSession(session)));\n }\n }\n\n /**\n * Connects a single session, with deduplication to prevent race conditions.\n *\n * - If a client for this session already exists and is connected, returns\n * immediately.\n * - If the existing client entry is no longer connected (e.g. explicit\n * disconnect), it is evicted so a fresh transport is created.\n * - If a connection attempt for this session is already in-flight, the\n * existing promise is reused as a per-session mutex.\n * - On completion (success or failure), the promise is cleaned up from\n * the connectionPromises map.\n */\n private async connectSession(session: Session): Promise<void> {\n const existing = this.clients.find(c => c.getSessionId() === session.sessionId);\n\n if (existing) {\n if (existing.isConnected()) {\n return;\n }\n\n this.options.onSessionEvicted?.(existing.getSessionId());\n this.clients = this.clients.filter(c => c !== existing);\n }\n\n if (this.connectionPromises.has(session.sessionId)) {\n return this.connectionPromises.get(session.sessionId)!;\n }\n\n const connectPromise = this.establishConnectionWithRetries(session);\n\n this.connectionPromises.set(session.sessionId, connectPromise);\n\n try {\n await connectPromise;\n } finally {\n this.connectionPromises.delete(session.sessionId);\n }\n }\n\n /**\n * Core connection loop for a single session with retry logic.\n *\n * 1. Creates a fresh `MCPClient` from the session data.\n * 2. Races `client.connect()` against a timeout.\n * 3. On success, replaces any stale entry and fires `onSessionConnected`.\n * 4. On failure, waits `retryDelay` ms before the next attempt.\n *\n * If all attempts are exhausted, logs an error and returns silently so\n * a single bad server doesn't block the rest of the batch.\n */\n private async establishConnectionWithRetries(session: Session): Promise<void> {\n const maxRetries = this.options.maxRetries;\n const retryDelay = this.options.retryDelay;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const client = new MCPClient({\n userId: this.userId,\n sessionId: session.sessionId,\n serverId: session.serverId,\n serverUrl: session.serverUrl,\n callbackUrl: session.callbackUrl,\n serverName: session.serverName,\n transportType: session.transportType,\n headers: session.headers,\n });\n\n const timeoutMs = this.options.timeout;\n let timeoutTimer: ReturnType<typeof setTimeout>;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutTimer = setTimeout(\n () => reject(new Error(`Connection timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n });\n\n try {\n await Promise.race([client.connect(), timeoutPromise]);\n } finally {\n clearTimeout(timeoutTimer!);\n }\n\n this.clients = this.clients.filter(c => c.getSessionId() !== session.sessionId);\n this.clients.push(client);\n this.options.onSessionConnected?.(session.sessionId, client);\n return;\n\n } catch (error) {\n lastError = error;\n if (attempt < maxRetries) {\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n }\n }\n }\n\n this.options.onSessionFailed?.(session.sessionId, lastError);\n console.error(\n `[MultiSessionClient] Failed to connect to session ${session.sessionId} ` +\n `after ${maxRetries + 1} attempts:`,\n lastError,\n );\n }\n}\n","/**\n * SSE (Server-Sent Events) Handler for MCP Connections\n *\n * Manages real-time bidirectional communication with MCP clients:\n * - SSE stream for server → client events (connection state, tools, logs)\n * - HTTP POST for client → server RPC requests\n *\n * Key features:\n * - Direct HTTP response for RPC calls (bypasses SSE latency)\n * - Automatic session restoration and validation\n * - OAuth 2.1 authentication flow support\n * - Heartbeat to keep connections alive\n */\n\nimport type { McpConnectionEvent, McpObservabilityEvent } from '../../shared/events.js';\nimport type {\n McpRpcRequest,\n McpRpcResponse,\n ConnectParams,\n DisconnectParams,\n SessionParams,\n CallToolParams,\n GetPromptParams,\n ReadResourceParams,\n FinishAuthParams,\n SessionListResult,\n ConnectResult,\n DisconnectResult,\n GetSessionResult,\n FinishAuthResult,\n ListToolsRpcResult,\n ListPromptsResult,\n ListResourcesResult,\n CallToolResult,\n} from '../../shared/types.js';\nimport { RpcErrorCodes } from '../../shared/errors.js';\nimport { UnauthorizedError } from '../../shared/errors.js';\nimport { isConnectionEvent, isRpcResponseEvent } from '../../shared/event-routing.js';\nimport { parseOAuthState } from '../../shared/utils.js';\nimport { MCPClient } from '../mcp/oauth-client.js';\nimport { sessions } from '../storage/index.js';\n\n// ============================================\n// Types & Interfaces\n// ============================================\n\nexport interface ClientMetadata {\n clientName?: string;\n clientUri?: string;\n logoUri?: string;\n policyUri?: string;\n}\n\nexport interface SSEHandlerOptions {\n /** User/Client identifier */\n userId: string;\n\n /** Optional callback for authentication/authorization */\n onAuth?: (userId: string) => Promise<boolean>;\n\n /** Heartbeat interval in milliseconds @default 30000 */\n heartbeatInterval?: number;\n\n /** Static OAuth client metadata defaults (for all connections) */\n clientDefaults?: ClientMetadata;\n\n /** Dynamic OAuth client metadata getter (per-request, useful for multi-tenant) */\n getClientMetadata?: (request?: unknown) => ClientMetadata | Promise<ClientMetadata>;\n}\n\n// ============================================\n// Constants\n// ============================================\n\nconst DEFAULT_HEARTBEAT_INTERVAL = 30000;\n\nfunction normalizeHeaders(headers?: Record<string, string>): Record<string, string> | undefined {\n if (!headers || typeof headers !== 'object') return undefined;\n\n const entries = Object.entries(headers)\n .map(([key, value]) => [key.trim(), String(value).trim()] as const)\n .filter(([key, value]) => key.length > 0 && value.length > 0);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\n// ============================================\n// SSEConnectionManager Class\n// ============================================\n\n/**\n * Manages a single SSE connection and handles MCP operations.\n * Each instance corresponds to one connected browser client.\n */\nexport class SSEConnectionManager {\n private readonly userId: string;\n private readonly clients = new Map<string, MCPClient>();\n private heartbeatTimer?: NodeJS.Timeout;\n private isActive = true;\n\n constructor(\n private readonly options: SSEHandlerOptions,\n private readonly sendEvent: (event: McpConnectionEvent | McpObservabilityEvent | McpRpcResponse) => void\n ) {\n this.userId = options.userId;\n this.startHeartbeat();\n }\n\n /**\n * Get resolved client metadata (dynamic > static > defaults)\n */\n private async getResolvedClientMetadata(request?: any): Promise<ClientMetadata> {\n // Priority: getClientMetadata() > clientDefaults > empty object\n let metadata: ClientMetadata = {};\n\n // Start with static defaults\n if (this.options.clientDefaults) {\n metadata = { ...this.options.clientDefaults };\n }\n\n // Override with dynamic metadata if provided\n if (this.options.getClientMetadata) {\n const dynamicMetadata = await this.options.getClientMetadata(request);\n metadata = { ...metadata, ...dynamicMetadata };\n }\n\n return metadata;\n }\n\n /**\n * Start heartbeat to keep connection alive\n */\n private startHeartbeat(): void {\n const interval = this.options.heartbeatInterval ?? DEFAULT_HEARTBEAT_INTERVAL;\n this.heartbeatTimer = setInterval(() => {\n if (this.isActive) {\n this.sendEvent({\n level: 'debug',\n message: 'heartbeat',\n timestamp: Date.now(),\n } as McpObservabilityEvent);\n }\n }, interval);\n }\n\n /**\n * Handle incoming RPC requests\n * Returns the RPC response directly for immediate HTTP response (bypassing SSE latency)\n */\n async handleRequest(request: McpRpcRequest): Promise<McpRpcResponse> {\n try {\n let result: SessionListResult | ConnectResult | DisconnectResult | GetSessionResult | FinishAuthResult | ListToolsRpcResult | ListPromptsResult | ListResourcesResult | unknown;\n\n switch (request.method) {\n case 'listSessions':\n result = await this.listSessions();\n break;\n\n case 'connect':\n result = await this.connect(request.params as ConnectParams);\n break;\n\n case 'disconnect':\n result = await this.disconnect(request.params as DisconnectParams);\n break;\n\n case 'listTools':\n result = await this.listTools(request.params as SessionParams);\n break;\n\n case 'callTool':\n result = await this.callTool(request.params as CallToolParams);\n break;\n\n case 'getSession':\n result = await this.getSession(request.params as SessionParams);\n break;\n\n case 'finishAuth':\n result = await this.finishAuth(request.params as FinishAuthParams);\n break;\n\n case 'listPrompts':\n result = await this.listPrompts(request.params as SessionParams);\n break;\n\n case 'getPrompt':\n result = await this.getPrompt(request.params as GetPromptParams);\n break;\n\n case 'listResources':\n result = await this.listResources(request.params as SessionParams);\n break;\n\n case 'readResource':\n result = await this.readResource(request.params as ReadResourceParams);\n break;\n\n default:\n throw new Error(`Unknown method: ${request.method}`);\n }\n\n const response: McpRpcResponse = {\n id: request.id,\n result,\n };\n\n // Also send via SSE for backwards compatibility\n this.sendEvent(response);\n\n return response;\n } catch (error) {\n const errorResponse: McpRpcResponse = {\n id: request.id,\n error: {\n code: RpcErrorCodes.EXECUTION_ERROR,\n message: error instanceof Error ? error.message : 'Unknown error',\n },\n };\n\n // Also send via SSE for backwards compatibility\n this.sendEvent(errorResponse);\n\n return errorResponse;\n }\n }\n\n /**\n * Get all sessions for the current userId\n */\n private async listSessions(): Promise<SessionListResult> {\n const sessionList = await sessions.list(this.userId);\n\n return {\n sessions: sessionList.map((s) => ({\n sessionId: s.sessionId,\n serverId: s.serverId,\n serverName: s.serverName,\n serverUrl: s.serverUrl,\n transport: s.transportType,\n createdAt: s.createdAt,\n updatedAt: s.updatedAt ?? s.createdAt,\n status: s.status ?? 'pending',\n })),\n };\n }\n\n /**\n * Connect to an MCP server\n */\n private async connect(params: ConnectParams): Promise<ConnectResult> {\n const { serverName, serverUrl, callbackUrl, transportType } = params;\n const headers = normalizeHeaders(params.headers);\n\n // Normalize serverId to max 12 chars to keep tool names under 64 chars (DeepSeek/OpenAI limits)\n // Tool name format: tool_<serverId>_<toolName> - with 12 char serverId leaves 46 chars for tool name\n const serverId = params.serverId && params.serverId.length <= 12\n ? params.serverId\n : await sessions.generateSessionId();\n\n // Check for existing connections\n const existingSessions = await sessions.list(this.userId);\n const duplicate = existingSessions.find(s =>\n s.serverId === serverId || s.serverUrl === serverUrl\n );\n\n if (duplicate) {\n // If the existing session is still pending OAuth, treat connect as \"resume auth\"\n // instead of failing with duplicate connection error.\n if (duplicate.status === 'pending') {\n await this.getSession({ sessionId: duplicate.sessionId });\n return {\n sessionId: duplicate.sessionId,\n success: true,\n };\n }\n throw new Error(`Connection already exists for server: ${duplicate.serverUrl || duplicate.serverId} (${duplicate.serverName})`);\n }\n\n // Generate session ID\n const sessionId = await sessions.generateSessionId();\n\n try {\n // Get resolved client metadata\n const clientMetadata = await this.getResolvedClientMetadata();\n\n // Create MCP client\n const client = new MCPClient({\n userId: this.userId,\n sessionId,\n serverId,\n serverName,\n serverUrl,\n callbackUrl,\n transportType,\n headers,\n ...clientMetadata, // Spread client metadata (clientName, clientUri, logoUri, policyUri)\n });\n\n // Note: Session will be created by MCPClient after successful connection\n // This ensures sessions only exist for successful or OAuth-pending connections\n\n // Store client\n this.clients.set(sessionId, client);\n\n // Subscribe to client events\n client.onConnectionEvent((event) => {\n this.emitConnectionEvent(event);\n });\n\n client.onObservabilityEvent((event) => {\n this.sendEvent(event);\n });\n\n // Attempt connection\n await client.connect();\n\n // Fetch tools\n await client.listTools();\n\n return {\n sessionId,\n success: true,\n };\n } catch (error) {\n if (error instanceof UnauthorizedError) {\n // OAuth-required is a pending-auth state, not a failed connection.\n this.clients.delete(sessionId);\n return {\n sessionId,\n success: true,\n };\n }\n\n this.emitConnectionEvent({\n type: 'error',\n sessionId,\n serverId,\n error: error instanceof Error ? error.message : 'Connection failed',\n errorType: 'connection',\n timestamp: Date.now(),\n });\n\n // Clean up client\n this.clients.delete(sessionId);\n\n throw error;\n }\n }\n\n /**\n * Disconnect from an MCP server\n */\n private async disconnect(params: DisconnectParams): Promise<DisconnectResult> {\n const { sessionId } = params;\n const client = this.clients.get(sessionId);\n\n if (client) {\n // clearSession() handles DELETE + local cleanup internally.\n await client.clearSession();\n this.clients.delete(sessionId);\n } else {\n // Handle orphaned sessions (e.g., OAuth flow failed before client was stored)\n // Directly remove from storage since there's no active client\n await sessions.delete(this.userId, sessionId);\n }\n\n return { success: true };\n }\n\n /**\n * Get an existing client or create and connect a new one for the session.\n */\n private async getOrCreateClient(sessionId: string): Promise<MCPClient> {\n const existing = this.clients.get(sessionId);\n if (existing) {\n return existing;\n }\n\n const session = await sessions.get(this.userId, sessionId);\n if (!session) {\n throw new Error('Session not found');\n }\n\n const client = new MCPClient({\n userId: this.userId,\n sessionId,\n // These fields are optional in MCPClient, but when rehydrating a known\n // stored session on the server we pass them explicitly to preserve the\n // original transport/connection metadata instead of relying on lazy\n // reloading during initialize().\n serverId: session.serverId,\n serverName: session.serverName,\n serverUrl: session.serverUrl,\n callbackUrl: session.callbackUrl,\n transportType: session.transportType,\n headers: session.headers,\n });\n\n // Subscribe to events before connecting\n client.onConnectionEvent((event) => this.emitConnectionEvent(event));\n client.onObservabilityEvent((event) => this.sendEvent(event));\n\n await client.connect();\n this.clients.set(sessionId, client);\n\n return client;\n }\n\n /**\n * List tools from a session\n */\n private async listTools(params: SessionParams): Promise<ListToolsRpcResult> {\n const { sessionId } = params;\n const client = await this.getOrCreateClient(sessionId);\n const result = await client.listTools();\n return { tools: result.tools };\n }\n\n /**\n * Call a tool on the MCP server\n */\n private async callTool(params: CallToolParams): Promise<CallToolResult> {\n const { sessionId, toolName, toolArgs } = params;\n const client = await this.getOrCreateClient(sessionId);\n const result = await client.callTool(toolName, toolArgs);\n\n // Inject sessionId into meta so client knows who handled it\n // This allows AppHost to auto-launch without scanning all sessions\n const meta = result._meta || {};\n\n return {\n ...result,\n _meta: {\n ...meta,\n sessionId,\n }\n };\n }\n\n /**\n * Restore and validate an existing session\n */\n private async getSession(params: SessionParams): Promise<GetSessionResult> {\n const { sessionId } = params;\n\n const session = await sessions.get(this.userId, sessionId);\n if (!session) {\n throw new Error('Session not found');\n }\n\n this.emitConnectionEvent({\n type: 'state_changed',\n sessionId,\n serverId: session.serverId ?? 'unknown',\n serverName: session.serverName ?? 'Unknown',\n serverUrl: session.serverUrl,\n state: 'VALIDATING',\n previousState: 'DISCONNECTED',\n timestamp: Date.now(),\n });\n\n try {\n const clientMetadata = await this.getResolvedClientMetadata();\n\n const client = new MCPClient({\n userId: this.userId,\n sessionId,\n // These fields are optional in MCPClient, but when rehydrating a known\n // stored session on the server we pass them explicitly to preserve the\n // original transport/connection metadata instead of relying on lazy\n // reloading during initialize().\n serverId: session.serverId,\n serverName: session.serverName,\n serverUrl: session.serverUrl,\n callbackUrl: session.callbackUrl,\n transportType: session.transportType,\n headers: session.headers,\n ...clientMetadata,\n });\n\n client.onConnectionEvent((event) => this.emitConnectionEvent(event));\n client.onObservabilityEvent((event) => this.sendEvent(event));\n\n await client.connect();\n this.clients.set(sessionId, client);\n\n const tools = await client.listTools();\n\n return { success: true, toolCount: tools.tools.length };\n } catch (error) {\n this.emitConnectionEvent({\n type: 'error',\n sessionId,\n serverId: session.serverId ?? 'unknown',\n error: error instanceof Error ? error.message : 'Validation failed',\n errorType: 'validation',\n timestamp: Date.now(),\n });\n\n throw error;\n }\n }\n\n /**\n * Complete OAuth authorization flow\n */\n private async finishAuth(params: FinishAuthParams): Promise<FinishAuthResult> {\n const { code } = params;\n const oauthState = params.state;\n const parsedState = parseOAuthState(oauthState);\n const sessionId = parsedState?.sessionId || oauthState;\n\n const session = await sessions.get(this.userId, sessionId);\n if (!session) {\n throw new Error('Session not found');\n }\n\n try {\n const client = new MCPClient({\n userId: this.userId,\n sessionId,\n // These fields are optional in MCPClient, but when rehydrating a known\n // stored session on the server we pass them explicitly to preserve the\n // original connection metadata instead of relying on lazy\n // reloading during initialize().\n serverId: session.serverId,\n serverName: session.serverName,\n serverUrl: session.serverUrl,\n callbackUrl: session.callbackUrl,\n // NOTE: transportType is intentionally omitted here.\n // The session's stored transportType is a placeholder ('streamable-http')\n // set before transport negotiation. Omitting it lets MCPClient auto-negotiate\n // (try streamable_http → SSE fallback), which is critical for servers like\n // Neon that only support SSE transport.\n headers: session.headers,\n });\n\n client.onConnectionEvent((event) => this.emitConnectionEvent(event));\n\n await client.finishAuth(code, oauthState);\n this.clients.set(sessionId, client);\n\n const tools = await client.listTools();\n\n return { success: true, toolCount: tools.tools.length };\n } catch (error) {\n this.emitConnectionEvent({\n type: 'error',\n sessionId,\n serverId: session.serverId ?? 'unknown',\n error: error instanceof Error ? error.message : 'OAuth completion failed',\n errorType: 'auth',\n timestamp: Date.now(),\n });\n\n throw error;\n }\n }\n\n /**\n * List prompts from a session\n */\n private async listPrompts(params: SessionParams): Promise<ListPromptsResult> {\n const { sessionId } = params;\n const client = await this.getOrCreateClient(sessionId);\n const result = await client.listPrompts();\n return { prompts: result.prompts };\n }\n\n /**\n * Get a specific prompt\n */\n private async getPrompt(params: GetPromptParams): Promise<unknown> {\n const { sessionId, name, args } = params;\n const client = await this.getOrCreateClient(sessionId);\n return await client.getPrompt(name, args);\n }\n\n /**\n * List resources from a session\n */\n private async listResources(params: SessionParams): Promise<ListResourcesResult> {\n const { sessionId } = params;\n const client = await this.getOrCreateClient(sessionId);\n const result = await client.listResources();\n return { resources: result.resources };\n }\n\n /**\n * Read a specific resource\n */\n private async readResource(params: ReadResourceParams): Promise<unknown> {\n const { sessionId, uri } = params;\n const client = await this.getOrCreateClient(sessionId);\n return client.readResource(uri);\n }\n\n /**\n * Emit connection event\n */\n private emitConnectionEvent(event: McpConnectionEvent): void {\n this.sendEvent(event);\n }\n\n /**\n * Cleanup and close all connections\n */\n async dispose(): Promise<void> {\n this.isActive = false;\n\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n }\n\n // Send HTTP DELETE to each Streamable HTTP server before closing, per spec.\n // Run in parallel so shutdown is not serialised across many sessions.\n await Promise.all(\n Array.from(this.clients.values()).map((client) => client.disconnect())\n );\n\n this.clients.clear();\n }\n}\n\n// ============================================\n// SSE Handler Factory\n// ============================================\n\n/**\n * Create an SSE endpoint handler compatible with Node.js HTTP frameworks.\n * Handles both SSE streaming (GET) and RPC requests (POST).\n */\nexport function createSSEHandler(options: SSEHandlerOptions) {\n return async (req: { method?: string; on: Function }, res: { writeHead: Function; write: Function }) => {\n // Set SSE headers\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'Access-Control-Allow-Origin': '*',\n });\n\n // Send initial connection acknowledgment\n writeSSEEvent(res, 'connected', { timestamp: Date.now() });\n\n // Create connection manager with event routing\n const manager = new SSEConnectionManager(options, (event) => {\n if (isRpcResponseEvent(event)) {\n writeSSEEvent(res, 'rpc-response', event);\n } else if (isConnectionEvent(event)) {\n writeSSEEvent(res, 'connection', event);\n } else {\n writeSSEEvent(res, 'observability', event);\n }\n });\n\n // Cleanup on client disconnect\n req.on('close', () => manager.dispose());\n\n // Handle RPC requests via POST\n if (req.method === 'POST') {\n let body = '';\n req.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n });\n req.on('end', async () => {\n try {\n const request: McpRpcRequest = JSON.parse(body);\n await manager.handleRequest(request);\n } catch {\n // Request parsing/handling errors are sent via SSE error events\n }\n });\n }\n };\n}\n\n// ============================================\n// Utilities\n// ============================================\n\n/**\n * Write an SSE event to the response stream\n */\nfunction writeSSEEvent(res: { write: Function }, event: string, data: unknown): void {\n res.write(`event: ${event}\\n`);\n res.write(`data: ${JSON.stringify(data)}\\n\\n`);\n}\n","import type { McpConnectionEvent, McpObservabilityEvent } from './events.js';\nimport type { McpRpcResponse } from './types.js';\n\nexport function isRpcResponseEvent(\n event: McpConnectionEvent | McpObservabilityEvent | McpRpcResponse\n): event is McpRpcResponse {\n return 'id' in event && ('result' in event || 'error' in event);\n}\n\nexport function isConnectionEvent(\n event: McpConnectionEvent | McpObservabilityEvent | McpRpcResponse\n): event is McpConnectionEvent {\n if (!('type' in event)) {\n return false;\n }\n\n switch (event.type) {\n case 'state_changed':\n case 'tools_discovered':\n case 'auth_required':\n case 'error':\n case 'disconnected':\n case 'progress':\n return true;\n default:\n return false;\n }\n}\n","/**\n * Next.js App Router Handler for MCP\n * Stateless transport for serverless environments:\n * - POST + `Accept: text/event-stream` streams progress + rpc-response\n * - POST + JSON accepts direct RPC result response\n */\n\nimport { SSEConnectionManager, type ClientMetadata } from './sse-handler.js';\nimport type { McpConnectionEvent, McpObservabilityEvent } from '../../shared/events.js';\nimport { isConnectionEvent, isRpcResponseEvent } from '../../shared/event-routing.js';\nimport type { McpRpcResponse } from '../../shared/types.js';\n\nexport interface NextMcpHandlerOptions {\n /**\n * Extract userId from request (default: from 'userId' query param)\n */\n getUserId?: (request: Request) => string | null;\n\n /**\n * Extract auth token from request (default: from 'token' query param or Authorization header)\n */\n getAuthToken?: (request: Request) => string | null;\n\n /**\n * Authenticate user and verify access (optional)\n * Return true if user is authenticated, false otherwise\n */\n authenticate?: (userId: string, token: string | null) => Promise<boolean> | boolean;\n\n /**\n * Heartbeat interval in milliseconds (default: 30000)\n */\n heartbeatInterval?: number;\n\n /**\n * Static OAuth client metadata defaults (for all connections)\n */\n clientDefaults?: ClientMetadata;\n\n /**\n * Dynamic OAuth client metadata getter (per-request)\n */\n getClientMetadata?: (request: Request) => ClientMetadata | Promise<ClientMetadata>;\n}\n\nexport function createNextMcpHandler(options: NextMcpHandlerOptions = {}) {\n const {\n getUserId = (request: Request) => request.headers.get('x-mcp-user-id'),\n getAuthToken = (request: Request) => {\n const authHeader = request.headers.get('authorization');\n if (authHeader?.toLowerCase().startsWith('bearer ')) {\n return authHeader.slice(7);\n }\n return authHeader;\n },\n authenticate = () => true,\n heartbeatInterval = 30000,\n clientDefaults,\n getClientMetadata,\n } = options;\n\n const toManagerOptions = (userId: string, resolvedClientMetadata?: ClientMetadata) => ({\n userId,\n heartbeatInterval,\n clientDefaults: resolvedClientMetadata,\n });\n\n async function resolveClientMetadata(request: Request): Promise<ClientMetadata | undefined> {\n return getClientMetadata ? await getClientMetadata(request) : clientDefaults;\n }\n\n async function GET(): Promise<Response> {\n return Response.json(\n {\n error: {\n code: 'METHOD_NOT_ALLOWED',\n message: 'Use POST /api/mcp. For streaming use Accept: text/event-stream.',\n },\n },\n { status: 405 }\n );\n }\n\n async function POST(request: Request): Promise<Response> {\n const userId = getUserId(request);\n const authToken = getAuthToken(request);\n const acceptsEventStream = (request.headers.get('accept') || '').toLowerCase().includes('text/event-stream');\n\n if (!userId) {\n return Response.json({ error: { code: 'MISSING_userId', message: 'Missing userId' } }, { status: 400 });\n }\n\n const isAuthorized = await authenticate(userId, authToken);\n if (!isAuthorized) {\n return Response.json({ error: { code: 'UNAUTHORIZED', message: 'Unauthorized' } }, { status: 401 });\n }\n\n let rawBody = '';\n try {\n rawBody = await request.text();\n const body = rawBody ? JSON.parse(rawBody) : null;\n\n if (!body || typeof body !== 'object') {\n return Response.json(\n {\n error: {\n code: 'INVALID_REQUEST',\n message: 'Invalid JSON-RPC request body',\n },\n },\n { status: 400 }\n );\n }\n\n const resolvedClientMetadata = await resolveClientMetadata(request);\n\n if (!acceptsEventStream) {\n const manager = new SSEConnectionManager(\n toManagerOptions(userId, resolvedClientMetadata),\n () => { }\n );\n try {\n const response = await manager.handleRequest(body as any);\n return Response.json(response);\n } finally {\n manager.dispose();\n }\n }\n\n const stream = new TransformStream();\n const writer = stream.writable.getWriter();\n const encoder = new TextEncoder();\n let streamWritable = true;\n\n const sendSSE = (event: string, data: unknown) => {\n if (!streamWritable) return;\n const message = `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n writer.write(encoder.encode(message)).catch(() => {\n streamWritable = false;\n });\n };\n\n const manager = new SSEConnectionManager(\n toManagerOptions(userId, resolvedClientMetadata),\n (event: McpConnectionEvent | McpObservabilityEvent | McpRpcResponse) => {\n if (isRpcResponseEvent(event)) {\n sendSSE('rpc-response', event);\n } else if (isConnectionEvent(event)) {\n sendSSE('connection', event);\n } else {\n sendSSE('observability', event);\n }\n }\n );\n\n sendSSE('connected', { timestamp: Date.now() });\n\n void (async () => {\n try {\n await manager.handleRequest(body as any);\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Unknown error');\n sendSSE('rpc-response', {\n id: (body as any).id || 'unknown',\n error: {\n code: 'EXECUTION_ERROR',\n message: err.message,\n },\n } satisfies McpRpcResponse);\n } finally {\n streamWritable = false;\n manager.dispose();\n writer.close().catch(() => { });\n }\n })();\n\n return new Response(stream.readable, {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n 'Connection': 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Unknown error');\n console.error('[MCP Next Handler] Failed to handle RPC', {\n userId,\n message: err.message,\n stack: err.stack,\n rawBody: rawBody.slice(0, 500),\n });\n return Response.json(\n {\n error: {\n code: 'EXECUTION_ERROR',\n message: err.message,\n },\n },\n { status: 500 }\n );\n }\n }\n\n return { GET, POST };\n}\n","/**\n * MCP Redis Client Package\n * Browser/React client-side exports for MCP connection management\n */\n\n/** SSE client for real-time connections */\nexport { SSEClient, type SSEClientOptions } from './core/sse-client';\nexport { AppHost, DEFAULT_MCP_APP_CSP } from './core/app-host';\nexport {\n APP_HOST_DEFAULTS,\n SANDBOX_PROXY_READY_METHOD,\n SANDBOX_RESOURCE_READY_METHOD,\n} from './core/constants.js';\n\n\n\n/** Re-export shared types */\nexport type {\n McpConnectionEvent,\n McpConnectionState,\n McpObservabilityEvent,\n Emitter,\n Disposable,\n Event,\n DisposableStore,\n} from '../shared/events';\n\nexport type {\n ToolInfo,\n McpRpcRequest,\n McpRpcResponse,\n} from '../shared/types';\n","/**\n * Stateless RPC-over-stream client for MCP connections.\n *\n * Uses single POST requests with `Accept: text/event-stream` for every RPC call.\n * Progress events and the final rpc-response are delivered in the same response.\n */\n\nimport { nanoid } from 'nanoid';\nimport type {\n McpConnectionEvent,\n McpObservabilityEvent,\n McpAppsUIEvent\n} from '../../shared/events.js';\nimport type {\n McpRpcRequest,\n McpRpcResponse,\n McpRpcMethod,\n McpRpcParams,\n ConnectParams,\n SessionListResult,\n ConnectResult,\n DisconnectResult,\n GetSessionResult,\n FinishAuthResult,\n ListToolsRpcResult,\n ListPromptsResult,\n ListResourcesResult,\n} from '../../shared/types.js';\n\nexport interface SSEClientOptions {\n /** MCP endpoint URL */\n url: string;\n\n /** User/Client identifier */\n userId: string;\n\n /** Optional auth token for authenticated requests */\n authToken?: string;\n\n /** Callback for MCP connection state changes */\n onConnectionEvent?: (event: McpConnectionEvent) => void;\n\n /** Callback for observability/logging events */\n onObservabilityEvent?: (event: McpObservabilityEvent) => void;\n\n /** Callback for connection status changes */\n onStatusChange?: (status: ConnectionStatus) => void;\n\n /** Callback for MCP App UI events */\n onEvent?: (event: McpAppsUIEvent) => void;\n\n /** Enable debug logging @default false */\n debug?: boolean;\n}\n\nexport type ConnectionStatus = 'connecting' | 'connected' | 'disconnected' | 'error';\n\nconst CONNECTION_EVENT_INTERVAL_MS = 300;\n\ninterface ToolUiMetadata {\n resourceUri?: string;\n uri?: string;\n visibility?: string[];\n}\n\nexport class SSEClient {\n private resourceCache = new Map<string, Promise<unknown>>();\n private connected = false;\n\n constructor(private readonly options: SSEClientOptions) {}\n\n connect(): void {\n if (this.connected) {\n return;\n }\n this.connected = true;\n this.options.onStatusChange?.('connected');\n this.log('RPC mode: post_stream');\n }\n\n disconnect(): void {\n this.connected = false;\n this.options.onStatusChange?.('disconnected');\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n async listSessions(): Promise<SessionListResult> {\n return this.sendRequest<SessionListResult>('listSessions');\n }\n\n async connectToServer(params: ConnectParams): Promise<ConnectResult> {\n return this.sendRequest<ConnectResult>('connect', params);\n }\n\n async disconnectFromServer(sessionId: string): Promise<DisconnectResult> {\n return this.sendRequest<DisconnectResult>('disconnect', { sessionId });\n }\n\n async listTools(sessionId: string): Promise<ListToolsRpcResult> {\n return this.sendRequest<ListToolsRpcResult>('listTools', { sessionId });\n }\n\n async callTool(\n sessionId: string,\n toolName: string,\n toolArgs: Record<string, unknown>\n ): Promise<unknown> {\n const result = await this.sendRequest('callTool', { sessionId, toolName, toolArgs });\n this.emitUiEventIfPresent(result, sessionId, toolName);\n return result;\n }\n\n async getSession(sessionId: string): Promise<GetSessionResult> {\n return this.sendRequest<GetSessionResult>('getSession', { sessionId });\n }\n\n async finishAuth(state: string, code: string): Promise<FinishAuthResult> {\n return this.sendRequest<FinishAuthResult>('finishAuth', { state, code });\n }\n\n async listPrompts(sessionId: string): Promise<ListPromptsResult> {\n return this.sendRequest<ListPromptsResult>('listPrompts', { sessionId });\n }\n\n async getPrompt(sessionId: string, name: string, args?: Record<string, string>): Promise<unknown> {\n return this.sendRequest('getPrompt', { sessionId, name, args });\n }\n\n async listResources(sessionId: string): Promise<ListResourcesResult> {\n return this.sendRequest<ListResourcesResult>('listResources', { sessionId });\n }\n\n async readResource(sessionId: string, uri: string): Promise<unknown> {\n return this.sendRequest('readResource', { sessionId, uri });\n }\n\n preloadToolUiResources(sessionId: string, tools: Array<{ name: string; _meta?: unknown }>): void {\n for (const tool of tools) {\n const uri = this.extractUiResourceUri(tool);\n if (!uri || this.resourceCache.has(uri)) continue;\n const promise = this.sendRequest('readResource', { sessionId, uri }).catch((err) => {\n this.log(`Failed to preload resource ${uri}: ${err.message}`, 'warn');\n this.resourceCache.delete(uri);\n return null;\n });\n this.resourceCache.set(uri, promise);\n }\n }\n\n getOrFetchResource(sessionId: string, uri: string): Promise<unknown> {\n const cached = this.resourceCache.get(uri);\n if (cached) return cached;\n const promise = this.sendRequest('readResource', { sessionId, uri });\n this.resourceCache.set(uri, promise);\n return promise;\n }\n\n hasPreloadedResource(uri: string): boolean {\n return this.resourceCache.has(uri);\n }\n\n clearResourceCache(): void {\n this.resourceCache.clear();\n }\n\n private async sendRequest<T = unknown>(method: McpRpcMethod, params?: McpRpcParams): Promise<T> {\n if (!this.connected) {\n this.connect();\n }\n\n this.log(`RPC request via post_stream: ${method}`);\n\n const request: McpRpcRequest = {\n id: `rpc_${nanoid(10)}`,\n method,\n params,\n };\n\n const response = await fetch(this.buildUrl(), {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const contentType = (response.headers.get('content-type') || '').toLowerCase();\n if (!contentType.includes('text/event-stream')) {\n const data = await response.json() as McpRpcResponse;\n return this.parseRpcResponse<T>(data);\n }\n\n const data = await this.readRpcResponseFromStream(response, {\n delayConnectionEvents:\n method === 'connect' ||\n method === 'getSession' ||\n method === 'finishAuth',\n });\n return this.parseRpcResponse<T>(data);\n }\n\n private async readRpcResponseFromStream(\n response: Response,\n options: { delayConnectionEvents?: boolean } = {}\n ): Promise<McpRpcResponse> {\n if (!response.body) {\n throw new Error('Streaming response body is missing');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let rpcResponse: McpRpcResponse | null = null;\n\n const dispatchBlock = async (block: string) => {\n const lines = block.split('\\n');\n let eventName = 'message';\n const dataLines: string[] = [];\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\r$/, '');\n if (!line || line.startsWith(':')) continue;\n if (line.startsWith('event:')) {\n eventName = line.slice('event:'.length).trim();\n continue;\n }\n if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n\n if (!dataLines.length) return;\n const payloadText = dataLines.join('\\n');\n let payload: unknown = payloadText;\n try {\n payload = JSON.parse(payloadText);\n } catch {\n // Keep raw text\n }\n\n switch (eventName) {\n case 'connected':\n this.options.onStatusChange?.('connected');\n break;\n case 'connection':\n this.options.onConnectionEvent?.(payload as McpConnectionEvent);\n if (options.delayConnectionEvents) {\n await this.sleep(CONNECTION_EVENT_INTERVAL_MS);\n }\n break;\n case 'observability':\n this.options.onObservabilityEvent?.(payload as McpObservabilityEvent);\n break;\n case 'rpc-response':\n rpcResponse = payload as McpRpcResponse;\n break;\n default:\n break;\n }\n };\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let separatorMatch = buffer.match(/\\r?\\n\\r?\\n/);\n while (separatorMatch && separatorMatch.index !== undefined) {\n const separatorIndex = separatorMatch.index;\n const separatorLength = separatorMatch[0].length;\n const block = buffer.slice(0, separatorIndex);\n buffer = buffer.slice(separatorIndex + separatorLength);\n await dispatchBlock(block);\n separatorMatch = buffer.match(/\\r?\\n\\r?\\n/);\n }\n }\n\n if (buffer.trim()) {\n await dispatchBlock(buffer);\n }\n\n if (!rpcResponse) {\n throw new Error('Missing rpc-response event in streamed RPC result');\n }\n\n return rpcResponse;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private parseRpcResponse<T>(data: McpRpcResponse): T {\n if ('result' in data) {\n return data.result as T;\n }\n if ('error' in data && data.error) {\n throw new Error(data.error.message || 'Unknown RPC error');\n }\n // JSON omits `result` when it is `undefined` (response becomes `{ id: ... }`).\n // Treat that shape as a successful void result.\n if (data && typeof data === 'object' && 'id' in data) {\n return undefined as T;\n }\n throw new Error('Invalid RPC response format');\n }\n\n private buildUrl(): string {\n return new URL(this.options.url, globalThis.location?.origin).toString();\n }\n\n private buildHeaders(): HeadersInit {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n 'x-mcp-user-id': this.options.userId,\n };\n\n if (this.options.authToken) {\n headers['Authorization'] = `Bearer ${this.options.authToken}`;\n }\n \n return headers;\n }\n\n private extractUiResourceUri(tool: { name: string; _meta?: unknown }): string | undefined {\n const meta = (tool._meta as { ui?: ToolUiMetadata })?.ui;\n if (!meta || typeof meta !== 'object') return undefined;\n if (meta.visibility && !meta.visibility.includes('app')) return undefined;\n return meta.resourceUri ?? meta.uri;\n }\n\n private emitUiEventIfPresent(result: unknown, sessionId: string, toolName: string): void {\n const meta = (result as { _meta?: { ui?: ToolUiMetadata } })?._meta;\n const resourceUri = meta?.ui?.resourceUri ?? (meta as any)?.['ui/resourceUri'];\n\n if (resourceUri) {\n this.options.onEvent?.({\n type: 'mcp-apps-ui',\n sessionId,\n resourceUri,\n toolName,\n result,\n timestamp: Date.now(),\n });\n }\n }\n\n private log(message: string, level: 'info' | 'warn' | 'error' = 'info'): void {\n if (!this.options.debug && level === 'info') return;\n\n const prefix = '[SSEClient]';\n switch (level) {\n case 'warn':\n console.warn(prefix, message);\n break;\n case 'error':\n console.error(prefix, message);\n break;\n default:\n console.log(prefix, message);\n }\n }\n}\n","/**\n * MCP App Host\n *\n * Bridges the gap between an iframe (MCP App) and the SSEClient (MCP Server).\n * Handles secure iframe sandboxing, resource loading, and bi-directional\n * communication via the AppBridge protocol.\n *\n * Key features:\n * - Secure iframe sandboxing with minimal permissions (proxy-based)\n * - Resource preloading for instant MCP App UI loading\n * - Cache-aware resource fetching (SSEClient cache → local cache → direct fetch)\n * - Support for ui:// and mcp-app:// resource URIs\n */\n\nimport { \n AppBridge, \n PostMessageTransport\n} from '@modelcontextprotocol/ext-apps/app-bridge';\nimport type { LoggingMessageNotification } from '@modelcontextprotocol/sdk/types.js';\nimport type { AppHostClient } from './types';\nimport { setupSandboxProxyIframe } from '../utils/app-host-utils.js';\nimport { APP_HOST_DEFAULTS } from './constants.js';\n\nexport type McpUiResourceCsp = Record<string, string>;\nexport type McpUiHostContext = Record<string, unknown>;\n\n// Define types dynamically from AppBridge properties instead of direct imports\n// which seem to fail in this tsconfig environment\ntype OnMessageHandler = NonNullable<AppBridge['onmessage']>;\nexport type McpUiMessageParams = Parameters<OnMessageHandler>[0];\nexport type RequestHandlerExtra = Parameters<OnMessageHandler>[1];\nexport type McpUiMessageResult = ReturnType<OnMessageHandler> extends Promise<infer R> ? R : never;\n\ntype OnOpenLinkHandler = NonNullable<AppBridge['onopenlink']>;\nexport type McpUiOpenLinkParams = Parameters<OnOpenLinkHandler>[0];\nexport type McpUiOpenLinkResult = ReturnType<OnOpenLinkHandler> extends Promise<infer R> ? R : never;\n\ntype OnSizeChangeHandler = NonNullable<AppBridge['onsizechange']>;\nexport type McpUiSizeChangedParams = Parameters<OnSizeChangeHandler>[0];\n\ntype OnRequestDisplayModeHandler = NonNullable<AppBridge['onrequestdisplaymode']>;\nexport type McpUiRequestDisplayModeParams = Parameters<OnRequestDisplayModeHandler>[0];\nexport type McpUiRequestDisplayModeResult = ReturnType<OnRequestDisplayModeHandler> extends Promise<infer R> ? R : never;\n\n\n// ============================================\n// Types & Interfaces\n// ============================================\n\nexport interface SandboxConfig {\n url: URL | string;\n permissions?: string;\n csp?: McpUiResourceCsp;\n}\n\n/**\n * Default Content-Security-Policy for MCP App iframes.\n *\n * Allows inline scripts/styles (required by most MCP App frameworks),\n * outbound network connections, and common asset sources, while blocking\n * nested frames and plugin objects.\n *\n * Pass this (or a spread of it) as `sandbox.csp` to enforce it:\n * @example\n * sandbox={{ url: '/sandbox.html', csp: DEFAULT_MCP_APP_CSP }}\n * // or to extend:\n * sandbox={{ url: '/sandbox.html', csp: { ...DEFAULT_MCP_APP_CSP, 'connect-src': \"'self' https://api.example.com\" } }}\n */\nexport const DEFAULT_MCP_APP_CSP: McpUiResourceCsp = {\n 'default-src': \"'self'\",\n 'script-src': \"'self' 'unsafe-inline' 'unsafe-eval' https: blob:\",\n 'style-src': \"'self' 'unsafe-inline' https:\",\n 'connect-src': \"'self' https: wss:\",\n 'img-src': \"'self' data: https: blob:\",\n 'font-src': \"'self' data: https:\",\n 'media-src': \"'self' https: blob:\",\n 'frame-src': \"'none'\",\n 'object-src': \"'none'\",\n 'base-uri': \"'self'\",\n};\n\nexport interface AppHostOptions {\n /** Enable debug logging @default false */\n debug?: boolean;\n /** Sandbox proxy configuration */\n sandbox?: SandboxConfig;\n /** Host context for theming, viewport, locale */\n hostContext?: McpUiHostContext;\n /** Custom handler for call tool requests, overriding automatic client forwarding */\n onCallTool?: (params: ToolCallParams) => Promise<unknown>;\n /** Custom handler for resources/read */\n onReadResource?: (uri: string) => Promise<ResourceResponse>;\n /** Custom handler for fallback JSON-RPC requests */\n onFallbackRequest?: (request: any) => Promise<any>;\n \n /** Handler for open-link requests from the guest UI */\n onOpenLink?: (\n params: McpUiOpenLinkParams,\n extra: RequestHandlerExtra,\n ) => Promise<McpUiOpenLinkResult>;\n\n /** Handler for message requests from the guest UI */\n onMessage?: (\n params: McpUiMessageParams,\n extra: RequestHandlerExtra,\n ) => Promise<McpUiMessageResult>;\n\n /** Handler for logging messages from the guest UI */\n onLoggingMessage?: (params: LoggingMessageNotification['params']) => void;\n\n /** Handler for size change notifications from the guest UI */\n onSizeChanged?: (params: McpUiSizeChangedParams) => void;\n\n /** Callback invoked when an error occurs during setup or message handling */\n onError?: (error: Error) => void;\n\n /** Handler for display mode change requests from the guest UI */\n onRequestDisplayMode?: (\n params: McpUiRequestDisplayModeParams,\n extra: RequestHandlerExtra,\n ) => Promise<McpUiRequestDisplayModeResult>;\n}\n\nexport interface AppMessageParams {\n role: string;\n content: unknown;\n}\n\ninterface ToolCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\ninterface ResourceContent {\n blob?: string;\n text?: string;\n}\n\ninterface ResourceResponse {\n contents: ResourceContent[];\n}\n\n// ============================================\n// Constants\n// ============================================\n\nconst HOST_INFO = APP_HOST_DEFAULTS.HOST_INFO;\n\n\n/** Supported MCP App URI schemes */\nconst MCP_URI_SCHEMES = APP_HOST_DEFAULTS.URI_SCHEMES;\n\n// ============================================\n// AppHost Class\n// ============================================\n\n/**\n * Host for MCP Apps embedded in iframes.\n * Manages secure communication between the app and the MCP server.\n */\nexport class AppHost {\n private bridge: AppBridge;\n private sessionId?: string;\n private resourceCache = new Map<string, Promise<ResourceResponse | null>>();\n private debug: boolean;\n\n private sandboxConfig?: SandboxConfig;\n private options: AppHostOptions;\n public onAppMessage?: (params: AppMessageParams) => void;\n\n constructor(\n private readonly client: AppHostClient | null,\n private readonly iframe: HTMLIFrameElement,\n options?: AppHostOptions\n ) {\n this.options = options || {};\n this.debug = this.options.debug ?? false;\n this.sandboxConfig = this.options.sandbox;\n\n this.bridge = this.initializeBridge();\n }\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Start the host. This prepares the bridge handlers but doesn't connect yet.\n * The actual connection happens in launch() after HTML is loaded.\n * @returns Promise that resolves immediately (bridge connects during launch)\n */\n async start(): Promise<void> {\n // Bridge handlers are already registered in constructor.\n // Connection happens in launch() after HTML is loaded.\n this.log('Host started, ready to launch');\n }\n\n /**\n * Preload UI resources to enable instant app loading.\n * Call this when tools are discovered to cache their UI resources.\n */\n preload(tools: Array<{ _meta?: unknown }>): void {\n for (const tool of tools) {\n const uri = this.extractUiResourceUri(tool);\n if (!uri || this.resourceCache.has(uri)) continue;\n\n const promise = this.preloadResource(uri);\n this.resourceCache.set(uri, promise);\n }\n }\n\n /**\n * Launch an MCP App from a URL, MCP resource URI, or RAW HTML.\n * Loads the HTML first, then establishes bridge connection.\n */\n async launch(source: { uri?: string; html?: string }, sessionId?: string): Promise<void> {\n if (sessionId) this.sessionId = sessionId;\n\n const initializedPromise = this.onAppReady();\n\n let htmlToRender = source.html;\n\n if (!htmlToRender && source.uri) {\n if (this.isMcpUri(source.uri)) {\n htmlToRender = await this.readMcpAppHtml(source.uri);\n }\n }\n\n if (!htmlToRender && source.uri && !this.isMcpUri(source.uri)) {\n // Fallback for regular urls without proxy\n this.iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms allow-modals allow-popups allow-downloads');\n this.iframe.src = source.uri;\n await this.onIframeReady();\n await this.connectBridge();\n } else if (htmlToRender) {\n if (!this.sandboxConfig) {\n throw new Error(\"Sandbox configuration requires a proxy URL to render HTML safely.\");\n }\n await this.launchSandboxedHtml(htmlToRender, this.sandboxConfig);\n await this.connectBridge();\n\n this.log('Sending HTML resource to sandbox proxy (MCP Apps notification)');\n await this.bridge.sendSandboxResourceReady({\n html: htmlToRender,\n csp: this.sandboxConfig.csp,\n });\n }\n\n this.log('Waiting for app initialization');\n await Promise.race([\n initializedPromise,\n new Promise<void>((resolve) => setTimeout(() => {\n this.log('Initialization timeout - continuing anyway', 'warn');\n resolve();\n }, 3000))\n ]);\n this.log('App launched and ready');\n }\n\n // Set host context manually\n setHostContext(context: McpUiHostContext): void {\n this.options.hostContext = context;\n if (this.bridge) {\n this.bridge.setHostContext(context);\n }\n }\n\n // Send streaming inputs manually\n sendToolInputPartial(params: any): void {\n if (this.bridge) {\n (this.bridge as any).sendToolInputPartial(params);\n }\n }\n\n /**\n * Wait for app to signal initialization complete\n */\n private onAppReady(): Promise<void> {\n return new Promise<void>((resolve) => {\n const originalHandler = this.bridge.oninitialized;\n this.bridge.oninitialized = (...args) => {\n this.log('App initialized');\n resolve();\n this.bridge.oninitialized = originalHandler;\n originalHandler?.(...args);\n };\n });\n }\n\n /**\n * Wait for iframe to finish loading\n */\n private onIframeReady(): Promise<void> {\n return new Promise((resolve) => {\n if (this.iframe.contentDocument?.readyState === 'complete') {\n resolve();\n return;\n }\n this.iframe.addEventListener('load', () => resolve(), { once: true });\n });\n }\n\n /**\n * Send tool input arguments to the MCP App.\n * Call this after launch() when tool input is available.\n */\n sendToolInput(args: Record<string, unknown>): void {\n this.log('Sending tool input to app');\n this.bridge.sendToolInput({ arguments: args });\n }\n\n /**\n * Send tool result to the MCP App.\n * Call this when the tool call completes.\n */\n sendToolResult(result: unknown): void {\n this.log('Sending tool result to app');\n this.bridge.sendToolResult(result as any);\n }\n\n /**\n * Send tool cancellation to the MCP App.\n * Call this when the tool call is cancelled or fails.\n */\n sendToolCancelled(reason: string): void {\n this.log('Sending tool cancellation to app');\n this.bridge.sendToolCancelled({ reason });\n }\n\n /**\n * Tell the guest UI the resource is being torn down (unload / cleanup).\n * Forwards to {@link AppBridge.teardownResource} on `@modelcontextprotocol/ext-apps/app-bridge`.\n */\n teardownResource(params: Record<string, unknown> = {}): void {\n this.log('Sending resource teardown to app');\n this.bridge.teardownResource(params as never);\n }\n\n // ============================================\n // Private: Initialization\n // ============================================\n\n\n private initializeBridge(): AppBridge {\n const bridge = new AppBridge(\n null,\n HOST_INFO,\n {\n openLinks: {},\n serverTools: {},\n logging: {},\n updateModelContext: { text: {} },\n },\n {\n hostContext: this.options.hostContext || {\n theme: 'dark',\n platform: 'web',\n containerDimensions: { maxHeight: 6000 },\n displayMode: 'inline',\n availableDisplayModes: ['inline', 'fullscreen'],\n },\n }\n );\n\n ;(bridge as any).fallbackRequestHandler = this.options.onFallbackRequest;\n \n bridge.oncalltool = (params) => this.handleToolCall(params);\n if (this.options.onReadResource) {\n bridge.onreadresource = async (params) => {\n const resp = await this.options.onReadResource!(params.uri);\n return { \n contents: resp.contents.map(c => ({\n uri: params.uri,\n text: c.text as string,\n blob: c.blob as string,\n }))\n };\n };\n }\n\n bridge.onopenlink = async (params, extra) => {\n if (this.options.onOpenLink) {\n return await this.options.onOpenLink(params, extra as any);\n }\n return this.handleOpenLink(params);\n };\n bridge.onmessage = async (params, extra) => {\n if (this.options.onMessage) {\n return await this.options.onMessage(params, extra as any);\n }\n return this.handleMessage(params as any);\n };\n bridge.onloggingmessage = (params) => {\n this.log(`App log [${params.level}]: ${params.data}`);\n if (this.options.onLoggingMessage) {\n this.options.onLoggingMessage(params);\n }\n };\n bridge.onupdatemodelcontext = async () => ({});\n bridge.onsizechange = async (params) => {\n const { width, height } = params;\n // Guard: ignore transient 0px resize events (e.g. fired by guest during viewport transitions)\n if (height !== undefined && height > 0) {\n this.iframe.style.height = `${height}px`;\n }\n if (width !== undefined && width > 0) this.iframe.style.minWidth = `min(${width}px, 100%)`;\n if (this.options.onSizeChanged) {\n this.options.onSizeChanged(params);\n }\n return {};\n };\n bridge.onrequestdisplaymode = async (params, extra) => {\n if (this.options.onRequestDisplayMode) {\n return await this.options.onRequestDisplayMode(params, extra as any);\n }\n return { mode: params.mode === 'fullscreen' ? 'fullscreen' : 'inline' };\n };\n\n return bridge;\n }\n\n private async connectBridge(): Promise<void> {\n this.log('Connecting bridge to iframe');\n\n const transport = new PostMessageTransport(\n this.iframe.contentWindow!,\n this.iframe.contentWindow!\n );\n\n try {\n await this.bridge.connect(transport);\n this.log('Bridge connected successfully');\n } catch (error) {\n this.log('Bridge connection failed', 'error');\n if (this.options.onError) {\n this.options.onError(error instanceof Error ? error : new Error(String(error)));\n }\n throw error;\n }\n }\n\n // ============================================\n // Private: Bridge Event Handlers\n // ============================================\n\n private async handleToolCall(params: ToolCallParams) {\n if (this.options.onCallTool) {\n return await this.options.onCallTool(params);\n }\n \n if (!this.client || !this.client.isConnected()) {\n throw new Error('Client disconnected or not provided');\n }\n\n const sessionId = await this.getSessionId();\n if (!sessionId) {\n throw new Error('No active session');\n }\n\n const result = await this.client.callTool(\n sessionId,\n params.name,\n params.arguments ?? {}\n );\n return result as any;\n }\n\n private async handleOpenLink(params: { url: string }): Promise<Record<string, never>> {\n window.open(params.url, '_blank', 'noopener,noreferrer');\n return {};\n }\n\n private async handleMessage(params: AppMessageParams): Promise<Record<string, never>> {\n this.onAppMessage?.(params);\n return {};\n }\n\n // ============================================\n // Private: Resource Loading\n // ============================================\n\n private async launchSandboxedHtml(html: string, config: SandboxConfig): Promise<void> {\n const sandboxUrlString = config.url instanceof URL ? config.url.href : config.url;\n const url = new URL(sandboxUrlString, globalThis.location?.href);\n if (config.csp && Object.keys(config.csp).length > 0) {\n url.searchParams.set('csp', JSON.stringify(config.csp));\n }\n\n const { onReady } = await setupSandboxProxyIframe(this.iframe, url);\n await onReady;\n }\n\n\n private async readMcpAppHtml(uri: string): Promise<string> {\n const sessionId = await this.getSessionId();\n if (!sessionId && !this.options.onReadResource) {\n throw new Error('No active session.');\n }\n const response = await this.fetchResourceWithCache(sessionId, uri);\n if (!response?.contents?.length) {\n throw new Error(`Empty resource: ${uri}`);\n }\n \n const content = response.contents[0];\n const html = this.decodeContent(content);\n if (!html) {\n throw new Error(`Invalid content in resource: ${uri}`);\n }\n return html;\n }\n\n private async fetchResourceWithCache(sessionId: string | undefined, uri: string): Promise<ResourceResponse> {\n if (this.options.onReadResource) {\n return await this.options.onReadResource(uri);\n }\n \n if (!sessionId) {\n throw new Error('No active session');\n }\n\n if (!this.client) {\n throw new Error('No client to read resource from');\n }\n \n // Priority 1: SSEClient's built-in cache (best performance)\n if (this.hasClientCache()) {\n return (this.client as any).getOrFetchResource(sessionId, uri);\n }\n\n // Priority 2: Local preload cache\n const cached = this.resourceCache.get(uri);\n if (cached) {\n const result = await cached;\n if (result) return result;\n }\n\n // Priority 3: Direct fetch\n return this.client.readResource(sessionId, uri) as Promise<ResourceResponse>;\n }\n\n private async preloadResource(uri: string): Promise<ResourceResponse | null> {\n try {\n if (this.options.onReadResource) {\n return await this.options.onReadResource(uri);\n }\n const sessionId = await this.getSessionId();\n if (!sessionId || !this.client) return null;\n return await this.client.readResource(sessionId, uri) as ResourceResponse;\n } catch (error) {\n this.log(`Preload failed for ${uri}`, 'warn');\n return null;\n }\n }\n\n // ============================================\n // Private: Utilities\n // ============================================\n\n private async getSessionId(): Promise<string | undefined> {\n if (this.sessionId) return this.sessionId;\n if (!this.client) return undefined;\n const result = await this.client.listSessions();\n return result.sessions?.[0]?.sessionId;\n }\n\n private isMcpUri(url: string): boolean {\n return MCP_URI_SCHEMES.some(scheme => url.startsWith(scheme));\n }\n\n private hasClientCache(): boolean {\n if (!this.client) return false;\n return 'getOrFetchResource' in this.client &&\n typeof (this.client as any).getOrFetchResource === 'function';\n }\n\n private extractUiResourceUri(tool: { _meta?: unknown }): string | undefined {\n const meta = tool._meta as { ui?: { resourceUri?: string; uri?: string } } | undefined;\n if (!meta?.ui) return undefined;\n return meta.ui.resourceUri ?? meta.ui.uri;\n }\n\n private decodeContent(content: ResourceContent): string | undefined {\n if (content.blob) {\n return atob(content.blob);\n }\n return content.text;\n }\n\n private log(message: string, level: 'info' | 'warn' | 'error' = 'info'): void {\n if (!this.debug && level === 'info') return;\n\n const prefix = '[AppHost]';\n switch (level) {\n case 'warn':\n console.warn(prefix, message);\n break;\n case 'error':\n console.error(prefix, message);\n break;\n default:\n console.log(prefix, message);\n }\n }\n}\n","import { APP_HOST_DEFAULTS, SANDBOX_PROXY_READY_METHOD } from '../core/constants.js';\n\nconst DEFAULT_SANDBOX_TIMEOUT_MS = APP_HOST_DEFAULTS.SANDBOX_TIMEOUT_MS;\n\nexport async function setupSandboxProxyIframe(\n iframe: HTMLIFrameElement,\n sandboxProxyUrl: URL\n): Promise<{\n onReady: Promise<void>;\n}> {\n iframe.style.width = '100%';\n iframe.style.height = '100%';\n iframe.style.border = 'none';\n iframe.style.backgroundColor = 'transparent';\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms allow-modals allow-popups allow-downloads');\n\n const onReady = new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n window.removeEventListener('message', messageListener);\n iframe.removeEventListener('error', errorListener);\n };\n\n const timeoutId = setTimeout(() => {\n if (!settled) {\n settled = true;\n cleanup();\n reject(new Error('Timed out waiting for sandbox proxy iframe to be ready'));\n }\n }, DEFAULT_SANDBOX_TIMEOUT_MS);\n\n const messageListener = (event: MessageEvent) => {\n if (event.source === iframe.contentWindow) {\n if (event.data?.method === SANDBOX_PROXY_READY_METHOD) {\n if (!settled) {\n settled = true;\n clearTimeout(timeoutId);\n cleanup();\n resolve();\n }\n }\n }\n };\n\n const errorListener = () => {\n if (!settled) {\n settled = true;\n clearTimeout(timeoutId);\n cleanup();\n reject(new Error('Failed to load sandbox proxy iframe'));\n }\n };\n\n window.addEventListener('message', messageListener);\n iframe.addEventListener('error', errorListener);\n });\n\n iframe.src = sandboxProxyUrl.href;\n\n return { onReady };\n}\n","/**\n * Default configuration values for the App Host.\n *\n * `SANDBOX_*_READY_METHOD` match `@modelcontextprotocol/ext-apps` (see\n * https://github.com/modelcontextprotocol/ext-apps/blob/main/src/types.ts ).\n * Duplicated here because the package root `app.d.ts` often omits these value exports under\n * `moduleResolution: \"NodeNext\"`.\n */\nexport const SANDBOX_PROXY_READY_METHOD = 'ui/notifications/sandbox-proxy-ready' as const;\nexport const SANDBOX_RESOURCE_READY_METHOD = 'ui/notifications/sandbox-resource-ready' as const;\n\nexport const APP_HOST_DEFAULTS = {\n /** Default timeout for waiting for the sandbox proxy to be ready (ms). */\n SANDBOX_TIMEOUT_MS: 10000,\n \n /** Default host info reported to guest apps. */\n HOST_INFO: { name: 'mcp-ts-host', version: '1.0.0' },\n\n /** Supported MCP App URI schemes. */\n URI_SCHEMES: ['ui://', 'mcp-app://'] as const,\n\n /** Default theme for the host context. */\n THEME: 'dark',\n\n /** Default platform for the host context. */\n PLATFORM: 'web',\n\n /** Default max height for the iframe container (px). */\n MAX_HEIGHT: 6000,\n} as const;\n","/**\n * MCP Redis Shared Package\n * Shared types and utilities for both server and client\n */\n\n// Events\nexport {\n Emitter,\n DisposableStore,\n type Disposable,\n type Event,\n type McpConnectionState,\n type McpConnectionEvent,\n type McpObservabilityEvent,\n} from './events';\n\n// Constants\nexport * from './constants';\n\n// Errors\nexport * from './errors';\n\n// Types\nexport type {\n ToolClient,\n ToolClientProvider,\n ToolInfo,\n McpRpcRequest,\n McpRpcResponse,\n McpRpcMethod,\n McpRpcParams,\n TransportType,\n // API types\n ConnectRequest,\n ConnectResponse,\n ConnectSuccessResponse,\n ConnectAuthRequiredResponse,\n ConnectErrorResponse,\n ListToolsResponse,\n CallToolRequest,\n CallToolResponse,\n // RPC param types\n ConnectParams,\n DisconnectParams,\n SessionParams,\n CallToolParams,\n GetPromptParams,\n ReadResourceParams,\n FinishAuthParams,\n // RPC result types\n SessionInfo,\n SessionListResult,\n ConnectResult,\n DisconnectResult,\n GetSessionResult,\n FinishAuthResult,\n ListToolsRpcResult,\n ListPromptsResult,\n ListResourcesResult,\n} from './types';\n\nexport {\n isConnectSuccess,\n isConnectAuthRequired,\n isConnectError,\n isListToolsSuccess,\n isCallToolSuccess,\n} from './types';\n\n// Utilities\nexport { sanitizeServerLabel } from './utils.js';\nexport {\n getToolUiResourceUri,\n findToolByName,\n type ToolUiConfig,\n} from './tool-utils.js';\n\n// Tool Router — Context window optimization\nexport {\n ToolRouter,\n type ToolRouterOptions,\n type ToolRouterStrategy,\n type ToolRouterClientInput,\n type ToolGroupInfo,\n} from './tool-router.js';\n\nexport {\n ToolIndex,\n type ToolSummary,\n type ToolServerSummary,\n type ToolSearchOptions,\n type ToolListResult,\n type IndexedTool,\n type ToolIndexOptions,\n type EmbedFn,\n} from './tool-index.js';\n\nexport {\n SchemaCompressor,\n type CompactTool,\n} from './schema-compressor.js';\n\nexport {\n createSearchToolDefinition,\n createListServersToolDefinition,\n createRegexSearchToolDefinition,\n createGetSchemaToolDefinition,\n createExecuteToolDefinition,\n executeMetaTool,\n isMetaTool,\n resolveMetaToolProxy,\n type CallToolFn,\n} from './meta-tools.js';\n\n","/**\n * Type definitions for MCP operations\n */\n\nimport { Tool, CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\n// ---------------------------------------------------------------------------\n// Core Capability Interfaces\n// ---------------------------------------------------------------------------\n\n/**\n * A client that can list and execute MCP tools.\n *\n * This is the structural interface that `ToolRouter`, adapters, and other\n * consumers use to interact with any MCP client implementation.\n * Both `MCPClient` and `createMcpClient()` satisfy this interface.\n */\nexport interface ToolClient {\n isConnected(): boolean;\n listTools(): Promise<{ tools: Tool[] }>;\n callTool(name: string, args: Record<string, unknown>): Promise<any>;\n getServerId?(): string | undefined;\n getServerName?(): string | undefined;\n getSessionId?(): string;\n}\n\n/**\n * A provider that manages multiple `ToolClient` instances.\n *\n * `MultiSessionClient` satisfies this interface. Pass it directly\n * to `ToolRouter` or adapters to aggregate tools from all connected servers.\n */\nexport interface ToolClientProvider {\n getClients(): ToolClient[];\n}\n\n// Connect API types\nexport interface ConnectRequest {\n serverUrl: string;\n callbackUrl: string;\n}\n\nexport interface ConnectSuccessResponse {\n success: true;\n sessionId: string;\n}\n\nexport interface ConnectAuthRequiredResponse {\n requiresAuth: true;\n authUrl: string;\n sessionId: string;\n}\n\nexport interface ConnectErrorResponse {\n error: string;\n}\n\nexport type ConnectResponse =\n | ConnectSuccessResponse\n | ConnectAuthRequiredResponse\n | ConnectErrorResponse;\n\n// Callback API types\nexport interface CallbackSuccessResponse {\n success: true;\n message: string;\n}\n\nexport interface CallbackErrorResponse {\n error: string;\n}\n\nexport type CallbackResponse = CallbackSuccessResponse | CallbackErrorResponse;\n\n// Disconnect API types\nexport interface DisconnectRequest {\n sessionId: string;\n}\n\nexport interface DisconnectSuccessResponse {\n success: true;\n message: string;\n}\n\nexport interface DisconnectErrorResponse {\n error: string;\n}\n\nexport type DisconnectResponse =\n | DisconnectSuccessResponse\n | DisconnectErrorResponse;\n\n// List Tools API types\nexport interface ListToolsSuccessResponse {\n tools: Tool[];\n}\n\nexport interface ListToolsErrorResponse {\n error: string;\n}\n\nexport type ListToolsResponse =\n | ListToolsSuccessResponse\n | ListToolsErrorResponse;\n\n// Call Tool API types\nexport interface CallToolRequest {\n sessionId: string;\n toolName: string;\n toolArgs: Record<string, unknown>;\n}\n\nexport interface CallToolSuccessResponse {\n content: Array<{\n type: string;\n text?: string;\n [key: string]: unknown;\n }>;\n isError: boolean;\n}\n\nexport interface CallToolErrorResponse {\n error: string;\n}\n\nexport type CallToolResponse =\n | CallToolSuccessResponse\n | CallToolErrorResponse;\n\n// Helper type guards\nexport function isConnectSuccess(\n response: ConnectResponse\n): response is ConnectSuccessResponse {\n return 'success' in response && response.success === true;\n}\n\nexport function isConnectAuthRequired(\n response: ConnectResponse\n): response is ConnectAuthRequiredResponse {\n return 'requiresAuth' in response && response.requiresAuth === true;\n}\n\nexport function isConnectError(\n response: ConnectResponse\n): response is ConnectErrorResponse {\n return 'error' in response;\n}\n\nexport function isListToolsSuccess(\n response: ListToolsResponse\n): response is ListToolsSuccessResponse {\n return 'tools' in response;\n}\n\nexport function isCallToolSuccess(\n response: CallToolResponse\n): response is CallToolSuccessResponse {\n return 'content' in response;\n}\n\n// Generic tool info type\nexport type ToolInfo = {\n name: string;\n description?: string;\n inputSchema?: Tool['inputSchema'];\n outputSchema?: Tool['outputSchema'];\n};\n\n// Transport type\nexport type TransportType = 'sse' | 'streamable-http';\nexport type SessionStatus = 'pending' | 'active';\n\n// SSE/RPC types\nexport type McpRpcMethod =\n | 'connect'\n | 'disconnect'\n | 'listTools'\n | 'callTool'\n | 'listSessions'\n | 'getSession'\n | 'finishAuth'\n | 'listPrompts'\n | 'getPrompt'\n | 'listResources'\n | 'readResource';\n\nexport interface McpRpcRequest {\n id: string;\n method: McpRpcMethod;\n params?: McpRpcParams;\n}\n\nexport interface McpRpcResponse<T = unknown> {\n id: string;\n result?: T;\n error?: {\n code: string;\n message: string;\n };\n}\n\n// RPC Parameter Types\nexport interface ConnectParams {\n serverId?: string; // Optional - generated server-side if not provided\n serverName: string;\n serverUrl: string;\n callbackUrl: string;\n transportType?: TransportType;\n headers?: Record<string, string>;\n}\n\nexport interface DisconnectParams {\n sessionId: string;\n}\n\nexport interface SessionParams {\n sessionId: string;\n}\n\nexport interface CallToolParams {\n sessionId: string;\n toolName: string;\n toolArgs: Record<string, unknown>;\n}\n\nexport interface GetPromptParams {\n sessionId: string;\n name: string;\n args?: Record<string, string>;\n}\n\nexport interface ReadResourceParams {\n sessionId: string;\n uri: string;\n}\n\nexport interface FinishAuthParams {\n state: string;\n code: string;\n}\n\nexport type McpRpcParams =\n | ConnectParams\n | DisconnectParams\n | SessionParams\n | CallToolParams\n | GetPromptParams\n | ReadResourceParams\n | FinishAuthParams\n | undefined;\n\n// RPC Result Types\nexport interface SessionInfo {\n sessionId: string;\n serverId?: string;\n serverName?: string;\n serverUrl: string;\n transport: TransportType;\n createdAt: number;\n updatedAt?: number;\n /**\n * Session readiness for auto-restore.\n * `pending` means auth is in progress and should be resumed explicitly by user action.\n */\n status: SessionStatus;\n}\n\nexport interface SessionListResult {\n sessions: SessionInfo[];\n}\n\nexport interface ConnectResult {\n sessionId: string;\n success: boolean;\n}\n\nexport interface DisconnectResult {\n success: boolean;\n}\n\nexport interface GetSessionResult {\n success: boolean;\n toolCount: number;\n}\n\nexport interface FinishAuthResult {\n success: boolean;\n toolCount: number;\n}\n\nexport interface ListToolsRpcResult {\n tools: Tool[];\n}\n\nexport interface ListPromptsResult {\n prompts: Array<{\n name: string;\n description?: string;\n arguments?: Array<{\n name: string;\n description?: string;\n required?: boolean;\n }>;\n }>;\n}\n\nexport interface ListResourcesResult {\n resources: Array<{\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n }>;\n}\n\nexport type { CallToolResult };\n","/**\n * Utility functions for working with MCP tool metadata\n */\n\nimport type { ToolInfo } from './types.js';\n\nexport interface ToolUiConfig {\n resourceUri: string;\n sessionId: string;\n}\n\n/**\n * Extract UI resource URI from tool metadata\n *\n * @param tool - The tool to extract UI config from\n * @returns The resource URI if available, undefined otherwise\n *\n * @example\n * const uri = getToolUiResourceUri(tool);\n * if (uri) {\n * // Tool has UI configuration\n * }\n */\nexport function getToolUiResourceUri(tool: ToolInfo): string | undefined {\n const meta = (tool as any)._meta;\n if (!meta?.ui) return undefined;\n\n const ui = meta.ui;\n if (typeof ui !== \"object\" || !ui) return undefined;\n\n // Check visibility filter - skip if explicitly hidden from app\n if (ui.visibility && !ui.visibility.includes(\"app\")) return undefined;\n\n // Support both 'uri' and 'resourceUri' field names for flexibility\n return typeof ui.resourceUri === \"string\"\n ? ui.resourceUri\n : typeof ui.uri === \"string\"\n ? ui.uri\n : undefined;\n}\n\n/**\n * Find a tool by name within connections\n *\n * @param connections - Array of MCP connections\n * @param toolName - Name of the tool to find\n * @returns The tool if found, undefined otherwise\n *\n * @example\n * const tool = findToolByName(connections, \"get_weather\");\n */\nexport function findToolByName(\n connections: Array<{ tools: ToolInfo[] }>,\n toolName: string\n): ToolInfo | undefined {\n for (const conn of connections) {\n const tool = conn.tools.find((t) => t.name === toolName);\n if (tool) return tool;\n }\n return undefined;\n}\n","/**\n * ToolRouter — Middleware layer for intelligent MCP tool selection.\n *\n * Sits between your AI framework adapter and MultiSessionClient to reduce\n * context window usage. Supports three strategies:\n *\n * • `all` — Pass through every tool (backward-compatible default)\n * • `search` — Expose only meta-tools; LLM discovers tools on-demand\n * • `groups` — Expose tools from active groups only\n *\n * Inspired by Anthropic's `defer_loading` + `tool_search_tool` pattern.\n *\n * @example\n * ```ts\n * import { ToolRouter } from '@mcp-ts/sdk/shared';\n * import { AIAdapter } from '@mcp-ts/sdk/adapters/ai';\n *\n * const router = new ToolRouter(multiSessionClient, {\n * strategy: 'search',\n * maxTools: 5,\n * });\n *\n * const tools = await AIAdapter.getTools(multiSessionClient, { toolRouter: router });\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { ToolClient, ToolClientProvider } from './types.js';\nimport {\n ToolIndex,\n type IndexedTool,\n type ToolLookupOptions,\n type ToolListResult,\n type ToolSearchOptions,\n type ToolServerSummary,\n type ToolSummary,\n type EmbedFn,\n} from './tool-index.js';\nimport { SchemaCompressor, type CompactTool } from './schema-compressor.js';\nimport {\n createSearchToolDefinition,\n createListServersToolDefinition,\n createRegexSearchToolDefinition,\n createGetSchemaToolDefinition,\n createExecuteToolDefinition,\n} from './meta-tools.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ToolRouterStrategy = 'all' | 'search' | 'groups';\n\nexport interface ToolRouterOptions {\n /**\n * Strategy for tool selection.\n *\n * • `all` — Expose all tools (default, backward-compatible)\n * • `search` — Expose only meta-tools; LLM discovers real tools via search\n * • `groups` — Expose only tools from active groups\n *\n * @default 'all'\n */\n strategy?: ToolRouterStrategy;\n\n /**\n * Maximum tools to expose to the LLM at once.\n * Only applies to `groups` strategy and search results.\n * @default 40\n */\n maxTools?: number;\n\n /**\n * Tool groups configuration — map of group name to tool names.\n * When not provided, groups are auto-generated from server names.\n *\n * @example\n * ```ts\n * groups: {\n * database: ['query_db', 'list_tables', 'describe_table'],\n * github: ['create_pr', 'list_issues', 'search_code'],\n * }\n * ```\n */\n groups?: Record<string, string[]>;\n\n /**\n * Active groups (when `strategy='groups'`).\n * Only tools in these groups are exposed. Empty = all groups active.\n */\n activeGroups?: string[];\n\n /**\n * Whether to use compact schemas (name + description + parameterHint only, no inputSchema).\n * Reduces token usage but requires 2-turn flow: LLM picks tool → get schema → call.\n * @default false\n */\n compactSchemas?: boolean;\n\n /**\n * Tool names to expose directly when using `search` strategy.\n * Pinned tools are removed from discovery results and should be called directly.\n */\n pinnedTools?: string[];\n\n /**\n * Tool names to omit from direct exposure while keeping them indexed for\n * search/schema lookup/calls through meta-tools.\n */\n deferredTools?: string[];\n\n /**\n * Tool names or glob-style patterns to omit entirely from the router catalog.\n */\n excludeTools?: string[];\n\n /**\n * Optional embedding function for semantic search.\n * When not provided, keyword TF-IDF matching is used.\n */\n embedFn?: EmbedFn;\n\n /**\n * Weight of keyword score vs embedding score (0–1).\n * Only relevant when `embedFn` is provided.\n * @default 0.4\n */\n keywordWeight?: number;\n}\n\n/** Information about a tool group. */\nexport interface ToolGroupInfo {\n tools: string[];\n active: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Client Input Types\n// ---------------------------------------------------------------------------\n\n/**\n * Accepted client input for ToolRouter.\n * Pass a `ToolClientProvider` (e.g. MultiSessionClient), or an array of `ToolClient` instances.\n */\nexport type ToolRouterClientInput = ToolClientProvider | ToolClient[];\n\n// ---------------------------------------------------------------------------\n// ToolRouter\n// ---------------------------------------------------------------------------\n\nexport class ToolRouter {\n private index: ToolIndex;\n private allTools: IndexedTool[] = [];\n private pinnedTools: IndexedTool[] = [];\n private deferredTools: IndexedTool[] = [];\n private discoverableTools: IndexedTool[] = [];\n private groupsMap = new Map<string, ToolGroupInfo>();\n private strategy: ToolRouterStrategy;\n private maxTools: number;\n private compactSchemas: boolean;\n private activeGroups: Set<string>;\n private customGroups?: Record<string, string[]>;\n private pinnedToolNames: Set<string>;\n private deferredToolNames: Set<string>;\n private excludeToolMatchers: RegExp[];\n private initialized = false;\n\n constructor(\n private client: ToolRouterClientInput,\n private options: ToolRouterOptions = {}\n ) {\n this.strategy = options.strategy ?? 'all';\n this.maxTools = options.maxTools ?? 40;\n this.compactSchemas = options.compactSchemas ?? false;\n this.activeGroups = new Set(options.activeGroups ?? []);\n this.customGroups = options.groups;\n this.pinnedToolNames = new Set(options.pinnedTools ?? []);\n this.deferredToolNames = new Set(options.deferredTools ?? []);\n this.excludeToolMatchers = (options.excludeTools ?? []).map((pattern) =>\n globToRegExp(pattern)\n );\n\n this.index = new ToolIndex({\n embedFn: options.embedFn,\n keywordWeight: options.keywordWeight,\n });\n }\n\n // -----------------------------------------------------------------------\n // Core Public API\n // -----------------------------------------------------------------------\n\n /**\n * Get tools filtered by the current strategy.\n * This is the main method adapters should call.\n *\n * - `all` → returns all tools (unchanged behavior)\n * - `search` → returns only meta-tools (mcp_search_tools, mcp_get_tool_schema, mcp_execute_tool)\n * - `groups` → returns tools from active groups only\n */\n async getFilteredTools(): Promise<Tool[]> {\n await this.ensureInitialized();\n\n switch (this.strategy) {\n case 'search':\n return [...this.getMetaToolDefinitions(), ...this.pinnedTools];\n\n case 'groups':\n return this.getGroupFilteredTools();\n\n case 'all':\n default:\n const directlyVisibleTools = this.getDirectlyVisibleTools();\n if (this.compactSchemas) {\n // Return tools with inputSchema stripped\n return directlyVisibleTools.map((t) => {\n const compact = SchemaCompressor.toCompact(t);\n return {\n name: compact.name,\n description:\n (compact.description ?? '') +\n (compact.parameterHint ? ` Parameters: ${compact.parameterHint}` : ''),\n inputSchema: { type: 'object' as const, properties: {} },\n };\n });\n }\n return [...directlyVisibleTools];\n }\n }\n\n /**\n * Search tools by natural-language query.\n * Works regardless of strategy.\n */\n async searchTools(\n query: string,\n topK?: number,\n options: ToolSearchOptions = {}\n ): Promise<ToolSummary[]> {\n await this.ensureInitialized();\n const limit = topK ?? this.maxTools;\n return this.index.search(query, limit, options);\n }\n\n /**\n * Search tools by regex pattern.\n * Matches against name, description, and parameter metadata.\n */\n async searchToolsRegex(pattern: string, topK?: number): Promise<ToolSummary[]> {\n await this.ensureInitialized();\n return this.index.searchRegex(pattern, topK ?? this.maxTools);\n }\n\n /** List connected MCP servers with indexed tool counts. */\n async listServers(options: ToolSearchOptions = {}): Promise<ToolServerSummary[]> {\n await this.ensureInitialized();\n return this.index.listServers(options);\n }\n\n /** List tools deterministically, optionally scoped to a server. */\n async listTools(options: ToolSearchOptions & { limit?: number; cursor?: string } = {}): Promise<ToolListResult> {\n await this.ensureInitialized();\n return this.index.listTools(options);\n }\n\n /**\n * Get the full tool definition by name.\n * If tool name is ambiguous, use namespace to specify the server.\n */\n getToolSchema(\n toolName: string,\n namespace?: string,\n options: ToolLookupOptions = {}\n ): IndexedTool | undefined {\n const matches = this.getIndexedToolMatches(toolName, namespace, options);\n\n if (matches.length === 0) return undefined;\n\n if (matches.length > 1) {\n const servers = matches.map((m) => m.serverId).join(', ');\n throw new Error(\n `Tool \"${toolName}\" is provided by multiple servers: [${servers}]. ` +\n `Please specify the desired \"serverId\" as a namespace.`\n );\n }\n\n return matches[0];\n }\n\n /**\n * Resolve the full tool definition by name, ensuring the router index has\n * been initialized first.\n */\n async resolveToolSchema(\n toolName: string,\n namespace?: string,\n options: ToolLookupOptions = {}\n ): Promise<IndexedTool | undefined> {\n await this.ensureInitialized();\n return this.getToolSchema(toolName, namespace, options);\n }\n\n /**\n * Get compact (schema-less) summaries for all tools.\n */\n getCompactTools(): CompactTool[] {\n return SchemaCompressor.compactAll(this.allTools);\n }\n\n // -----------------------------------------------------------------------\n // Group Management\n // -----------------------------------------------------------------------\n\n /** Get all available groups with their tool lists and active status. */\n getGroups(): Map<string, ToolGroupInfo> {\n return new Map(this.groupsMap);\n }\n\n /** Activate specific groups. Pass empty array to activate all. */\n setActiveGroups(groups: string[]): void {\n this.activeGroups = new Set(groups);\n // Update groupsMap active flags\n for (const [name, info] of this.groupsMap) {\n info.active = this.activeGroups.size === 0 || this.activeGroups.has(name);\n }\n }\n\n /** Get the names of currently active groups. */\n getActiveGroups(): string[] {\n return [...this.activeGroups];\n }\n\n /** Number of total indexed tools. */\n get totalToolCount(): number {\n return this.allTools.length;\n }\n\n /** Change strategy at runtime. */\n setStrategy(strategy: ToolRouterStrategy): void {\n this.strategy = strategy;\n }\n\n /**\n * Force a re-index of tools from all connected clients.\n * Call this after adding/removing MCP server connections.\n */\n async refresh(): Promise<void> {\n this.initialized = false;\n await this.ensureInitialized();\n }\n\n /**\n * Execute a tool by routing to the correct MCP client.\n * Used by the `mcp_execute_tool` meta-tool to proxy tool calls.\n */\n async callTool(\n toolName: string,\n args: Record<string, unknown>,\n namespace?: string\n ): Promise<any> {\n await this.ensureInitialized();\n\n const indexedTool = this.getToolSchema(toolName, namespace);\n if (!indexedTool) {\n throw new Error(\n `Tool \"${toolName}\" not found${\n namespace ? ` on server \"${namespace}\"` : ''\n }. Use mcp_search_tools or mcp_search_tool_regex to discover available tools.`\n );\n }\n\n const clients = this.getClients();\n const targetClient =\n clients.find(\n (c) =>\n typeof c.getSessionId === 'function' &&\n c.getSessionId() === indexedTool.sessionId\n ) ?? clients.find((c) => c.isConnected());\n\n if (!targetClient) {\n throw new Error(`No connected client found for tool \"${toolName}\"`);\n }\n\n return await targetClient.callTool(toolName, args);\n }\n\n // -----------------------------------------------------------------------\n // Internals\n // -----------------------------------------------------------------------\n\n /** Lazy initialization — fetches tools from all connected clients. */\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n const fetchedTools = await this.fetchAllTools();\n this.allTools = fetchedTools.filter((tool) => !this.matchesExcludedTool(tool.name));\n this.pinnedTools = this.allTools.filter((tool) => this.matchesPinnedTool(tool.name));\n this.deferredTools = this.allTools.filter(\n (tool) => !this.matchesPinnedTool(tool.name) && this.matchesDeferredTool(tool)\n );\n this.discoverableTools = this.allTools.filter((tool) => !this.matchesPinnedTool(tool.name));\n await this.index.buildIndex(this.discoverableTools);\n this.buildGroups();\n this.initialized = true;\n }\n\n /** Fetch tools from all connected MCP clients. */\n private async fetchAllTools(): Promise<IndexedTool[]> {\n const clients = this.getClients();\n const result: IndexedTool[] = [];\n\n for (const client of clients) {\n if (!client.isConnected()) continue;\n\n try {\n const { tools } = await client.listTools();\n const serverId =\n typeof client.getServerId === 'function' ? client.getServerId() ?? 'unknown' : 'unknown';\n const serverName =\n (typeof client.getServerName === 'function' ? client.getServerName() : undefined) ??\n serverId;\n const sessionId =\n typeof client.getSessionId === 'function' ? client.getSessionId() ?? 'unknown' : 'unknown';\n\n for (const tool of tools) {\n result.push({\n ...tool,\n serverId,\n serverName: serverName,\n sessionId,\n });\n }\n } catch (err) {\n console.warn('[ToolRouter] Failed to fetch tools from client:', err);\n }\n }\n\n return result;\n }\n\n /** Resolve the client input to a flat array of ToolClient instances. */\n private getClients(): ToolClient[] {\n if (Array.isArray(this.client)) {\n return this.client;\n }\n if (typeof (this.client as ToolClientProvider).getClients === 'function') {\n return (this.client as ToolClientProvider).getClients();\n }\n // Single client\n return [this.client as unknown as ToolClient];\n }\n\n /** Build group map from custom config or auto-detect from server names. */\n private buildGroups(): void {\n this.groupsMap.clear();\n\n if (this.customGroups) {\n // Explicit groups\n for (const [name, tools] of Object.entries(this.customGroups)) {\n this.groupsMap.set(name, {\n tools,\n active: this.activeGroups.size === 0 || this.activeGroups.has(name),\n });\n }\n } else {\n // Auto-group by server ID\n const serverTools = new Map<string, string[]>();\n for (const tool of this.allTools) {\n const group = tool.serverId;\n if (!serverTools.has(group)) {\n serverTools.set(group, []);\n }\n serverTools.get(group)!.push(tool.name);\n }\n\n for (const [serverId, tools] of serverTools) {\n this.groupsMap.set(serverId, {\n tools,\n active: this.activeGroups.size === 0 || this.activeGroups.has(serverId),\n });\n }\n }\n }\n\n /** Return only tools belonging to currently active groups. */\n private getGroupFilteredTools(): Tool[] {\n const activeToolNames = new Set<string>();\n for (const [, info] of this.groupsMap) {\n if (info.active) {\n for (const name of info.tools) {\n activeToolNames.add(name);\n }\n }\n }\n\n const filtered = this.getDirectlyVisibleTools().filter((t) => activeToolNames.has(t.name));\n\n if (this.compactSchemas) {\n return filtered.slice(0, this.maxTools).map((t) => {\n const compact = SchemaCompressor.toCompact(t);\n return {\n name: compact.name,\n description:\n (compact.description ?? '') +\n (compact.parameterHint ? ` Parameters: ${compact.parameterHint}` : ''),\n inputSchema: { type: 'object' as const, properties: {} },\n };\n });\n }\n\n return filtered.slice(0, this.maxTools);\n }\n\n /** The 4 meta-tool definitions exposed in `search` strategy. */\n private getMetaToolDefinitions(): Tool[] {\n return [\n createSearchToolDefinition(),\n createListServersToolDefinition(),\n createRegexSearchToolDefinition(),\n createGetSchemaToolDefinition(),\n createExecuteToolDefinition(),\n ];\n }\n\n private matchesPinnedTool(toolName: string): boolean {\n return this.pinnedToolNames.has(toolName);\n }\n\n private matchesDeferredTool(tool: Tool): boolean {\n if (this.deferredToolNames.has(tool.name)) {\n return true;\n }\n\n const meta = (tool as Tool & {\n _meta?: { toolRouter?: { deferred?: boolean } };\n })._meta;\n return meta?.toolRouter?.deferred === true;\n }\n\n private matchesExcludedTool(toolName: string): boolean {\n return this.excludeToolMatchers.some((matcher) => matcher.test(toolName));\n }\n\n private getDirectlyVisibleTools(): IndexedTool[] {\n return this.allTools.filter((tool) => !this.matchesDeferredTool(tool) || this.matchesPinnedTool(tool.name));\n }\n\n private getIndexedToolMatches(\n toolName: string,\n namespace?: string,\n options: ToolLookupOptions = {}\n ): IndexedTool[] {\n const indexedMatches = this.index.getTool(toolName, namespace, options);\n if (indexedMatches.length > 0 || !this.matchesPinnedTool(toolName)) {\n return indexedMatches;\n }\n\n return this.matchTools(this.pinnedTools.filter((tool) => tool.name === toolName), namespace, options);\n }\n\n private matchTools(\n tools: IndexedTool[],\n namespace?: string,\n options: ToolLookupOptions = {}\n ): IndexedTool[] {\n if (!namespace) return tools;\n\n const exactMatches = tools.filter(\n (tool) => tool.sessionId === namespace || tool.serverId === namespace\n );\n if (exactMatches.length > 0) return exactMatches;\n\n if (!options.allowServerNameFragment) return [];\n\n const namespaceLower = namespace.toLowerCase();\n return tools.filter((tool) => tool.serverName.toLowerCase().includes(namespaceLower));\n }\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexPattern = `^${escaped.replace(/\\*/g, '.*')}$`;\n return new RegExp(regexPattern);\n}\n","/**\n * ToolIndex — Lightweight in-memory search index for MCP tool discovery.\n *\n * Supports two search methods:\n * • BM25 – Okapi BM25 ranking over tokenized tool metadata (zero external deps)\n * • regex – Pattern matching against tool names, descriptions, and parameters\n * • embedding – (optional) cosine-similarity over caller-supplied vectors,\n * blended with BM25 scores\n *\n * @packageDocumentation\n */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ---------------------------------------------------------------------------\n// Public Types\n// ---------------------------------------------------------------------------\n\n/** Compact summary returned by search — intentionally lightweight. */\nexport interface ToolSummary {\n /** Fully qualified tool name (e.g. \"tool_github_create_pr\") */\n name: string;\n /** Human-readable description */\n description: string;\n /** Server that owns this tool */\n serverName: string;\n /** Unique ID of the server */\n serverId: string;\n /** Session the tool belongs to */\n sessionId: string;\n}\n\n/** Server-level summary derived from indexed tools. */\nexport interface ToolServerSummary {\n /** Human-readable server name */\n serverName: string;\n /** Stable server identifier */\n serverId: string;\n /** Session the server belongs to */\n sessionId: string;\n /** Number of indexed tools for this server */\n toolCount: number;\n}\n\n/** Optional filters for search and listing. */\nexport interface ToolSearchOptions {\n /** Restrict results to this server ID. */\n serverId?: string;\n /** Restrict results to servers whose name or ID matches this value. */\n serverName?: string;\n}\n\n/** Paginated tool listing result. */\nexport interface ToolListResult {\n tools: ToolSummary[];\n totalCount: number;\n returnedCount: number;\n nextCursor?: string;\n servers: ToolServerSummary[];\n}\n\nexport interface ToolLookupOptions {\n /**\n * Allow namespace to match a fragment of serverName after exact\n * sessionId/serverId matching fails.\n */\n allowServerNameFragment?: boolean;\n}\n\n/** A tool with routing metadata attached during indexing. */\nexport interface IndexedTool extends Tool {\n sessionId: string;\n serverId: string;\n serverName: string;\n outputSchema?: Tool['outputSchema'];\n}\n\n/**\n * An optional embedding function supplied by the consumer.\n * Should accept an array of strings and return a matching array of\n * float-number arrays (one embedding vector per input string).\n */\nexport type EmbedFn = (texts: string[]) => Promise<number[][]>;\n\nexport interface ToolIndexOptions {\n /**\n * Custom embedding function for semantic search.\n * When provided, `search()` uses cosine-similarity in addition to keywords.\n * @example\n * ```ts\n * import { embed } from 'ai';\n * const embedFn: EmbedFn = async (texts) => {\n * const { embeddings } = await embed({ model: openai('text-embedding-3-small'), values: texts });\n * return embeddings;\n * };\n * ```\n */\n embedFn?: EmbedFn;\n\n /**\n * Relative weight of keyword score vs embedding score when both are active.\n * 0 = embedding only · 1 = keyword only · 0.4 (default) blends both.\n * @default 0.4\n */\n keywordWeight?: number;\n}\n\n// ---------------------------------------------------------------------------\n// ToolIndex\n// ---------------------------------------------------------------------------\n\nexport class ToolIndex {\n /** All indexed tools keyed by name (supports duplicates). */\n private tools = new Map<string, IndexedTool[]>();\n\n /** Precomputed lightweight summaries keyed by document. */\n private toolSummaries = new Map<string, ToolSummary>();\n\n /** Pre-computed search text for keyword matching (lowercase), keyed by document. */\n private searchTexts = new Map<string, string>();\n\n /** Pre-computed IDF values per token (computed once on build). */\n private idf = new Map<string, number>();\n\n /** Per-tool TF vectors (Map<token, tf>). */\n private tfVectors = new Map<string, Map<string, number>>();\n\n /** Optional: pre-computed embedding vectors per tool. */\n private embeddings = new Map<string, number[]>();\n\n /** BM25: document lengths in tokens for each tool. */\n private docLengths = new Map<string, number>();\n\n /** BM25: average document length across the entire index. */\n private avgDocLength = 0;\n\n private options: Required<ToolIndexOptions>;\n\n constructor(options: ToolIndexOptions = {}) {\n this.options = {\n embedFn: options.embedFn ?? (undefined as unknown as EmbedFn),\n keywordWeight: options.keywordWeight ?? 0.4,\n };\n }\n\n // -----------------------------------------------------------------------\n // Indexing\n // -----------------------------------------------------------------------\n\n /**\n * Build (or rebuild) the index from the given tool set.\n * Call this after connecting / reconnecting to MCP servers.\n */\n async buildIndex(tools: IndexedTool[]): Promise<void> {\n this.tools.clear();\n this.toolSummaries.clear();\n this.searchTexts.clear();\n this.idf.clear();\n this.tfVectors.clear();\n this.embeddings.clear();\n this.docLengths.clear();\n this.avgDocLength = 0;\n\n // 1. Populate tool map + search text\n const allTokenSets: Map<string, Set<string>> = new Map();\n let totalLength = 0;\n\n for (const tool of tools) {\n const docKey = this.getDocumentKey(tool);\n\n if (!this.tools.has(tool.name)) {\n this.tools.set(tool.name, []);\n }\n this.tools.get(tool.name)!.push(tool);\n this.toolSummaries.set(docKey, {\n name: tool.name,\n description: tool.description ?? '',\n serverName: tool.serverName,\n serverId: tool.serverId,\n sessionId: tool.sessionId,\n });\n\n const rawText = this.buildSearchableText(tool);\n const text = rawText.toLowerCase();\n this.searchTexts.set(docKey, text);\n\n const tokens = this.tokenize(rawText);\n const tf = new Map<string, number>();\n const uniqueTokens = new Set<string>();\n\n for (const tok of tokens) {\n tf.set(tok, (tf.get(tok) ?? 0) + 1);\n uniqueTokens.add(tok);\n }\n\n // Normalize TF\n const maxTf = Math.max(...tf.values(), 1);\n for (const [k, v] of tf) {\n tf.set(k, v / maxTf);\n }\n\n this.tfVectors.set(docKey, tf);\n allTokenSets.set(docKey, uniqueTokens);\n\n const length = tokens.length;\n this.docLengths.set(docKey, length);\n totalLength += length;\n }\n\n // Compute average document length\n this.avgDocLength = totalLength / (tools.length || 1);\n\n // 2. Compute IDF\n const totalDocs = tools.length || 1;\n const dfCounts = new Map<string, number>();\n\n for (const tokenSet of allTokenSets.values()) {\n for (const tok of tokenSet) {\n dfCounts.set(tok, (dfCounts.get(tok) ?? 0) + 1);\n }\n }\n\n for (const [tok, df] of dfCounts) {\n this.idf.set(tok, Math.log(totalDocs / df) + 1);\n }\n\n // 3. Build embeddings if an embedFn was provided\n if (this.options.embedFn) {\n const names = [...this.searchTexts.keys()];\n const texts = names.map((n) => this.searchTexts.get(n)!);\n\n try {\n const vectors = await this.options.embedFn(texts);\n for (let i = 0; i < names.length; i++) {\n if (vectors[i]) {\n this.embeddings.set(names[i], vectors[i]);\n }\n }\n } catch (err) {\n console.warn('[ToolIndex] Embedding generation failed, falling back to keyword-only search:', err);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Search\n // -----------------------------------------------------------------------\n\n /**\n * Search the index and return the top-K most relevant tools.\n *\n * When an `embedFn` is configured the final score is a weighted blend of\n * keyword TF-IDF similarity and embedding cosine-similarity:\n *\n * `score = keywordWeight × keyword_score + (1 - keywordWeight) × cosine_score`\n */\n async search(query: string, topK = 5, options: ToolSearchOptions = {}): Promise<ToolSummary[]> {\n if (this.tools.size === 0) return [];\n\n const queryLower = query.toLowerCase().trim();\n\n // Fast path: Exact tool name match (supports duplicate names across servers)\n const exactMatches = [...this.toolSummaries.values()].filter(\n (summary) => summary.name.toLowerCase() === queryLower && this.matchesServer(summary, options)\n );\n if (exactMatches.length > 0) {\n return exactMatches.slice(0, topK);\n }\n\n // Fast path: MCP prefix match (e.g. \"mcp__github\")\n if (queryLower.startsWith('mcp__') && queryLower.length > 5) {\n const prefixMatches = [...this.toolSummaries.values()]\n .filter((t) => t.name.toLowerCase().startsWith(queryLower) && this.matchesServer(t, options))\n .slice(0, topK);\n if (prefixMatches.length > 0) return prefixMatches;\n }\n\n const queryTermsRaw = queryLower.split(/\\s+/).filter((t) => t.length > 0);\n const requiredTerms: string[] = [];\n const optionalTerms: string[] = [];\n\n for (const term of queryTermsRaw) {\n if (term.startsWith('+') && term.length > 1) {\n requiredTerms.push(term.slice(1));\n } else {\n optionalTerms.push(term);\n }\n }\n\n const allScoringTerms =\n requiredTerms.length > 0 ? [...requiredTerms, ...optionalTerms] : queryTermsRaw;\n const normalizedQueryText = allScoringTerms.join(' ').trim();\n const queryTokens = this.tokenize(allScoringTerms.join(' '));\n\n // Pre-filter: only keep documents that contain ALL required terms\n const candidateKeys = new Set<string>();\n for (const docKey of this.toolSummaries.keys()) {\n const summary = this.toolSummaries.get(docKey)!;\n if (!this.matchesServer(summary, options)) continue;\n\n if (requiredTerms.length > 0) {\n const text = this.searchTexts.get(docKey) || '';\n const nameLower = summary.name.toLowerCase();\n const matchesAll = requiredTerms.every(\n (term) => text.includes(term) || nameLower.includes(term)\n );\n if (!matchesAll) continue;\n }\n candidateKeys.add(docKey);\n }\n\n // 1. Keyword scores (BM25)\n const keywordScores = new Map<string, number>();\n\n const k1 = 1.2;\n const b = 0.75;\n\n for (const docKey of candidateKeys) {\n const docTf = this.tfVectors.get(docKey);\n if (!docTf) continue;\n \n const summary = this.toolSummaries.get(docKey)!;\n\n let score = 0;\n const docLen = this.docLengths.get(docKey) ?? 0;\n\n for (const tok of queryTokens) {\n const tfVal = docTf.get(tok) ?? 0;\n if (tfVal === 0) continue;\n\n const idf = this.idf.get(tok) ?? 0;\n // BM25 formula:\n // score = idf * (tf * (k1 + 1)) / (tf + k1 * (1 - b + b * (docLen / avgDocLength)))\n const numerator = tfVal * (k1 + 1);\n const denominator = tfVal + k1 * (1 - b + b * (docLen / this.avgDocLength));\n\n score += idf * (numerator / denominator);\n }\n\n // Name heuristics: give massive boosts for exact server/tool name matches\n const serverLower = (summary.serverName || summary.serverId || '').toLowerCase();\n const toolLower = summary.name.toLowerCase();\n\n for (const term of allScoringTerms) {\n if (serverLower.includes(term)) {\n score += 10;\n }\n if (toolLower.includes(term)) {\n score += 5;\n }\n }\n\n if (score > 0) {\n keywordScores.set(docKey, score);\n }\n }\n\n // 2. Embedding scores (optional)\n let embeddingScores: Map<string, number> | null = null;\n\n if (this.options.embedFn && this.embeddings.size > 0) {\n try {\n const [queryEmbedding] = await this.options.embedFn([normalizedQueryText]);\n if (queryEmbedding) {\n embeddingScores = new Map();\n for (const docKey of candidateKeys) {\n const vec = this.embeddings.get(docKey);\n if (vec) {\n embeddingScores.set(docKey, this.cosineSimilarity(queryEmbedding, vec));\n }\n }\n }\n } catch {\n // Silently fall back to keyword only for this query\n }\n }\n\n // 3. Blend scores\n const kw = this.options.keywordWeight;\n const finalScores: Array<{ docKey: string; score: number }> = [];\n\n for (const docKey of candidateKeys) {\n const kwScore = keywordScores.get(docKey) ?? 0;\n const embScore = embeddingScores?.get(docKey) ?? 0;\n\n const score = embeddingScores ? kw * kwScore + (1 - kw) * embScore : kwScore;\n\n if (score > 0) {\n finalScores.push({ docKey, score });\n }\n }\n\n // 4. Sort and return top-K\n finalScores.sort((a, b) => b.score - a.score);\n\n return finalScores.slice(0, topK).map(({ docKey }) => {\n return this.toolSummaries.get(docKey)!;\n });\n }\n\n /**\n * Search tools using a regex pattern.\n * Matches against name, description, and parameter metadata.\n */\n searchRegex(pattern: string, topK = 5): ToolSummary[] {\n if (this.tools.size === 0) return [];\n\n try {\n // Handle Anthropic-style (?i) case-insensitive flag which JS doesn't support natively in string\n let flags = '';\n let cleanPattern = pattern;\n if (pattern.includes('(?i)')) {\n flags = 'i';\n cleanPattern = pattern.replace(/\\(\\?i\\)/g, '');\n }\n\n const regex = new RegExp(cleanPattern, flags || undefined);\n const matches: Array<{ docKey: string; score: number }> = [];\n\n for (const [docKey, text] of this.searchTexts) {\n const tool = this.toolSummaries.get(docKey);\n if (!tool) continue;\n\n if (regex.test(text) || regex.test(tool.name)) {\n // Use a simple heuristic for ranking regex matches: \n // 1. Exact name match (highest)\n // 2. Name starts with pattern\n // 3. Name contains pattern\n // 4. Description contains pattern (lowest)\n let score = 1;\n if (tool.name === cleanPattern) score = 10;\n else if (tool.name.startsWith(cleanPattern)) score = 5;\n else if (tool.name.toLowerCase().includes(cleanPattern.toLowerCase())) score = 2;\n\n matches.push({ docKey, score });\n }\n }\n\n matches.sort((a, b) => b.score - a.score);\n\n return matches.slice(0, topK).map(({ docKey }) => {\n return this.toolSummaries.get(docKey)!;\n });\n } catch (err) {\n console.warn('[ToolIndex] Regex search failed:', err);\n return [];\n }\n }\n\n // -----------------------------------------------------------------------\n // Accessors\n // -----------------------------------------------------------------------\n\n /**\n * Get tool definition(s) by name.\n * If namespace is provided, exact sessionId/serverId matches take precedence.\n * Falls back to serverName fragment matching only when explicitly allowed.\n */\n getTool(name: string, namespace?: string, options: ToolLookupOptions = {}): IndexedTool[] {\n const list = this.tools.get(name) ?? [];\n if (!namespace) return list;\n\n const exactMatches = list.filter(\n (t) => t.sessionId === namespace || t.serverId === namespace\n );\n if (exactMatches.length > 0) return exactMatches;\n\n if (!options.allowServerNameFragment) return [];\n\n const namespaceLower = namespace.toLowerCase();\n return list.filter((t) => t.serverName.toLowerCase().includes(namespaceLower));\n }\n\n /** All indexed tool names. */\n getToolNames(): string[] {\n return [...this.tools.keys()];\n }\n\n /** List indexed servers with tool counts. */\n listServers(options: ToolSearchOptions = {}): ToolServerSummary[] {\n const servers = new Map<string, ToolServerSummary>();\n\n for (const summary of this.toolSummaries.values()) {\n if (!this.matchesServer(summary, options)) continue;\n\n const key = `${summary.sessionId}::${summary.serverId}`;\n const existing = servers.get(key);\n if (existing) {\n existing.toolCount += 1;\n } else {\n servers.set(key, {\n serverName: summary.serverName,\n serverId: summary.serverId,\n sessionId: summary.sessionId,\n toolCount: 1,\n });\n }\n }\n\n return [...servers.values()].sort((a, b) => {\n const byName = a.serverName.localeCompare(b.serverName);\n return byName !== 0 ? byName : a.serverId.localeCompare(b.serverId);\n });\n }\n\n /** List tools deterministically, optionally scoped to a server. */\n listTools(options: ToolSearchOptions & { limit?: number; cursor?: string } = {}): ToolListResult {\n const offset = Math.max(Number(options.cursor) || 0, 0);\n const limit = Math.max(Number(options.limit) || 20, 1);\n const tools = [...this.toolSummaries.values()]\n .filter((summary) => this.matchesServer(summary, options))\n .sort((a, b) => {\n const byServer = a.serverName.localeCompare(b.serverName);\n if (byServer !== 0) return byServer;\n return a.name.localeCompare(b.name);\n });\n\n const page = tools.slice(offset, offset + limit);\n const nextOffset = offset + page.length;\n\n return {\n tools: page,\n totalCount: tools.length,\n returnedCount: page.length,\n nextCursor: nextOffset < tools.length ? String(nextOffset) : undefined,\n servers: this.listServers(options),\n };\n }\n\n /** Number of indexed tools (including duplicates). */\n get size(): number {\n let count = 0;\n for (const list of this.tools.values()) {\n count += list.length;\n }\n return count;\n }\n\n // -----------------------------------------------------------------------\n // Internals\n // -----------------------------------------------------------------------\n\n /** Build a single searchable string from tool metadata. */\n private buildSearchableText(tool: Tool): string {\n const parts: string[] = [tool.name];\n if (tool.description) parts.push(tool.description);\n\n if (tool.inputSchema && typeof tool.inputSchema === 'object') {\n this.collectSchemaSearchText(tool.inputSchema, parts);\n }\n\n return parts.join(' ');\n }\n\n /** Recursively collect JSON Schema argument names and descriptions. */\n private collectSchemaSearchText(\n schema: unknown,\n parts: string[],\n seen = new WeakSet<object>()\n ): void {\n if (!schema || typeof schema !== 'object') return;\n if (seen.has(schema)) return;\n seen.add(schema);\n\n if (Array.isArray(schema)) {\n for (const item of schema) {\n this.collectSchemaSearchText(item, parts, seen);\n }\n return;\n }\n\n const schemaObject = schema as Record<string, unknown>;\n this.pushStringValue(schemaObject.description, parts);\n this.pushStringValue(schemaObject.title, parts);\n\n const properties = schemaObject.properties;\n if (properties && typeof properties === 'object' && !Array.isArray(properties)) {\n for (const [propertyName, propertySchema] of Object.entries(properties)) {\n parts.push(propertyName);\n this.collectSchemaSearchText(propertySchema, parts, seen);\n }\n }\n\n const patternProperties = schemaObject.patternProperties;\n if (\n patternProperties &&\n typeof patternProperties === 'object' &&\n !Array.isArray(patternProperties)\n ) {\n for (const [propertyPattern, propertySchema] of Object.entries(patternProperties)) {\n parts.push(propertyPattern);\n this.collectSchemaSearchText(propertySchema, parts, seen);\n }\n }\n\n const dependentSchemas = schemaObject.dependentSchemas;\n if (\n dependentSchemas &&\n typeof dependentSchemas === 'object' &&\n !Array.isArray(dependentSchemas)\n ) {\n for (const [propertyName, dependentSchema] of Object.entries(dependentSchemas)) {\n parts.push(propertyName);\n this.collectSchemaSearchText(dependentSchema, parts, seen);\n }\n }\n\n for (const key of [\n 'items',\n 'additionalProperties',\n 'contains',\n 'propertyNames',\n 'if',\n 'then',\n 'else',\n 'not',\n ]) {\n this.collectSchemaSearchText(schemaObject[key], parts, seen);\n }\n\n for (const key of ['allOf', 'anyOf', 'oneOf', 'prefixItems']) {\n this.collectSchemaSearchText(schemaObject[key], parts, seen);\n }\n\n for (const key of ['$defs', 'definitions']) {\n const definitions = schemaObject[key];\n if (definitions && typeof definitions === 'object' && !Array.isArray(definitions)) {\n for (const [definitionName, definitionSchema] of Object.entries(definitions)) {\n parts.push(definitionName);\n this.collectSchemaSearchText(definitionSchema, parts, seen);\n }\n }\n }\n }\n\n private pushStringValue(value: unknown, parts: string[]): void {\n if (typeof value === 'string' && value.trim()) {\n parts.push(value);\n }\n }\n\n private getDocumentKey(tool: IndexedTool): string {\n return `${tool.sessionId}::${tool.serverId}::${tool.name}`;\n }\n\n private matchesServer(summary: ToolSummary, options: ToolSearchOptions): boolean {\n if (options.serverId && summary.serverId !== options.serverId) {\n return false;\n }\n\n if (options.serverName) {\n const serverNameQuery = options.serverName.toLowerCase();\n const serverName = summary.serverName.toLowerCase();\n const serverId = summary.serverId.toLowerCase();\n if (!serverName.includes(serverNameQuery) && !serverId.includes(serverNameQuery)) {\n return false;\n }\n }\n\n return true;\n }\n\n /** Simple whitespace + camelCase + snake_case tokenizer. */\n private tokenize(text: string): string[] {\n return text\n // Split camelCase: \"getWeather\" → \"get Weather\"\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Split snake_case / kebab-case\n .replace(/[_-]/g, ' ')\n .toLowerCase()\n // Remove non-alphanumeric (except spaces)\n .replace(/[^a-z0-9\\s]/g, '')\n // Split on whitespace\n .split(/\\s+/)\n .filter((t) => t.length > 1); // drop single-char noise\n }\n\n /** Cosine similarity between two vectors. */\n private cosineSimilarity(a: number[], b: number[]): number {\n const len = Math.min(a.length, b.length);\n let dot = 0;\n let magA = 0;\n let magB = 0;\n\n for (let i = 0; i < len; i++) {\n dot += a[i] * b[i];\n magA += a[i] * a[i];\n magB += b[i] * b[i];\n }\n\n const denom = Math.sqrt(magA) * Math.sqrt(magB);\n return denom > 0 ? dot / denom : 0;\n }\n}\n","/**\n * SchemaCompressor — Utilities for compact tool representations.\n *\n * Provides compact representations of tools (name + description only,\n * no inputSchema).\n *\n * @packageDocumentation\n */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * A minimal tool representation containing only what an LLM needs to\n * *decide whether* to use a tool. The full `inputSchema` is deferred.\n */\nexport interface CompactTool {\n name: string;\n description?: string;\n /**\n * Human-readable hint about the expected parameters.\n * e.g. \"(location: string, unit?: 'celsius' | 'fahrenheit')\"\n */\n parameterHint?: string;\n}\n\n// ---------------------------------------------------------------------------\n// SchemaCompressor\n// ---------------------------------------------------------------------------\n\nexport class SchemaCompressor {\n /**\n * Convert a full MCP Tool definition to a compact summary.\n *\n * The compact form omits `inputSchema` entirely and optionally generates\n * a short `parameterHint` from the schema's top-level properties.\n */\n static toCompact(tool: Tool): CompactTool {\n const compact: CompactTool = {\n name: tool.name,\n description: tool.description,\n };\n\n // Build parameter hint from schema\n if (tool.inputSchema && typeof tool.inputSchema === 'object') {\n const schema = tool.inputSchema as {\n properties?: Record<string, { type?: string; enum?: unknown[] }>;\n required?: string[];\n };\n\n if (schema.properties) {\n const required = new Set(schema.required ?? []);\n const parts: string[] = [];\n\n for (const [key, val] of Object.entries(schema.properties)) {\n const type = val?.type ?? 'any';\n const enumSuffix =\n val?.enum && Array.isArray(val.enum)\n ? `: ${val.enum.map((e) => `'${e}'`).join(' | ')}`\n : `: ${type}`;\n\n parts.push(required.has(key) ? `${key}${enumSuffix}` : `${key}?${enumSuffix}`);\n }\n\n if (parts.length > 0) {\n compact.parameterHint = `(${parts.join(', ')})`;\n }\n }\n }\n\n return compact;\n }\n\n /**\n * Convert an array of tools to compact form, optionally limiting the count.\n */\n static compactAll(tools: Tool[], options?: { maxTools?: number }): CompactTool[] {\n const limited = options?.maxTools ? tools.slice(0, options.maxTools) : tools;\n return limited.map((t) => SchemaCompressor.toCompact(t));\n }\n}\n","/**\n * Meta-tools — Injectable tool definitions that let the LLM discover and\n * load MCP tools on-demand, following Anthropic's Tool Search pattern.\n *\n * Instead of injecting 50+ full tool schemas into the context window, you\n * inject just these 4 meta-tools. The LLM calls them to find and load\n * only the tools it actually needs.\n *\n * Meta-tools:\n * • `mcp_search_tools` — Search/list available tools\n * • `mcp_search_tool_regex` — Regex pattern search\n * • `mcp_get_tool_schema` — Get full inputSchema for a discovered tool\n * • `mcp_execute_tool` — Execute a discovered tool\n *\n * @packageDocumentation\n */\n\nimport type { Tool, CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport type { ToolRouter } from './tool-router.js';\nimport type { IndexedTool, ToolLookupOptions } from './tool-index.js';\n\n// ---------------------------------------------------------------------------\n// Tool Definitions\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the `mcp_search_tools` tool definition.\n *\n * This tool lets the LLM search the full catalog of available MCP tools\n * using a BM25 natural-language query. Returns tool names and descriptions\n * without the full inputSchema to save context space.\n */\nexport function createSearchToolDefinition(): Tool {\n return {\n name: 'mcp_search_tools',\n description:\n 'Search the catalog of available tools. Returns tool names, descriptions, and server info. ' +\n 'Use this FIRST to find relevant tools before calling them.\\n\\n' +\n 'Query forms:\\n' +\n '- \"select:Read,Edit,Grep\" — fetch these exact tools by name\\n' +\n '- \"notebook jupyter\" — keyword search, up to limit best matches\\n' +\n '- \"+slack send\" — require \"slack\" in the name, rank by remaining terms',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Query to find tools. Use \"select:<tool_name>\" for direct selection, or keywords to search. Prefix keywords with + to require them.',\n },\n operation: {\n type: 'string',\n enum: ['search', 'list'],\n description:\n 'Operation to perform. Use \"search\" to find relevant tools by capability. Use \"list\" with serverId or serverName when the user asks for every tool from a connected MCP server.',\n },\n serverId: {\n type: 'string',\n description: 'Optional server ID to restrict search/list results to one MCP server.',\n },\n serverName: {\n type: 'string',\n description:\n 'Optional server name fragment to restrict search/list results to matching MCP servers, e.g. \"supabase\".',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 5 for search, 20 for list; max: 20 for search, 100 for list).',\n },\n cursor: {\n type: 'string',\n description: 'Optional pagination cursor returned by operation \"list\".',\n },\n },\n required: ['query'],\n },\n };\n}\n\n/**\n * Creates the `mcp_list_servers` tool definition.\n *\n * This tool lets the LLM inspect connected MCP servers before doing\n * server-scoped tool discovery.\n */\nexport function createListServersToolDefinition(): Tool {\n return {\n name: 'mcp_list_servers',\n description:\n 'List connected MCP servers and their tool counts. ' +\n 'Use this when mcp_search_tools returns no matches, then retry mcp_search_tools with serverId or serverName.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description:\n 'Optional server filter text. Matches server name or serverId, e.g. \"web\" or \"supabase\".',\n },\n },\n },\n };\n}\n\n/**\n * Creates the `mcp_search_tool_regex` tool definition.\n * \n * Matches Anthropic's tool_search_tool_regex exactly (takes a 'query' regex pattern).\n */\nexport function createRegexSearchToolDefinition(): Tool {\n return {\n name: 'mcp_search_tool_regex',\n description:\n 'Search the catalog of available tools using a Python-style regex pattern. ' +\n 'Matches against tool names, descriptions, and parameter descriptions. ' +\n 'Example patterns: \"^github_\", \"weather\", \"(?i)slack\".',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Regex pattern to search for (e.g., \"^get_.*_data\", \"database\").',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 5, max: 20).',\n },\n },\n required: ['query'],\n },\n };\n}\n\n/**\n * Creates the `mcp_get_tool_schema` tool definition.\n *\n * After discovering tools via `mcp_search_tools` or\n * `mcp_search_tool_regex`, the LLM calls this to load the full\n * input and output schemas for a specific tool so it can construct the\n * correct arguments and plan around the result shape.\n */\nexport function createGetSchemaToolDefinition(): Tool {\n return {\n name: 'mcp_get_tool_schema',\n description:\n 'Get the full input schema (parameters) and output schema (result shape) for a specific tool. ' +\n 'Call this after mcp_search_tools to get the parameter details ' +\n 'needed to call a tool correctly and understand what it returns. ' +\n 'Do NOT call the discovered tool directly; after reading the schema, call mcp_execute_tool.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n toolName: {\n type: 'string',\n description: 'The exact tool name returned by mcp_search_tools.',\n },\n serverId: {\n type: 'string',\n description:\n 'Optional: The server ID provided in mcp_search_tools. Required if multiple tools have the same name.',\n },\n },\n required: ['toolName'],\n },\n };\n}\n\n/**\n * Creates the `mcp_execute_tool` tool definition.\n *\n * This is the execution meta-tool — the LLM calls this to execute any\n * tool discovered via `mcp_search_tools` or `mcp_search_tool_regex`.\n * The LLM should first call `mcp_get_tool_schema` to know the correct\n * arguments.\n *\n * Instead of registering every real tool with the framework, we proxy\n * all execution through a single meta-tool.\n */\nexport function createExecuteToolDefinition(): Tool {\n return {\n name: 'mcp_execute_tool',\n description:\n 'Execute a tool that was discovered via mcp_search_tools. ' +\n 'You MUST call mcp_get_tool_schema first to know the correct parameters. ' +\n 'Pass the exact tool name and its arguments.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n toolName: {\n type: 'string',\n description: 'The exact tool name from mcp_search_tools results.',\n },\n serverId: {\n type: 'string',\n description:\n 'Optional: The server ID provided in mcp_search_tools. Required if multiple tools have the same name.',\n },\n args: {\n type: 'object',\n description:\n \"Arguments matching the tool's inputSchema. Omit or pass {} if the tool takes no parameters.\",\n additionalProperties: true,\n },\n },\n required: ['toolName'],\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Meta-tool Executors\n// ---------------------------------------------------------------------------\n\n/**\n * Callback for executing a real MCP tool via the correct client.\n * Provided by adapters that wire up client routing.\n */\nexport type CallToolFn = (\n toolName: string,\n args: Record<string, unknown>,\n namespace?: string\n) => Promise<any>;\n\n/**\n * Execute a meta-tool call and return the result in MCP CallToolResult format.\n *\n * @param toolName - One of the meta-tool names (mcp_search_tools, mcp_list_servers, mcp_search_tool_regex, etc.)\n * @param args - The arguments from the LLM's tool call\n * @param router - The ToolRouter to query\n * @param callToolFn - Optional callback for executing real tools (required for mcp_execute_tool)\n * @returns MCP-compatible CallToolResult, or null if this isn't a meta-tool\n */\nexport async function executeMetaTool(\n toolName: string,\n args: Record<string, unknown>,\n router: ToolRouter,\n callToolFn?: CallToolFn\n): Promise<CallToolResult | null> {\n const resolveToolSchema = async (\n name: string,\n namespace?: string,\n options?: ToolLookupOptions\n ): Promise<{ tool?: IndexedTool; error?: CallToolResult }> => {\n try {\n if (typeof (router as ToolRouter & { resolveToolSchema?: unknown }).resolveToolSchema === 'function') {\n return {\n tool: await (router as ToolRouter & {\n resolveToolSchema: (\n toolName: string,\n namespace?: string,\n options?: ToolLookupOptions\n ) => Promise<IndexedTool | undefined>;\n }).resolveToolSchema(name, namespace, options),\n };\n }\n return { tool: router.getToolSchema(name, namespace, options) };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n error: {\n content: [{ type: 'text', text: errorMessage }],\n isError: true,\n },\n };\n }\n };\n\n switch (toolName) {\n case 'mcp_search_tools': {\n const query = String(args.query ?? '');\n const operation = String(args.operation ?? 'search');\n const serverId = String(args.serverId ?? '') || undefined;\n const serverName = String(args.serverName ?? '') || undefined;\n\n if (operation === 'list') {\n const limit = Math.min(Number(args.limit) || 20, 100);\n const cursor = String(args.cursor ?? '') || undefined;\n const result = await router.listTools({\n serverId,\n serverName: serverName ?? (!serverId && query ? query : undefined),\n limit,\n cursor,\n });\n\n const serverText = result.servers.length > 0\n ? result.servers\n .map((server) => `${server.serverName} (serverId: ${server.serverId}, tools: ${server.toolCount})`)\n .join(', ')\n : 'none';\n\n const lines: string[] = [\n 'operation: list',\n `servers: ${serverText}`,\n `totalCount: ${result.totalCount}`,\n `returnedCount: ${result.returnedCount}`,\n `nextCursor: ${result.nextCursor ?? 'null'}`,\n '',\n ];\n\n if (result.tools.length > 0) {\n lines.push(...formatToolSummaries(result.tools));\n } else {\n lines.push(\n serverId || serverName\n ? 'No tools found for the requested server scope.'\n : 'No tools found. Try operation \"search\" or provide serverId/serverName.'\n );\n }\n\n return {\n content: [{ type: 'text', text: lines.join('\\n') }],\n isError: false,\n };\n }\n\n const limit = Math.min(Number(args.limit) || 5, 20);\n const searchOptions = { serverId, serverName };\n\n // Fast path: Check for select: prefix\n const selectMatch = query.match(/^select:(.+)$/i);\n if (selectMatch) {\n const requested = selectMatch[1]!\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n\n const found: any[] = [];\n const errors: string[] = [];\n \n const namespace = serverId ?? serverName;\n\n for (const requestedToolName of requested) {\n const { tool, error } = await resolveToolSchema(requestedToolName, namespace, {\n allowServerNameFragment: Boolean(serverName && !serverId),\n });\n if (error) {\n const errorMsg = error.content[0]?.type === 'text' ? error.content[0].text : 'Unknown error';\n errors.push(`- **${requestedToolName}**: ${errorMsg}`);\n } else if (tool) {\n found.push(tool);\n } else {\n errors.push(`- **${requestedToolName}**: Tool not found. Try searching with mcp_search_tools.`);\n }\n }\n\n const lines: string[] = [];\n\n if (found.length > 0) {\n lines.push(...found.map((t, i) =>\n `${i + 1}. **${t.name}** (serverName: ${t.serverName}, serverId: ${t.serverId})\\n ${t.description}`\n ));\n }\n \n if (errors.length > 0) {\n if (lines.length > 0) lines.push(\"\"); // Add empty line spacing\n lines.push(\"Errors resolving some tools:\");\n lines.push(...errors);\n }\n\n const text = lines.length > 0 \n ? lines.join('\\n') \n : `No tools found matching select query: ${requested.join(', ')}`;\n\n return {\n content: [{ type: 'text', text }],\n isError: found.length === 0,\n };\n }\n\n const results = await router.searchTools(query, limit, searchOptions);\n\n const text = results.length === 0\n ? 'No tools found matching your query. Call mcp_list_servers to inspect connected servers, then retry mcp_search_tools with serverId or serverName.'\n : formatToolSummaries(results).join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_list_servers': {\n const query = String(args.query ?? '').trim();\n const servers = await router.listServers({\n serverName: query || undefined,\n });\n\n const text = servers.length === 0\n ? 'No connected servers found.'\n : servers\n .map(\n (server, i) =>\n `${i + 1}. **${server.serverName}** (serverId: ${server.serverId})\\n` +\n ` Tool count: ${server.toolCount}`\n )\n .join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_search_tool_regex': {\n const pattern = String(args.query ?? '');\n const limit = Math.min(Number(args.limit) || 5, 20);\n\n const results = await router.searchToolsRegex(pattern, limit);\n\n const text = results.length === 0\n ? 'No tools matched your regex pattern. Try a broader pattern.'\n : formatToolSummaries(results).join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_get_tool_schema': {\n const name = String(args.toolName ?? '');\n const namespace = String(args.serverId ?? '') || undefined;\n const { tool, error } = await resolveToolSchema(name, namespace);\n\n if (error) {\n return error;\n }\n\n if (!tool) {\n return {\n content: [\n {\n type: 'text',\n text: `Tool \"${name}\" not found. Use mcp_search_tools to find available tools first.`,\n },\n ],\n isError: true,\n };\n }\n\n const schema = {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n executionInstructions: {\n nextTool: 'mcp_execute_tool',\n toolName: tool.name,\n serverId: tool.serverId,\n note:\n 'Do not call this discovered tool directly unless it was explicitly registered as a runtime tool. Execute it via mcp_execute_tool and pass these parameters inside args.',\n },\n };\n\n return {\n content: [{ type: 'text', text: JSON.stringify(schema, null, 2) }],\n isError: false,\n };\n }\n\n case 'mcp_execute_tool': {\n const targetToolName = String(args.toolName ?? '');\n const namespace = String(args.serverId ?? '') || undefined;\n const toolArgs = (args.args as Record<string, unknown>) ?? {};\n\n if (!targetToolName) {\n return {\n content: [{ type: 'text', text: 'Missing required parameter \"toolName\". Specify which tool to execute.' }],\n isError: true,\n };\n }\n\n // Verify the tool exists in our index\n const { tool, error } = await resolveToolSchema(targetToolName, namespace);\n if (error) {\n return error;\n }\n\n if (!tool) {\n return {\n content: [\n {\n type: 'text',\n text: `Tool \"${targetToolName}\" not found. Use mcp_search_tools to discover available tools first.`,\n },\n ],\n isError: true,\n };\n }\n\n if (!callToolFn) {\n return {\n content: [{ type: 'text', text: 'Tool execution is not available. No callToolFn was configured.' }],\n isError: true,\n };\n }\n\n try {\n const result = await callToolFn(targetToolName, toolArgs, namespace);\n\n // Normalize result to text\n if (result && typeof result === 'object' && 'content' in result) {\n // Already MCP CallToolResult format\n return result as CallToolResult;\n }\n\n const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: 'text', text: `Tool execution failed: ${errorMessage}` }],\n isError: true,\n };\n }\n }\n\n default:\n return null;\n }\n}\n\nfunction formatToolSummaries(\n tools: Array<{\n name: string;\n description: string;\n serverName: string;\n serverId: string;\n }>\n): string[] {\n return tools.map(\n (t, i) =>\n `${i + 1}. **${t.name}** (serverName: ${t.serverName}, serverId: ${t.serverId})\\n` +\n ` ${t.description}`\n );\n}\n\n/** Check if a tool name is one of the meta-tools. */\nexport function isMetaTool(toolName: string): boolean {\n return (\n toolName === 'mcp_search_tools' ||\n toolName === 'mcp_list_servers' ||\n toolName === 'mcp_search_tool_regex' ||\n toolName === 'mcp_get_tool_schema' ||\n toolName === 'mcp_execute_tool'\n );\n}\n\n/**\n * Unwraps a meta-tool proxy call (like mcp_execute_tool) to find the real target tool name and arguments.\n * Also automatically strips routing prefixes like tool_{serverId}_.\n * \n * Useful for frontend components that need to determine the actual tool being executed by an AI agent.\n */\nexport function resolveMetaToolProxy(\n toolName: string,\n args: Record<string, unknown> | null | undefined\n): { toolName: string; args: Record<string, unknown> } {\n // Unwrap mcp_execute_tool proxy arguments\n if (toolName === 'mcp_execute_tool') {\n const innerName = args?.toolName;\n const innerArgs = args?.args;\n return {\n toolName: typeof innerName === 'string' && innerName ? innerName : toolName,\n args: innerArgs && typeof innerArgs === 'object' && !Array.isArray(innerArgs)\n ? (innerArgs as Record<string, unknown>)\n : {},\n };\n }\n\n // Strip tool_<serverId>_ prefix used by AIAdapter\n const match = toolName.match(/(?:tool_[^_]+_)?(.+)$/);\n const resolvedName = match?.[1] ?? toolName;\n\n return { toolName: resolvedName, args: args ?? {} };\n}\n\n"]}
|