@prefecthq/fastmcp-ts 0.0.2-alpha.0 → 0.0.2
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/cli/index.cjs +43 -38
- package/dist/cli/index.cjs.map +1 -1
- package/dist/client.d.ts +3 -3
- package/dist/client.js +12 -7
- package/dist/client.js.map +1 -1
- package/dist/server.d.ts +5 -5
- package/dist/server.js +6 -6
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/handlers.ts","../src/client/auth.ts","../src/client/transports.ts","../src/client/client.ts","../src/client/multi-server.ts","../src/client/utils.ts","../src/client/sampling/types.ts","../src/client/sampling/generic.ts","../src/client/sampling/anthropic.ts","../src/client/sampling/openai.ts","../src/client/sampling/google.ts"],"sourcesContent":["import type {\n LoggingLevel,\n CreateMessageRequestParams,\n ElicitRequestParams,\n ElicitResult,\n Tool,\n Resource,\n Prompt,\n} from '@modelcontextprotocol/sdk/types'\nimport type { AnySamplingResult } from './results.js'\n\nexport type LogMessage = {\n level: LoggingLevel\n logger?: string\n data: unknown\n}\n\nexport type LogHandler = (message: LogMessage) => void | Promise<void>\n\nexport type ProgressHandler = (\n progress: number,\n total?: number,\n message?: string,\n) => void | Promise<void>\n\nexport type SamplingHandler = (\n params: CreateMessageRequestParams,\n) => AnySamplingResult | Promise<AnySamplingResult>\n\nexport type ElicitationHandler = (\n params: ElicitRequestParams,\n) => ElicitResult | Promise<ElicitResult>\n\nexport type ResourceUpdateHandler = (uri: string) => void | Promise<void>\n\n/**\n * Config for receiving server-initiated list-change notifications.\n * Set debounceMs: 0 in tests for instant delivery.\n */\nexport type ListChangedHandler<T> = {\n onChanged: (error: Error | null, items: T[] | null) => void | Promise<void>\n /** Whether to auto-fetch the updated list before calling onChanged. Default: true. */\n autoRefresh?: boolean\n /** Debounce window in ms. Default: 300. Set to 0 to disable. */\n debounceMs?: number\n}\n\nexport interface ClientHandlers {\n log?: LogHandler\n progress?: ProgressHandler\n sampling?: SamplingHandler\n elicitation?: ElicitationHandler\n onToolsListChanged?: ListChangedHandler<Tool>\n onResourcesListChanged?: ListChangedHandler<Resource>\n onPromptsListChanged?: ListChangedHandler<Prompt>\n}\n\nexport function defaultLogHandler(message: LogMessage): void {\n const prefix = message.logger ? `[${message.logger}]` : '[server]'\n const data =\n typeof message.data === 'string' ? message.data : JSON.stringify(message.data)\n const text = `${prefix} ${data}`\n const level = message.level\n if (level === 'debug') {\n console.debug(text)\n } else if (level === 'warning') {\n console.warn(text)\n } else if (\n level === 'error' ||\n level === 'critical' ||\n level === 'alert' ||\n level === 'emergency'\n ) {\n console.error(text)\n } else {\n console.info(text)\n }\n}\n\nexport function defaultProgressHandler(\n progress: number,\n total?: number,\n message?: string,\n): void {\n const pct = total != null ? ` (${Math.round((progress / total) * 100)}%)` : ''\n const msg = message ? ` — ${message}` : ''\n console.debug(\n `progress: ${progress}${total != null ? `/${total}` : ''}${pct}${msg}`,\n )\n}\n","import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js'\nimport type { OAuthDiscoveryState } from '@modelcontextprotocol/sdk/client/auth.js'\nimport type {\n OAuthClientInformationMixed,\n OAuthClientMetadata,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js'\nimport { spawn } from 'child_process'\nimport * as fs from 'fs/promises'\nimport * as http from 'http'\nimport { homedir } from 'os'\nimport { dirname, join } from 'path'\n\n// ---------------------------------------------------------------------------\n// OAuthToken — internal type used by ClientCredentials for expiry tracking.\n// Not the SDK's OAuthTokens: we track expires_at in milliseconds.\n// ---------------------------------------------------------------------------\n\nexport type OAuthToken = {\n access_token: string\n token_type?: string\n refresh_token?: string\n /** Unix timestamp in milliseconds (normalized internally). */\n expires_at?: number\n /** Seconds until expiry — used to compute expires_at on receipt. */\n expires_in?: number\n scope?: string\n}\n\n// ---------------------------------------------------------------------------\n// KeyValueStore — single persistence interface for all auth state\n// ---------------------------------------------------------------------------\n\nexport type KeyValueStore = {\n get(key: string): Promise<string | null>\n set(key: string, value: string): Promise<void>\n delete(key: string): Promise<void>\n}\n\n// ---------------------------------------------------------------------------\n// InMemoryStore\n// ---------------------------------------------------------------------------\n\nexport class InMemoryStore implements KeyValueStore {\n private readonly _map = new Map<string, string>()\n\n async get(key: string): Promise<string | null> {\n return this._map.get(key) ?? null\n }\n\n async set(key: string, value: string): Promise<void> {\n this._map.set(key, value)\n }\n\n async delete(key: string): Promise<void> {\n this._map.delete(key)\n }\n}\n\n// ---------------------------------------------------------------------------\n// FileTokenStorage\n// ---------------------------------------------------------------------------\n\nexport class FileTokenStorage implements KeyValueStore {\n private readonly _path: string\n\n constructor(path?: string) {\n this._path = path ?? join(homedir(), '.fastmcp', 'tokens.json')\n }\n\n private async _readAll(): Promise<Record<string, string>> {\n try {\n const raw = await fs.readFile(this._path, 'utf8')\n const parsed: unknown = JSON.parse(raw)\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, string>\n }\n return {}\n } catch {\n return {}\n }\n }\n\n private async _writeAll(data: Record<string, string>): Promise<void> {\n await fs.mkdir(dirname(this._path), { recursive: true })\n const tmp = `${this._path}.tmp`\n await fs.writeFile(tmp, JSON.stringify(data, null, 2), 'utf8')\n await fs.rename(tmp, this._path)\n }\n\n async get(key: string): Promise<string | null> {\n const data = await this._readAll()\n return data[key] ?? null\n }\n\n async set(key: string, value: string): Promise<void> {\n const data = await this._readAll()\n data[key] = value\n await this._writeAll(data)\n }\n\n async delete(key: string): Promise<void> {\n const data = await this._readAll()\n if (!(key in data)) return\n delete data[key]\n await this._writeAll(data)\n }\n}\n\n// ---------------------------------------------------------------------------\n// OAuth — implements OAuthClientProvider (authorization code + PKCE flow)\n// ---------------------------------------------------------------------------\n\nexport interface OAuthOptions {\n /** Pre-registered client ID. When set, Dynamic Client Registration is skipped. */\n clientId?: string\n /** Pre-registered client secret. */\n clientSecret?: string\n /** Requested OAuth scopes (space-separated string or array). */\n scopes?: string | string[]\n /** Client name used in Dynamic Client Registration. Default: \"FastMCP Client\". */\n clientName?: string\n /** Persistent key-value store for tokens, client info, and discovery state. Default: in-memory. */\n store?: KeyValueStore\n /**\n * Port for the local OAuth callback server. Default: 8765.\n * The port must be consistent across calls because it is registered as the\n * redirect_uri during Dynamic Client Registration.\n */\n callbackPort?: number\n /**\n * Override how the authorization URL is opened. When not provided the\n * system browser is launched. Inject a no-op or mock here for testing.\n */\n onRedirect?: (url: URL) => void | Promise<void>\n}\n\nexport class OAuth implements OAuthClientProvider {\n private _serverUrl = ''\n private readonly _clientId?: string\n private readonly _clientSecret?: string\n private readonly _scopes?: string\n private readonly _clientName: string\n private readonly _store: KeyValueStore\n private readonly _callbackPort: number\n private readonly _onRedirect?: (url: URL) => void | Promise<void>\n\n private _codeVerifier: string | undefined\n private _callbackPromise: Promise<string> | null = null\n private _callbackResolve: ((code: string) => void) | null = null\n private _callbackReject: ((err: Error) => void) | null = null\n private _callbackServer: http.Server | null = null\n private _actualCallbackPort: number | null = null\n\n constructor(options: OAuthOptions = {}) {\n this._clientId = options.clientId\n this._clientSecret = options.clientSecret\n this._scopes = Array.isArray(options.scopes)\n ? options.scopes.join(' ')\n : options.scopes\n this._clientName = options.clientName ?? 'FastMCP Client'\n this._store = options.store ?? new InMemoryStore()\n this._callbackPort = options.callbackPort ?? 8765\n this._onRedirect = options.onRedirect\n }\n\n /**\n * Binds the MCP server URL so that all storage keys are namespaced by it.\n * Called by Client before connecting.\n */\n _bind(serverUrl: string): void {\n this._serverUrl = serverUrl\n }\n\n // ---- OAuthClientProvider interface ----\n\n get redirectUrl(): string | URL {\n const port = this._actualCallbackPort ?? this._callbackPort\n return `http://localhost:${port}/callback`\n }\n\n get clientMetadata(): OAuthClientMetadata {\n const port = this._actualCallbackPort ?? this._callbackPort\n return {\n redirect_uris: [`http://localhost:${port}/callback`],\n token_endpoint_auth_method: this._clientSecret ? 'client_secret_post' : 'none',\n grant_types: ['authorization_code'],\n response_types: ['code'],\n client_name: this._clientName,\n ...(this._scopes ? { scope: this._scopes } : {}),\n }\n }\n\n async clientInformation(): Promise<OAuthClientInformationMixed | undefined> {\n if (this._clientId) {\n return {\n client_id: this._clientId,\n ...(this._clientSecret ? { client_secret: this._clientSecret } : {}),\n }\n }\n const raw = await this._store.get(this._key('client_info'))\n if (!raw) return undefined\n return JSON.parse(raw) as OAuthClientInformationMixed\n }\n\n async saveClientInformation(info: OAuthClientInformationMixed): Promise<void> {\n if (this._clientId) return // pre-registered — never overwrite with DCR response\n await this._store.set(this._key('client_info'), JSON.stringify(info))\n }\n\n async tokens(): Promise<OAuthTokens | undefined> {\n const raw = await this._store.get(this._key('tokens'))\n if (!raw) return undefined\n return JSON.parse(raw) as OAuthTokens\n }\n\n async saveTokens(tokens: OAuthTokens): Promise<void> {\n await this._store.set(this._key('tokens'), JSON.stringify(tokens))\n }\n\n async redirectToAuthorization(authorizationUrl: URL): Promise<void> {\n this._callbackPromise = new Promise<string>((resolve, reject) => {\n this._callbackResolve = resolve\n this._callbackReject = reject\n })\n // Suppress unhandled-rejection warnings — waitForCallback observes this via Promise.race\n this._callbackPromise.catch(() => {})\n await this._startCallbackServer()\n if (this._onRedirect) {\n await this._onRedirect(authorizationUrl)\n } else {\n openBrowser(authorizationUrl.toString())\n }\n }\n\n saveCodeVerifier(codeVerifier: string): void {\n this._codeVerifier = codeVerifier\n }\n\n codeVerifier(): string {\n if (this._codeVerifier === undefined) {\n throw new Error('No PKCE code verifier has been saved')\n }\n return this._codeVerifier\n }\n\n async invalidateCredentials(\n scope: 'all' | 'client' | 'tokens' | 'verifier' | 'discovery',\n ): Promise<void> {\n if (scope === 'all' || scope === 'tokens') {\n await this._store.delete(this._key('tokens'))\n }\n if (scope === 'all' || scope === 'client') {\n await this._store.delete(this._key('client_info'))\n }\n if (scope === 'all' || scope === 'verifier') {\n this._codeVerifier = undefined\n }\n if (scope === 'all' || scope === 'discovery') {\n await this._store.delete(this._key('discovery'))\n }\n }\n\n async saveDiscoveryState(state: OAuthDiscoveryState): Promise<void> {\n await this._store.set(this._key('discovery'), JSON.stringify(state))\n }\n\n async discoveryState(): Promise<OAuthDiscoveryState | undefined> {\n const raw = await this._store.get(this._key('discovery'))\n if (!raw) return undefined\n return JSON.parse(raw) as OAuthDiscoveryState\n }\n\n // ---- Internal helpers ----\n\n /**\n * Returns the actual port the callback server bound to.\n * Only populated after redirectToAuthorization() has been called.\n */\n get callbackServerPort(): number | null {\n return this._actualCallbackPort\n }\n\n /**\n * Waits for the OAuth authorization code to arrive via the callback server,\n * then stops the server and resolves with the code.\n *\n * Must be called after the UnauthorizedError thrown by connect() is caught.\n */\n async waitForCallback(timeoutMs = 5 * 60 * 1000): Promise<string> {\n if (!this._callbackPromise) {\n throw new Error('No pending OAuth callback — call redirectToAuthorization() first')\n }\n const timeout = new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error('OAuth callback timed out waiting for authorization')),\n timeoutMs,\n ),\n )\n try {\n return await Promise.race([this._callbackPromise, timeout])\n } finally {\n this._callbackPromise = null\n this._callbackResolve = null\n this._callbackReject = null\n this._stopCallbackServer()\n }\n }\n\n private _key(type: string): string {\n return `${this._serverUrl}/${type}`\n }\n\n private _startCallbackServer(): Promise<void> {\n if (this._callbackServer) return Promise.resolve()\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url ?? '/', `http://localhost`)\n const error = url.searchParams.get('error')\n if (error && this._callbackReject) {\n const description = url.searchParams.get('error_description') ?? error\n this._callbackReject(new Error(`OAuth authorization denied: ${description}`))\n res.writeHead(200, { 'content-type': 'text/html' })\n res.end(\n '<html><body><h1>Authorization denied</h1><p>You may close this tab.</p></body></html>',\n )\n return\n }\n const code = url.searchParams.get('code')\n if (code && this._callbackResolve) {\n this._callbackResolve(code)\n res.writeHead(200, { 'content-type': 'text/html' })\n res.end(\n '<html><body><h1>Authorization complete</h1><p>You may close this tab.</p></body></html>',\n )\n } else {\n res.writeHead(400)\n res.end('Missing code parameter')\n }\n })\n server.on('error', reject)\n server.listen(this._callbackPort, () => {\n const addr = server.address()\n if (addr && typeof addr !== 'string') {\n this._actualCallbackPort = addr.port\n }\n this._callbackServer = server\n resolve()\n })\n })\n }\n\n private _stopCallbackServer(): void {\n this._callbackServer?.close()\n this._callbackServer = null\n this._actualCallbackPort = null\n }\n}\n\n// ---------------------------------------------------------------------------\n// BearerAuth\n// ---------------------------------------------------------------------------\n\nexport class BearerAuth {\n private readonly _token: string\n\n constructor(token: string) {\n // Strip any existing Bearer prefix to avoid double-prepending\n this._token = token.startsWith('Bearer ') ? token.slice(7) : token\n }\n\n getHeaders(): Record<string, string> {\n return { Authorization: `Bearer ${this._token}` }\n }\n}\n\n// ---------------------------------------------------------------------------\n// ClientCredentials — OAuth 2.0 client credentials grant (machine-to-machine)\n// ---------------------------------------------------------------------------\n\nexport interface ClientCredentialsOptions {\n tokenEndpoint: string\n clientId: string\n clientSecret: string\n scope?: string\n store?: KeyValueStore\n /** How many seconds before expiry to proactively re-fetch. Default: 60. */\n refreshBufferSeconds?: number\n}\n\nconst DEFAULT_REFRESH_BUFFER_SECONDS = 60\n\nfunction normalizeToken(token: OAuthToken): OAuthToken {\n if (typeof token.expires_at === 'number' && token.expires_at > 0) {\n if (token.expires_at < 1e10) {\n return { ...token, expires_at: token.expires_at * 1000 }\n }\n return token\n }\n if (typeof token.expires_in === 'number' && token.expires_in > 0) {\n return { ...token, expires_at: Date.now() + token.expires_in * 1000 }\n }\n return token\n}\n\nfunction isExpiring(token: OAuthToken, bufferMs: number): boolean {\n if (token.expires_at == null) return false\n return token.expires_at - Date.now() <= bufferMs\n}\n\nexport class ClientCredentials {\n readonly kind = 'client_credentials' as const\n\n private readonly _tokenEndpoint: string\n private readonly _clientId: string\n private readonly _clientSecret: string\n private readonly _scope?: string\n private readonly _store: KeyValueStore\n private readonly _bufferMs: number\n private _fetchPromise: Promise<OAuthToken> | null = null\n\n constructor(options: ClientCredentialsOptions) {\n this._tokenEndpoint = options.tokenEndpoint\n this._clientId = options.clientId\n this._clientSecret = options.clientSecret\n this._scope = options.scope\n this._store = options.store ?? new InMemoryStore()\n this._bufferMs =\n (options.refreshBufferSeconds ?? DEFAULT_REFRESH_BUFFER_SECONDS) * 1000\n }\n\n async getHeaders(): Promise<Record<string, string>> {\n const token = await this._getValidToken()\n const type = token.token_type?.trim() || 'Bearer'\n return { Authorization: `${type} ${token.access_token}` }\n }\n\n private get _tokenKey(): string {\n return `${this._tokenEndpoint}/token`\n }\n\n private async _getValidToken(): Promise<OAuthToken> {\n const raw = await this._store.get(this._tokenKey)\n if (raw) {\n const normalized = normalizeToken(JSON.parse(raw) as OAuthToken)\n if (!isExpiring(normalized, this._bufferMs)) return normalized\n }\n return await this._doFetch()\n }\n\n private async _doFetch(): Promise<OAuthToken> {\n this._fetchPromise ??= (async () => {\n const params = new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: this._clientId,\n client_secret: this._clientSecret,\n })\n if (this._scope) params.set('scope', this._scope)\n\n const response = await fetch(this._tokenEndpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: params.toString(),\n })\n\n if (!response.ok) {\n const detail = await response.text().catch(() => '')\n throw new Error(\n `ClientCredentials token fetch failed (${response.status})${detail ? `: ${detail}` : ''}`,\n )\n }\n\n const data = (await response.json()) as Partial<OAuthToken>\n if (!data.access_token) {\n throw new Error('ClientCredentials token response missing access_token')\n }\n\n const token = normalizeToken(data as OAuthToken)\n await this._store.set(this._tokenKey, JSON.stringify(token))\n return token\n })().finally(() => {\n this._fetchPromise = null\n })\n\n return this._fetchPromise\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction openBrowser(url: string): void {\n if (process.platform === 'win32') {\n spawn('cmd', ['/c', 'start', '', url], { detached: true, stdio: 'ignore' })\n } else if (process.platform === 'darwin') {\n spawn('open', [url], { detached: true, stdio: 'ignore' })\n } else {\n spawn('xdg-open', [url], { detached: true, stdio: 'ignore' })\n }\n}\n","import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js'\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport'\nimport { normalizeHeaders } from '@modelcontextprotocol/sdk/shared/transport'\nimport { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp'\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse'\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio'\nimport { OAuth, BearerAuth, type ClientCredentials } from './auth.js'\n\n// ---------------------------------------------------------------------------\n// McpServerLike — structural interface for in-process servers.\n// Intentionally loose: avoids importing from the server module.\n// ---------------------------------------------------------------------------\n\nexport interface McpServerLike {\n connect(transport: Transport): Promise<void>\n}\n\nfunction isMcpServerLike(value: unknown): value is McpServerLike {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'connect' in value &&\n typeof (value as Record<string, unknown>).connect === 'function'\n )\n}\n\n// ---------------------------------------------------------------------------\n// MCP config object — { mcpServers: { name: { url | command, ... } } }\n// ---------------------------------------------------------------------------\n\nexport type McpServerEntry =\n | { url: string; headers?: Record<string, string>; auth?: BearerAuth | OAuth | ClientCredentials | string }\n | { command: string; args?: string[]; env?: Record<string, string>; auth?: BearerAuth | OAuth | ClientCredentials | string }\n\n/** Values accepted in mcpServers: either a config object or an in-process server. */\nexport type McpServerValue = McpServerEntry | McpServerLike\n\nexport type McpConfig = {\n mcpServers: Record<string, McpServerValue>\n}\n\nfunction isMcpConfig(value: unknown): value is McpConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'mcpServers' in value &&\n typeof (value as McpConfig).mcpServers === 'object' &&\n (value as McpConfig).mcpServers !== null\n )\n}\n\n// ---------------------------------------------------------------------------\n// StdioTransport — configuration object for stdio subprocess connections.\n// Separate from the SDK's StdioClientTransport so callers work with a plain\n// config value rather than a live transport instance.\n// ---------------------------------------------------------------------------\n\nexport class StdioTransport {\n readonly command: string\n readonly args: string[]\n readonly env?: Record<string, string>\n readonly cwd?: string\n\n constructor(\n command: string,\n args: string[] = [],\n options?: { env?: Record<string, string>; cwd?: string },\n ) {\n this.command = command\n this.args = args\n this.env = options?.env\n this.cwd = options?.cwd\n }\n}\n\n// ---------------------------------------------------------------------------\n// ClientTransportInput — what the Client constructor accepts\n// ---------------------------------------------------------------------------\n\nexport type ClientTransportInput =\n | string // HTTP/HTTPS URL → auto-detect Streamable HTTP or SSE\n | McpServerLike // in-process server instance\n | McpConfig // { mcpServers: { ... } } config object\n | StdioTransport // explicit stdio subprocess config\n | Transport // pass-through — any SDK Transport (advanced)\n\n// ---------------------------------------------------------------------------\n// Resolved transport — what Client.connect() receives\n// ---------------------------------------------------------------------------\n\nexport type ResolvedTransport = {\n transport: Transport\n /**\n * Called before sdkClient.connect(transport). Used for in-process servers\n * that must be connected to their side of the InMemoryTransport first.\n */\n beforeConnect?: () => Promise<void>\n}\n\n// ---------------------------------------------------------------------------\n// Auth header injection helpers\n// ---------------------------------------------------------------------------\n\nfunction isAsyncAuth(\n auth: BearerAuth | OAuth | ClientCredentials,\n): auth is ClientCredentials {\n // Only ClientCredentials uses async per-request injection.\n // OAuth is now an OAuthClientProvider and is passed directly to the transport.\n return 'kind' in auth\n}\n\ntype HttpTransportOptions = {\n requestInit?: RequestInit\n fetch?: (url: string | URL, init?: RequestInit) => Promise<Response>\n eventSourceInit?: Record<string, unknown>\n authProvider?: OAuthClientProvider\n}\n\nfunction buildHttpOptions(\n auth: BearerAuth | OAuth | ClientCredentials | undefined,\n extraHeaders: Record<string, string> = {},\n): HttpTransportOptions {\n const hasExtra = Object.keys(extraHeaders).length > 0\n\n if (!auth && !hasExtra) return {}\n\n // OAuth implements OAuthClientProvider — hand it to the SDK transport which\n // handles the full auth flow (discovery, DCR, PKCE, token refresh, 401 retry).\n if (auth instanceof OAuth) {\n const opts: HttpTransportOptions = { authProvider: auth }\n // Extra headers are injected via requestInit (not Authorization — that's\n // managed by the authProvider).\n if (hasExtra) opts.requestInit = { headers: extraHeaders }\n return opts\n }\n\n if (auth && isAsyncAuth(auth)) {\n // ClientCredentials: inject token per-request via a custom fetch wrapper.\n const customFetch = async (\n url: string | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const authHeaders = await auth.getHeaders()\n return fetch(url, {\n ...init,\n headers: {\n ...authHeaders,\n ...extraHeaders,\n ...normalizeHeaders(init?.headers),\n },\n })\n }\n return { fetch: customFetch }\n }\n\n // Static auth (BearerAuth) or extra headers only.\n const staticHeaders: Record<string, string> = {\n ...(auth ? auth.getHeaders() : {}),\n ...extraHeaders,\n }\n return {\n requestInit: { headers: staticHeaders },\n // Also exposed for SSE's EventSource connection (eventsource npm pkg\n // accepts headers in EventSourceInit, unlike the browser API).\n eventSourceInit: { headers: staticHeaders },\n }\n}\n\n// ---------------------------------------------------------------------------\n// URL → SDK transport\n// ---------------------------------------------------------------------------\n\nfunction urlToTransport(\n url: URL,\n auth: BearerAuth | OAuth | ClientCredentials | undefined,\n extraHeaders: Record<string, string> = {},\n): Transport {\n const { requestInit, fetch: customFetch, eventSourceInit, authProvider } =\n buildHttpOptions(auth, extraHeaders)\n\n const segments = url.pathname.split('/')\n const isSSE = segments.includes('sse') || url.pathname.endsWith('/sse')\n\n if (isSSE) {\n return new SSEClientTransport(url, {\n ...(authProvider ? { authProvider } : {}),\n ...(requestInit ? { requestInit } : {}),\n ...(eventSourceInit ? { eventSourceInit } : {}),\n ...(customFetch ? { fetch: customFetch } : {}),\n })\n }\n\n return new StreamableHTTPClientTransport(url, {\n ...(authProvider ? { authProvider } : {}),\n ...(requestInit ? { requestInit } : {}),\n ...(customFetch ? { fetch: customFetch } : {}),\n })\n}\n\n// ---------------------------------------------------------------------------\n// resolveEntryTransport — resolves a single McpServerEntry to a transport.\n// Used by MultiServerClient to connect to each server independently.\n// ---------------------------------------------------------------------------\n\nexport function resolveEntryTransport(\n entry: McpServerValue,\n auth?: BearerAuth | OAuth | ClientCredentials,\n): ResolvedTransport {\n // In-process server (McpServerLike: has connect(transport)).\n if (isMcpServerLike(entry)) {\n const [serverSide, clientSide] = InMemoryTransport.createLinkedPair()\n return {\n transport: clientSide,\n beforeConnect: () => entry.connect(serverSide),\n }\n }\n\n const entryAuth = resolveEntryAuth(entry.auth) ?? auth\n\n if ('url' in entry) {\n const url = new URL(entry.url)\n const extraHeaders = entry.headers ?? {}\n return { transport: urlToTransport(url, entryAuth, extraHeaders) }\n }\n\n const cmd = entry as { command: string; args?: string[]; env?: Record<string, string> }\n return {\n transport: new StdioClientTransport({\n command: cmd.command,\n args: cmd.args,\n env: cmd.env,\n }),\n }\n}\n\nfunction resolveEntryAuth(\n auth: BearerAuth | OAuth | ClientCredentials | string | undefined,\n): BearerAuth | OAuth | ClientCredentials | undefined {\n if (!auth) return undefined\n if (typeof auth === 'string') return new BearerAuth(auth)\n return auth\n}\n\n// ---------------------------------------------------------------------------\n// resolveTransport — internal; used by Client.connect()\n// ---------------------------------------------------------------------------\n\nexport function resolveTransport(\n input: ClientTransportInput,\n auth?: BearerAuth | OAuth | ClientCredentials,\n): ResolvedTransport {\n // 1. Our StdioTransport config class (check before the duck-type checks below).\n if (input instanceof StdioTransport) {\n return {\n transport: new StdioClientTransport({\n command: input.command,\n args: input.args,\n env: input.env,\n cwd: input.cwd,\n }),\n }\n }\n\n // 2. URL string → auto-detect HTTP transport.\n if (typeof input === 'string') {\n const url = new URL(input)\n return { transport: urlToTransport(url, auth) }\n }\n\n // 3. Pass-through SDK Transport (has the Transport interface: start/close/send).\n if (\n typeof input === 'object' &&\n input !== null &&\n 'start' in input &&\n typeof (input as unknown as Record<string, unknown>).start === 'function'\n ) {\n return { transport: input as Transport }\n }\n\n // 4. MCP config object { mcpServers: { ... } } — use the first entry.\n if (isMcpConfig(input)) {\n const entries = Object.entries(input.mcpServers)\n if (entries.length === 0) throw new Error('mcpServers config is empty')\n const [, entry] = entries[0]!\n return resolveEntryTransport(entry, auth)\n }\n\n // 5. In-process server (McpServerLike: has connect(transport)).\n if (isMcpServerLike(input)) {\n const [serverSide, clientSide] = InMemoryTransport.createLinkedPair()\n return {\n transport: clientSide,\n beforeConnect: () => input.connect(serverSide),\n }\n }\n\n throw new Error(\n 'Unrecognized transport input: expected a URL string, FastMCP server instance, ' +\n 'mcpServers config object, StdioTransport, or SDK Transport',\n )\n}\n","import { resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\n\nimport { Client as SdkClient } from '@modelcontextprotocol/sdk/client'\nimport { UnauthorizedError } from '@modelcontextprotocol/sdk/client/auth.js'\nimport {\n CompatibilityCallToolResultSchema,\n CreateMessageRequestSchema,\n ElicitRequestSchema,\n ListRootsRequestSchema,\n LoggingMessageNotificationSchema,\n ResourceUpdatedNotificationSchema,\n} from '@modelcontextprotocol/sdk/types'\nimport type { RequestOptions as SdkRequestOptions } from '@modelcontextprotocol/sdk/shared/protocol'\n\nimport { BearerAuth, OAuth } from './auth.js'\nimport type { ClientCredentials } from './auth.js'\nimport type { ClientHandlers, ListChangedHandler, ProgressHandler, ResourceUpdateHandler } from './handlers.js'\nimport { defaultLogHandler, defaultProgressHandler } from './handlers.js'\nimport type { CallToolOptions, IClient, RequestOptions } from './interfaces.js'\nimport type {\n CallToolResult,\n CompletionResult,\n ContentBlock,\n GetPromptResult,\n LoggingLevel,\n Prompt,\n Resource,\n ResourceContents,\n ResourceTemplate,\n Root,\n Tool,\n} from './results.js'\nimport type { ClientTransportInput, McpConfig } from './transports.js'\nimport { resolveTransport } from './transports.js'\nimport type { MultiServerOptions } from './multi-server.js'\nimport { MultiServerClient } from './multi-server.js'\n\n// ---------------------------------------------------------------------------\n// Error type\n// ---------------------------------------------------------------------------\n\nexport class ToolCallError extends Error {\n readonly content: ContentBlock[]\n\n constructor(message: string, content: ContentBlock[]) {\n super(message)\n this.name = 'ToolCallError'\n this.content = content\n }\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ClientDefaultOptions {\n /** Global fallback timeout in seconds for all requests. */\n timeout?: number\n tool?: { timeout?: number }\n resource?: { timeout?: number }\n prompt?: { timeout?: number }\n}\n\n/** A single element of the roots option: a URI string or a full Root object. */\nexport type RootInput = string | Root\n\n/**\n * Static list of roots, or an async callback invoked on each roots/list request.\n * URI strings are normalised to file:// URIs automatically; relative paths are\n * resolved against process.cwd().\n */\nexport type RootsValue = RootInput[] | (() => RootInput[] | Promise<RootInput[]>)\n\nexport interface ClientOptions {\n /**\n * Authentication to attach to HTTP requests.\n * A plain string is treated as a Bearer token.\n */\n auth?: BearerAuth | OAuth | ClientCredentials | string\n handlers?: ClientHandlers\n /**\n * Filesystem roots to advertise to the server.\n * Accepts a static array of strings / Root objects, or an async callback\n * invoked on each roots/list request (useful for dynamic root sets).\n */\n roots?: RootsValue\n /**\n * When true (default), the MCP initialize handshake is performed\n * automatically inside connect().\n */\n autoInitialize?: boolean\n defaultOptions?: ClientDefaultOptions\n}\n\n// ---------------------------------------------------------------------------\n// Client\n// ---------------------------------------------------------------------------\n\ntype OptionalHandlerKeys =\n | 'sampling'\n | 'elicitation'\n | 'onToolsListChanged'\n | 'onResourcesListChanged'\n | 'onPromptsListChanged'\n\nexport class Client implements IClient {\n private _sdkClient: SdkClient | null = null\n private _refCount = 0\n private _connectPromise: Promise<void> | null = null\n private readonly _resourceSubscriptions = new Map<string, ResourceUpdateHandler>()\n\n private readonly _input: ClientTransportInput\n private readonly _auth: BearerAuth | OAuth | ClientCredentials | undefined\n private readonly _handlers: Required<Omit<ClientHandlers, OptionalHandlerKeys>> &\n Pick<ClientHandlers, OptionalHandlerKeys>\n private readonly _roots: (() => Promise<Root[]>) | undefined\n private readonly _autoInitialize: boolean\n private readonly _defaultOptions: ClientDefaultOptions\n\n constructor(input: ClientTransportInput, options?: ClientOptions) {\n this._input = input\n this._auth = resolveAuth(options?.auth)\n this._handlers = {\n log: options?.handlers?.log ?? defaultLogHandler,\n progress: options?.handlers?.progress ?? defaultProgressHandler,\n sampling: options?.handlers?.sampling,\n elicitation: options?.handlers?.elicitation,\n onToolsListChanged: options?.handlers?.onToolsListChanged,\n onResourcesListChanged: options?.handlers?.onResourcesListChanged,\n onPromptsListChanged: options?.handlers?.onPromptsListChanged,\n }\n this._roots = options?.roots ? normalizeRootsOption(options.roots) : undefined\n this._autoInitialize = options?.autoInitialize ?? true\n this._defaultOptions = options?.defaultOptions ?? {}\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n async connect(): Promise<void> {\n this._refCount++\n\n // If another concurrent connect() is in progress, wait for it.\n if (this._connectPromise) {\n await this._connectPromise\n return\n }\n\n // Already connected — just bump the ref count.\n if (this._sdkClient) return\n\n this._connectPromise = this._doConnect().finally(() => {\n this._connectPromise = null\n })\n\n try {\n await this._connectPromise\n } catch (err) {\n this._refCount = Math.max(0, this._refCount - 1)\n throw err\n }\n }\n\n private async _doConnect(): Promise<void> {\n const sdkClient = new SdkClient(\n { name: 'fastmcp-ts', version: '1.0.0' },\n {\n capabilities: this._buildCapabilities(),\n listChanged: this._buildListChangedConfig(),\n },\n )\n\n this._registerHandlers(sdkClient)\n\n const { transport, beforeConnect } = resolveTransport(this._input, this._auth)\n\n // Bind the server URL into the OAuth provider before the SDK transport\n // reads clientMetadata or tokens() so storage keys are properly namespaced.\n if (this._auth instanceof OAuth) {\n const serverUrl = this._extractServerUrl()\n if (serverUrl) this._auth._bind(serverUrl)\n }\n\n if (beforeConnect) await beforeConnect()\n\n try {\n await sdkClient.connect(transport)\n } catch (err) {\n if (err instanceof UnauthorizedError && this._auth instanceof OAuth) {\n // The SDK opened the browser and is waiting for the user to authorize.\n // Wait for the callback server to receive the code, then finish auth\n // and retry the connection.\n const code = await this._auth.waitForCallback()\n if (\n 'finishAuth' in transport &&\n typeof (transport as Record<string, unknown>).finishAuth === 'function'\n ) {\n await (transport as { finishAuth(code: string): Promise<void> }).finishAuth(\n code,\n )\n }\n await sdkClient.connect(transport)\n } else {\n throw err\n }\n }\n\n this._sdkClient = sdkClient\n }\n\n private _extractServerUrl(): string | undefined {\n const input = this._input\n if (typeof input === 'string') return input\n if (\n typeof input === 'object' &&\n input !== null &&\n 'mcpServers' in input\n ) {\n const entries = Object.entries(\n (input as { mcpServers: Record<string, { url?: string }> }).mcpServers,\n )\n if (entries.length > 0) {\n const [, entry] = entries[0]!\n if (entry && 'url' in entry && typeof entry.url === 'string') {\n return entry.url\n }\n }\n }\n return undefined\n }\n\n async close(): Promise<void> {\n this._refCount = Math.max(0, this._refCount - 1)\n if (this._refCount > 0) return\n\n const sdk = this._sdkClient\n this._sdkClient = null\n if (sdk) await sdk.close()\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close()\n }\n\n isConnected(): boolean {\n return this._sdkClient !== null\n }\n\n /** Creates a connected MultiServerClient when given a multi-entry McpConfig. */\n static async connect(input: McpConfig, options?: MultiServerOptions): Promise<MultiServerClient>\n /** Creates a connected Client for a single-server transport. Use with `await using` for automatic cleanup. */\n static async connect(input: ClientTransportInput, options?: ClientOptions): Promise<Client>\n static async connect(\n input: ClientTransportInput | McpConfig,\n options?: ClientOptions | MultiServerOptions,\n ): Promise<Client | MultiServerClient> {\n if (\n typeof input === 'object' &&\n input !== null &&\n 'mcpServers' in input &&\n Object.keys((input as McpConfig).mcpServers).length > 1\n ) {\n return MultiServerClient.connect(input as McpConfig, options as MultiServerOptions)\n }\n const client = new Client(input as ClientTransportInput, options as ClientOptions)\n await client.connect()\n return client\n }\n\n // -------------------------------------------------------------------------\n // Core protocol\n // -------------------------------------------------------------------------\n\n async ping(options?: RequestOptions): Promise<boolean> {\n await this._sdk().ping(this._toSdkOptions(options))\n return true\n }\n\n // -------------------------------------------------------------------------\n // Tools (IToolsClient)\n // -------------------------------------------------------------------------\n\n async listTools(options?: RequestOptions): Promise<Tool[]> {\n const result = await this._sdk().listTools(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.tool?.timeout),\n )\n return result.tools as Tool[]\n }\n\n async callTool<TData = unknown>(\n name: string,\n args?: Record<string, unknown>,\n options?: CallToolOptions,\n ): Promise<CallToolResult<TData>> {\n const raw = await this.callToolRaw<TData>(name, args, options)\n if (raw.isError) {\n const message =\n (raw.content as Array<{ type: string; text?: string }>)\n .filter((c) => c.type === 'text')\n .map((c) => c.text ?? '')\n .join('\\n') || 'Tool returned an error'\n throw new ToolCallError(message, raw.content)\n }\n return raw\n }\n\n /** Returns the full result including isError without throwing. */\n async callToolRaw<TData = unknown>(\n name: string,\n args?: Record<string, unknown>,\n options?: CallToolOptions,\n ): Promise<CallToolResult<TData>> {\n const sdkOptions = this._toSdkOptions(\n options,\n options?.onProgress,\n this._defaultOptions.tool?.timeout,\n )\n const result = await this._sdk().callTool(\n { name, arguments: args ?? {} },\n CompatibilityCallToolResultSchema,\n sdkOptions,\n )\n return {\n content: result.content as ContentBlock[],\n structuredContent: (result.structuredContent as TData | undefined) ?? null,\n isError: result.isError === true,\n }\n }\n\n // -------------------------------------------------------------------------\n // Resources (IResourcesClient)\n // -------------------------------------------------------------------------\n\n async listResources(options?: RequestOptions): Promise<Resource[]> {\n const result = await this._sdk().listResources(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return result.resources as Resource[]\n }\n\n async listResourceTemplates(options?: RequestOptions): Promise<ResourceTemplate[]> {\n const result = await this._sdk().listResourceTemplates(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return result.resourceTemplates as ResourceTemplate[]\n }\n\n async readResource(uri: string, options?: RequestOptions): Promise<ResourceContents[]> {\n const result = await this._sdk().readResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return result.contents as ResourceContents[]\n }\n\n /** Returns the raw SDK ReadResourceResult without unwrapping. */\n async readResourceRaw(uri: string, options?: RequestOptions) {\n return this._sdk().readResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n }\n\n async subscribeResource(\n uri: string,\n handler: ResourceUpdateHandler,\n options?: RequestOptions,\n ): Promise<void> {\n this._resourceSubscriptions.set(uri, handler)\n await this._sdk().subscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n }\n\n async unsubscribeResource(uri: string, options?: RequestOptions): Promise<void> {\n this._resourceSubscriptions.delete(uri)\n await this._sdk().unsubscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n }\n\n // -------------------------------------------------------------------------\n // Prompts (IPromptsClient)\n // -------------------------------------------------------------------------\n\n async listPrompts(options?: RequestOptions): Promise<Prompt[]> {\n const result = await this._sdk().listPrompts(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.prompt?.timeout),\n )\n return result.prompts as Prompt[]\n }\n\n async getPrompt(\n name: string,\n args?: Record<string, string>,\n options?: RequestOptions,\n ): Promise<GetPromptResult> {\n const result = await this._sdk().getPrompt(\n { name, arguments: args },\n this._toSdkOptions(options, undefined, this._defaultOptions.prompt?.timeout),\n )\n return result as GetPromptResult\n }\n\n // -------------------------------------------------------------------------\n // Completion\n // -------------------------------------------------------------------------\n\n async complete(\n ref: { type: 'ref/prompt'; name: string } | { type: 'ref/resource'; uri: string },\n argument: { name: string; value: string },\n context?: { arguments?: Record<string, string> },\n options?: RequestOptions,\n ): Promise<CompletionResult> {\n const result = await this._sdk().complete(\n { ref, argument, ...(context ? { context } : {}) },\n this._toSdkOptions(options),\n )\n return result.completion as CompletionResult\n }\n\n // -------------------------------------------------------------------------\n // Logging\n // -------------------------------------------------------------------------\n\n async setLogLevel(level: LoggingLevel, options?: RequestOptions): Promise<void> {\n await this._sdk().setLoggingLevel(level, this._toSdkOptions(options))\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private _sdk(): SdkClient {\n if (!this._sdkClient) {\n throw new Error('Client is not connected. Call connect() first.')\n }\n return this._sdkClient\n }\n\n private _toSdkOptions(\n options?: RequestOptions,\n overrideProgress?: ProgressHandler,\n scopedTimeoutSeconds?: number,\n ): SdkRequestOptions {\n const timeoutSeconds =\n options?.timeout ?? scopedTimeoutSeconds ?? this._defaultOptions.timeout\n const progressHandler = overrideProgress ?? this._handlers.progress\n\n const sdkOptions: SdkRequestOptions = {}\n if (timeoutSeconds != null) sdkOptions.timeout = timeoutSeconds * 1000\n if (options?.signal) sdkOptions.signal = options.signal\n if (progressHandler) {\n sdkOptions.onprogress = ({ progress, total, message }) => {\n void progressHandler(progress, total, message)\n }\n }\n return sdkOptions\n }\n\n private _buildCapabilities() {\n return {\n ...(this._handlers.sampling ? { sampling: { tools: {} } } : {}),\n ...(this._handlers.elicitation ? { elicitation: {} } : {}),\n ...(this._roots ? { roots: { listChanged: true } } : {}),\n }\n }\n\n private _buildListChangedConfig() {\n const { onToolsListChanged, onResourcesListChanged, onPromptsListChanged } = this._handlers\n if (!onToolsListChanged && !onResourcesListChanged && !onPromptsListChanged) return undefined\n\n const adapt = <T>(h: ListChangedHandler<T>) => ({\n onChanged: (err: Error | null, items: T[] | null) => { void h.onChanged(err, items) },\n ...(h.autoRefresh !== undefined ? { autoRefresh: h.autoRefresh } : {}),\n ...(h.debounceMs !== undefined ? { debounceMs: h.debounceMs } : {}),\n })\n\n return {\n ...(onToolsListChanged ? { tools: adapt(onToolsListChanged) } : {}),\n ...(onResourcesListChanged ? { resources: adapt(onResourcesListChanged) } : {}),\n ...(onPromptsListChanged ? { prompts: adapt(onPromptsListChanged) } : {}),\n }\n }\n\n private _registerHandlers(sdk: SdkClient): void {\n // Log notifications from the server\n sdk.setNotificationHandler(LoggingMessageNotificationSchema, (notification) => {\n void this._handlers.log({\n level: notification.params.level,\n logger: notification.params.logger ?? undefined,\n data: notification.params.data,\n })\n })\n\n // Resource update notifications (for active subscriptions)\n sdk.setNotificationHandler(ResourceUpdatedNotificationSchema, (notification) => {\n const handler = this._resourceSubscriptions.get(notification.params.uri)\n if (handler) void handler(notification.params.uri)\n })\n\n // Sampling: server requests an LLM completion from the client\n if (this._handlers.sampling) {\n const samplingHandler = this._handlers.sampling\n sdk.setRequestHandler(CreateMessageRequestSchema, async (request) => {\n return samplingHandler(request.params)\n })\n }\n\n // Elicitation: server requests structured user input\n if (this._handlers.elicitation) {\n const elicitationHandler = this._handlers.elicitation\n sdk.setRequestHandler(ElicitRequestSchema, async (request) => {\n return elicitationHandler(request.params)\n })\n }\n\n // Roots: server requests the client's accessible filesystem roots\n if (this._roots) {\n const getRoots = this._roots\n sdk.setRequestHandler(ListRootsRequestSchema, async () => ({\n roots: await getRoots(),\n }))\n }\n }\n\n // -------------------------------------------------------------------------\n // Roots\n // -------------------------------------------------------------------------\n\n /**\n * Notify the connected server that the client's roots list has changed.\n * The server should re-issue a roots/list request to get the updated list.\n */\n async notifyRootsChanged(): Promise<void> {\n await this._sdk().sendRootsListChanged()\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveAuth(\n auth: BearerAuth | OAuth | ClientCredentials | string | undefined,\n): BearerAuth | OAuth | ClientCredentials | undefined {\n if (!auth) return undefined\n if (typeof auth === 'string') return new BearerAuth(auth)\n return auth\n}\n\nfunction normalizeRootsOption(roots: RootsValue): () => Promise<Root[]> {\n if (typeof roots === 'function') {\n return async () => (await roots()).map(normalizeRootInput)\n }\n const normalized = roots.map(normalizeRootInput)\n return () => Promise.resolve(normalized)\n}\n\nfunction normalizeRootInput(input: RootInput): Root {\n if (typeof input === 'string') return { uri: normalizeRootUri(input) }\n return { ...input, uri: normalizeRootUri(input.uri) }\n}\n\nfunction normalizeRootUri(input: string): string {\n if (input.startsWith('file://')) return input\n return pathToFileURL(resolve(input)).href\n}\n","import { Client as SdkClient } from '@modelcontextprotocol/sdk/client'\nimport {\n CompatibilityCallToolResultSchema,\n LoggingMessageNotificationSchema,\n ResourceUpdatedNotificationSchema,\n CreateMessageRequestSchema,\n ElicitRequestSchema,\n ListRootsRequestSchema,\n} from '@modelcontextprotocol/sdk/types'\nimport type { LoggingLevel } from '@modelcontextprotocol/sdk/types'\n\nimport type { BearerAuth, OAuth, ClientCredentials } from './auth.js'\nimport type { ClientHandlers, LogHandler, ProgressHandler, ResourceUpdateHandler } from './handlers.js'\nimport { defaultLogHandler, defaultProgressHandler } from './handlers.js'\nimport type { CallToolOptions, IClient, RequestOptions } from './interfaces.js'\nimport type {\n CallToolResult,\n CompletionResult,\n ContentBlock,\n GetPromptResult,\n Prompt,\n Resource,\n ResourceContents,\n ResourceTemplate,\n Tool,\n} from './results.js'\nimport type { McpConfig, McpServerValue } from './transports.js'\nimport { resolveEntryTransport } from './transports.js'\nimport type { ClientDefaultOptions } from './client.js'\nimport { ToolCallError } from './client.js'\nimport type { RequestOptions as SdkRequestOptions } from '@modelcontextprotocol/sdk/shared/protocol'\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface MultiServerOptions {\n handlers?: ClientHandlers\n /** file:// URIs to advertise to all servers as accessible roots. */\n roots?: string[]\n defaultOptions?: ClientDefaultOptions\n}\n\n// ---------------------------------------------------------------------------\n// MultiServerClient\n// ---------------------------------------------------------------------------\n\nexport class MultiServerClient implements IClient {\n private _clients: Map<string, SdkClient> = new Map()\n private _connectPromise: Promise<void> | null = null\n private _connected = false\n\n /** URI (or namespaced template URI) → server name, populated by list calls */\n private _uriMap: Map<string, string> = new Map()\n\n private readonly _config: McpConfig\n private readonly _handlers: {\n log: LogHandler\n progress: ProgressHandler\n sampling?: ClientHandlers['sampling']\n elicitation?: ClientHandlers['elicitation']\n }\n private readonly _roots: string[] | undefined\n private readonly _defaultOptions: ClientDefaultOptions\n private _resourceSubscriptions: Map<string, ResourceUpdateHandler> = new Map()\n\n constructor(config: McpConfig, options?: MultiServerOptions) {\n this._config = config\n this._handlers = {\n log: options?.handlers?.log ?? defaultLogHandler,\n progress: options?.handlers?.progress ?? defaultProgressHandler,\n sampling: options?.handlers?.sampling,\n elicitation: options?.handlers?.elicitation,\n }\n this._roots = options?.roots\n this._defaultOptions = options?.defaultOptions ?? {}\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n async connect(): Promise<void> {\n if (this._connected) return\n if (this._connectPromise) {\n await this._connectPromise\n return\n }\n\n this._connectPromise = this._doConnect().finally(() => {\n this._connectPromise = null\n })\n\n await this._connectPromise\n }\n\n private async _doConnect(): Promise<void> {\n const entries = Object.entries(this._config.mcpServers)\n if (entries.length === 0) throw new Error('mcpServers config is empty')\n\n const connected: Array<[string, SdkClient]> = []\n\n try {\n await Promise.all(\n entries.map(async ([name, entry]) => {\n const sdk = this._buildSdkClient()\n this._registerHandlers(sdk)\n const { transport, beforeConnect } = resolveEntryTransport(\n entry as McpServerValue,\n )\n if (beforeConnect) await beforeConnect()\n await sdk.connect(transport)\n connected.push([name, sdk])\n }),\n )\n } catch (err) {\n // Roll back any connections that succeeded before the failure.\n await Promise.allSettled(connected.map(([, sdk]) => sdk.close()))\n throw err\n }\n\n for (const [name, sdk] of connected) {\n this._clients.set(name, sdk)\n }\n\n this._connected = true\n }\n\n async close(): Promise<void> {\n if (!this._connected) return\n this._connected = false\n this._uriMap.clear()\n await Promise.allSettled([...this._clients.values()].map((sdk) => sdk.close()))\n this._clients.clear()\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close()\n }\n\n isConnected(): boolean {\n return this._connected\n }\n\n static async connect(\n config: McpConfig,\n options?: MultiServerOptions,\n ): Promise<MultiServerClient> {\n const client = new MultiServerClient(config, options)\n await client.connect()\n return client\n }\n\n // -------------------------------------------------------------------------\n // Core protocol\n // -------------------------------------------------------------------------\n\n async ping(options?: RequestOptions): Promise<boolean> {\n this._assertConnected()\n await Promise.all(\n [...this._clients.values()].map((sdk) =>\n sdk.ping(this._toSdkOptions(options)),\n ),\n )\n return true\n }\n\n // -------------------------------------------------------------------------\n // Tools\n // -------------------------------------------------------------------------\n\n async listTools(options?: RequestOptions): Promise<Tool[]> {\n this._assertConnected()\n const results = await Promise.all(\n [...this._clients.entries()].map(async ([name, sdk]) => {\n const r = await sdk.listTools(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.tool?.timeout),\n )\n return (r.tools as Tool[]).map((t) => ({ ...t, name: `${name}_${t.name}` }))\n }),\n )\n return results.flat()\n }\n\n async callTool<TData = unknown>(\n name: string,\n args?: Record<string, unknown>,\n options?: CallToolOptions,\n ): Promise<CallToolResult<TData>> {\n const raw = await this.callToolRaw<TData>(name, args, options)\n if (raw.isError) {\n const message =\n (raw.content as Array<{ type: string; text?: string }>)\n .filter((c) => c.type === 'text')\n .map((c) => c.text ?? '')\n .join('\\n') || 'Tool returned an error'\n throw new ToolCallError(message, raw.content)\n }\n return raw\n }\n\n async callToolRaw<TData = unknown>(\n name: string,\n args?: Record<string, unknown>,\n options?: CallToolOptions,\n ): Promise<CallToolResult<TData>> {\n const { serverName, localName } = this._parseNamespacedName(name)\n const sdk = this._sdkForServer(serverName)\n const sdkOptions = this._toSdkOptions(\n options,\n options?.onProgress,\n this._defaultOptions.tool?.timeout,\n )\n const result = await sdk.callTool(\n { name: localName, arguments: args ?? {} },\n CompatibilityCallToolResultSchema,\n sdkOptions,\n )\n return {\n content: result.content as ContentBlock[],\n structuredContent: (result.structuredContent as TData | undefined) ?? null,\n isError: result.isError === true,\n }\n }\n\n // -------------------------------------------------------------------------\n // Resources\n // -------------------------------------------------------------------------\n\n async listResources(options?: RequestOptions): Promise<Resource[]> {\n this._assertConnected()\n const results = await Promise.all(\n [...this._clients.entries()].map(async ([name, sdk]) => {\n const r = await sdk.listResources(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n const resources = r.resources as Resource[]\n for (const res of resources) {\n this._uriMap.set(res.uri, name)\n }\n return resources.map((res) => ({\n ...res,\n name: res.name ? `${name}_${res.name}` : res.name,\n }))\n }),\n )\n return results.flat()\n }\n\n async listResourceTemplates(options?: RequestOptions): Promise<ResourceTemplate[]> {\n this._assertConnected()\n const results = await Promise.all(\n [...this._clients.entries()].map(async ([name, sdk]) => {\n const r = await sdk.listResourceTemplates(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n const templates = r.resourceTemplates as ResourceTemplate[]\n for (const tmpl of templates) {\n this._uriMap.set(tmpl.uriTemplate, name)\n }\n return templates.map((tmpl) => ({\n ...tmpl,\n name: tmpl.name ? `${name}_${tmpl.name}` : tmpl.name,\n }))\n }),\n )\n return results.flat()\n }\n\n async readResource(uri: string, options?: RequestOptions): Promise<ResourceContents[]> {\n this._assertConnected()\n const sdkOptions = this._toSdkOptions(\n options,\n undefined,\n this._defaultOptions.resource?.timeout,\n )\n\n // Fast path: URI was seen during a previous list call.\n const knownServer = this._uriMap.get(uri)\n if (knownServer) {\n const sdk = this._clients.get(knownServer)!\n const result = await sdk.readResource({ uri }, sdkOptions)\n return result.contents as ResourceContents[]\n }\n\n // Fallback: try each server in order, return the first success.\n const errors: unknown[] = []\n for (const sdk of this._clients.values()) {\n try {\n const result = await sdk.readResource({ uri }, sdkOptions)\n return result.contents as ResourceContents[]\n } catch (err) {\n errors.push(err)\n }\n }\n throw new Error(\n `Resource not found on any server: ${uri}\\n` +\n errors.map((e) => String(e)).join('\\n'),\n )\n }\n\n // -------------------------------------------------------------------------\n // Prompts\n // -------------------------------------------------------------------------\n\n async listPrompts(options?: RequestOptions): Promise<Prompt[]> {\n this._assertConnected()\n const results = await Promise.all(\n [...this._clients.entries()].map(async ([name, sdk]) => {\n const r = await sdk.listPrompts(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.prompt?.timeout),\n )\n return (r.prompts as Prompt[]).map((p) => ({ ...p, name: `${name}_${p.name}` }))\n }),\n )\n return results.flat()\n }\n\n async getPrompt(\n name: string,\n args?: Record<string, string>,\n options?: RequestOptions,\n ): Promise<GetPromptResult> {\n const { serverName, localName } = this._parseNamespacedName(name)\n const sdk = this._sdkForServer(serverName)\n const result = await sdk.getPrompt(\n { name: localName, arguments: args },\n this._toSdkOptions(options, undefined, this._defaultOptions.prompt?.timeout),\n )\n return result as GetPromptResult\n }\n\n // -------------------------------------------------------------------------\n // Resource subscriptions\n // -------------------------------------------------------------------------\n\n async subscribeResource(\n uri: string,\n handler: ResourceUpdateHandler,\n options?: RequestOptions,\n ): Promise<void> {\n this._assertConnected()\n this._resourceSubscriptions.set(uri, handler)\n const serverName = this._uriMap.get(uri)\n if (serverName) {\n await this._clients.get(serverName)!.subscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return\n }\n const errors: unknown[] = []\n for (const sdk of this._clients.values()) {\n try {\n await sdk.subscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return\n } catch (err) {\n errors.push(err)\n }\n }\n throw new Error(`Subscribe failed on all servers:\\n${errors.map(String).join('\\n')}`)\n }\n\n async unsubscribeResource(uri: string, options?: RequestOptions): Promise<void> {\n this._assertConnected()\n this._resourceSubscriptions.delete(uri)\n const serverName = this._uriMap.get(uri)\n if (serverName) {\n await this._clients.get(serverName)!.unsubscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return\n }\n await Promise.allSettled(\n [...this._clients.values()].map((sdk) =>\n sdk.unsubscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n ),\n ),\n )\n }\n\n // -------------------------------------------------------------------------\n // Completion\n // -------------------------------------------------------------------------\n\n async complete(\n ref: { type: 'ref/prompt'; name: string } | { type: 'ref/resource'; uri: string },\n argument: { name: string; value: string },\n context?: { arguments?: Record<string, string> },\n options?: RequestOptions,\n ): Promise<CompletionResult> {\n this._assertConnected()\n const sdkOptions = this._toSdkOptions(options)\n\n if (ref.type === 'ref/prompt') {\n const { serverName, localName } = this._parseNamespacedName(ref.name)\n const sdk = this._sdkForServer(serverName)\n const result = await sdk.complete(\n { ref: { type: 'ref/prompt', name: localName }, argument, ...(context ? { context } : {}) },\n sdkOptions,\n )\n return result.completion as CompletionResult\n }\n\n const serverName = this._uriMap.get(ref.uri)\n if (serverName) {\n const result = await this._clients.get(serverName)!.complete(\n { ref, argument, ...(context ? { context } : {}) },\n sdkOptions,\n )\n return result.completion as CompletionResult\n }\n\n const errors: unknown[] = []\n for (const sdk of this._clients.values()) {\n try {\n const result = await sdk.complete(\n { ref, argument, ...(context ? { context } : {}) },\n sdkOptions,\n )\n return result.completion as CompletionResult\n } catch (err) {\n errors.push(err)\n }\n }\n throw new Error(`Completion failed on all servers:\\n${errors.map(String).join('\\n')}`)\n }\n\n // -------------------------------------------------------------------------\n // Logging\n // -------------------------------------------------------------------------\n\n async setLogLevel(level: LoggingLevel, options?: RequestOptions): Promise<void> {\n this._assertConnected()\n await Promise.all(\n [...this._clients.values()].map((sdk) =>\n sdk.setLoggingLevel(level, this._toSdkOptions(options)),\n ),\n )\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private _assertConnected(): void {\n if (!this._connected) {\n throw new Error('MultiServerClient is not connected. Call connect() first.')\n }\n }\n\n private _parseNamespacedName(name: string): { serverName: string; localName: string } {\n // Sort longest-first so that server names like \"my_server\" are matched\n // before the shorter prefix \"my\".\n const serverNames = [...this._clients.keys()].sort((a, b) => b.length - a.length)\n for (const serverName of serverNames) {\n const prefix = `${serverName}_`\n if (name.startsWith(prefix)) {\n return { serverName, localName: name.slice(prefix.length) }\n }\n }\n throw new Error(\n `Tool/prompt name \"${name}\" has no server namespace prefix. ` +\n `Expected format: \"<serverName>_<name>\".`,\n )\n }\n\n private _sdkForServer(serverName: string): SdkClient {\n const sdk = this._clients.get(serverName)\n if (!sdk) {\n throw new Error(\n `No server named \"${serverName}\" in this MultiServerClient. ` +\n `Known servers: ${[...this._clients.keys()].join(', ')}.`,\n )\n }\n return sdk\n }\n\n private _buildSdkClient(): SdkClient {\n return new SdkClient(\n { name: 'fastmcp-ts', version: '1.0.0' },\n { capabilities: this._buildCapabilities() },\n )\n }\n\n private _buildCapabilities() {\n return {\n ...(this._handlers.sampling ? { sampling: { tools: {} } } : {}),\n ...(this._handlers.elicitation ? { elicitation: {} } : {}),\n ...(this._roots ? { roots: { listChanged: false } } : {}),\n }\n }\n\n private _registerHandlers(sdk: SdkClient): void {\n sdk.setNotificationHandler(LoggingMessageNotificationSchema, (notification) => {\n void this._handlers.log({\n level: notification.params.level,\n logger: notification.params.logger ?? undefined,\n data: notification.params.data,\n })\n })\n\n sdk.setNotificationHandler(ResourceUpdatedNotificationSchema, (notification) => {\n const handler = this._resourceSubscriptions.get(notification.params.uri)\n if (handler) void handler(notification.params.uri)\n })\n\n if (this._handlers.sampling) {\n const h = this._handlers.sampling\n sdk.setRequestHandler(CreateMessageRequestSchema, async (req) => h(req.params))\n }\n\n if (this._handlers.elicitation) {\n const h = this._handlers.elicitation\n sdk.setRequestHandler(ElicitRequestSchema, async (req) => h(req.params))\n }\n\n if (this._roots) {\n const roots = this._roots\n sdk.setRequestHandler(ListRootsRequestSchema, async () => ({\n roots: roots.map((uri) => ({ uri })),\n }))\n }\n }\n\n private _toSdkOptions(\n options?: RequestOptions,\n overrideProgress?: ProgressHandler,\n scopedTimeoutSeconds?: number,\n ): SdkRequestOptions {\n const timeoutSeconds =\n options?.timeout ?? scopedTimeoutSeconds ?? this._defaultOptions.timeout\n const progressHandler = overrideProgress ?? this._handlers.progress\n\n const sdkOptions: SdkRequestOptions = {}\n if (timeoutSeconds != null) sdkOptions.timeout = timeoutSeconds * 1000\n if (options?.signal) sdkOptions.signal = options.signal\n if (progressHandler) {\n sdkOptions.onprogress = ({ progress, total, message }) => {\n void progressHandler(progress, total, message)\n }\n }\n return sdkOptions\n }\n}\n","export type Result<T, E = Error> =\n | { ok: true; value: T }\n | { ok: false; error: E }\n\nexport async function toResult<T, E = Error>(\n fn: Promise<T> | (() => Promise<T>),\n): Promise<Result<T, E>> {\n try {\n const value = await (typeof fn === 'function' ? fn() : fn)\n return { ok: true, value }\n } catch (error) {\n return { ok: false, error: error as E }\n }\n}\n","import type { ModelPreferences } from '@modelcontextprotocol/sdk/types'\nimport type { SamplingHandler } from '../handlers.js'\n\nexport type { SamplingHandler }\n\n/**\n * Resolve a concrete model name from the server's modelPreferences.\n * A plain string always uses that model; a function inspects the preferences.\n */\nexport type ModelSelector = string | ((prefs: ModelPreferences | undefined) => string)\n\n/** Called with each text token as it is streamed from the provider. */\nexport type OnTokenCallback = (token: string) => void\n\nexport interface SamplingAdapterOptions {\n /** Override or replace the model selection logic. */\n modelSelector?: ModelSelector\n /** Fired for each streamed text token. Tool-use deltas are not surfaced. */\n onToken?: OnTokenCallback\n}\n\n/** Implemented by all sampling adapters. */\nexport interface SamplingAdapter {\n asHandler(): SamplingHandler\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nexport function resolveModel(\n prefs: ModelPreferences | undefined,\n selector: ModelSelector | undefined,\n defaultModel: string,\n): string {\n if (!selector) {\n return prefs?.hints?.[0]?.name ?? defaultModel\n }\n if (typeof selector === 'string') return selector\n return selector(prefs)\n}\n","import type {\n SamplingMessage,\n Tool,\n ToolChoice,\n} from '@modelcontextprotocol/sdk/types'\nimport type { AnySamplingResult } from '../results.js'\nimport type { SamplingAdapter, SamplingAdapterOptions, ModelSelector, OnTokenCallback } from './types.js'\nimport type { SamplingHandler } from '../handlers.js'\nimport { resolveModel } from './types.js'\nimport type { CreateMessageRequestParams } from '@modelcontextprotocol/sdk/types'\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface GenericCompletionParams {\n model: string\n messages: SamplingMessage[]\n system?: string\n /** Defaulted to 1024 when absent in the original request. */\n maxTokens: number\n temperature?: number\n stopSequences?: string[]\n tools?: Tool[]\n toolChoice?: ToolChoice\n onToken?: OnTokenCallback\n}\n\nexport type GenericCompletionFn = (\n params: GenericCompletionParams,\n) => Promise<AnySamplingResult>\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\n/**\n * Contribution template. Wraps any async function into a SamplingHandler.\n *\n * The adapter resolves the model from modelPreferences, defaults maxTokens,\n * and threads onToken through. Message format conversion, tool translation,\n * and streaming are the caller's responsibility.\n *\n * Example:\n * ```ts\n * const adapter = new GenericSamplingAdapter(async ({ model, messages }) => {\n * const text = await myLlm.complete(model, messages)\n * return { role: 'assistant', content: { type: 'text', text }, model, stopReason: 'endTurn' }\n * })\n * ```\n */\nexport class GenericSamplingAdapter implements SamplingAdapter {\n private readonly _fn: GenericCompletionFn\n private readonly _options: SamplingAdapterOptions & { defaultModel?: string }\n\n constructor(\n fn: GenericCompletionFn,\n options?: SamplingAdapterOptions & { defaultModel?: string },\n ) {\n this._fn = fn\n this._options = options ?? {}\n }\n\n asHandler(): SamplingHandler {\n return async (params: CreateMessageRequestParams): Promise<AnySamplingResult> => {\n const model = resolveModel(\n params.modelPreferences,\n this._options.modelSelector,\n this._options.defaultModel ?? 'unknown',\n )\n return this._fn({\n model,\n messages: params.messages,\n system: params.systemPrompt,\n maxTokens: params.maxTokens ?? 1024,\n temperature: params.temperature,\n stopSequences: params.stopSequences,\n tools: params.tools,\n toolChoice: params.toolChoice,\n onToken: this._options.onToken,\n })\n }\n }\n}\n","import type Anthropic from '@anthropic-ai/sdk'\nimport type {\n ContentBlockParam,\n ToolResultBlockParam,\n} from '@anthropic-ai/sdk/resources/messages'\nimport type {\n CreateMessageRequestParams,\n SamplingMessage,\n Tool,\n ToolChoice,\n ToolUseContent,\n} from '@modelcontextprotocol/sdk/types'\nimport type { AnySamplingResult } from '../results.js'\nimport type { SamplingHandler } from '../handlers.js'\nimport type { SamplingAdapter, SamplingAdapterOptions } from './types.js'\nimport { resolveModel } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Message translation\n// ---------------------------------------------------------------------------\n\nfunction toBlocks(content: SamplingMessage['content']): ContentBlockParam[] {\n const items = Array.isArray(content) ? content : [content]\n const out: ContentBlockParam[] = []\n\n for (const block of items) {\n if (block.type === 'text') {\n out.push({ type: 'text', text: block.text })\n } else if (block.type === 'image') {\n out.push({\n type: 'image',\n source: {\n type: 'base64',\n media_type: block.mimeType as Anthropic.Base64ImageSource['media_type'],\n data: block.data,\n },\n })\n } else if (block.type === 'tool_use') {\n out.push({\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n })\n } else if (block.type === 'tool_result') {\n const resultContent: ToolResultBlockParam['content'] = block.content.flatMap((c) =>\n c.type === 'text' ? [{ type: 'text' as const, text: c.text }] : [],\n )\n out.push({\n type: 'tool_result',\n tool_use_id: block.toolUseId,\n content: resultContent,\n is_error: block.isError,\n })\n }\n // audio: not supported by Anthropic messages API — skip\n }\n return out\n}\n\nfunction toAnthropicMessages(messages: SamplingMessage[]): Anthropic.MessageParam[] {\n return messages.map((m) => ({\n role: m.role as 'user' | 'assistant',\n content: toBlocks(m.content),\n }))\n}\n\nfunction toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description ?? '',\n input_schema: t.inputSchema as Anthropic.Tool['input_schema'],\n }))\n}\n\nfunction toAnthropicToolChoice(\n choice: ToolChoice | undefined,\n): Anthropic.MessageCreateParams['tool_choice'] {\n if (!choice) return undefined\n if (choice.mode === 'required') return { type: 'any' }\n return { type: 'auto' }\n}\n\n// ---------------------------------------------------------------------------\n// Response mapping\n// ---------------------------------------------------------------------------\n\nfunction mapStopReason(reason: string | null | undefined): string {\n if (reason === 'end_turn') return 'endTurn'\n if (reason === 'stop_sequence') return 'stopSequence'\n if (reason === 'max_tokens') return 'maxTokens'\n if (reason === 'tool_use') return 'toolUse'\n return reason ?? 'endTurn'\n}\n\nfunction buildResult(message: Anthropic.Message): AnySamplingResult {\n const stopReason = mapStopReason(message.stop_reason)\n\n if (stopReason === 'toolUse') {\n const content = message.content.flatMap((block): ToolUseContent[] => {\n if (block.type === 'tool_use') {\n return [{\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n }]\n }\n return []\n })\n return { role: 'assistant', model: message.model, stopReason, content }\n }\n\n const textBlock = message.content.find((b) => b.type === 'text')\n const text = textBlock?.type === 'text' ? textBlock.text : ''\n return { role: 'assistant', model: message.model, stopReason, content: { type: 'text', text } }\n}\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\nexport class AnthropicSamplingAdapter implements SamplingAdapter {\n private readonly _client: Anthropic\n private readonly _options: SamplingAdapterOptions & { defaultModel?: string }\n\n constructor(\n client: Anthropic,\n options?: SamplingAdapterOptions & { defaultModel?: string },\n ) {\n this._client = client\n this._options = options ?? {}\n }\n\n asHandler(): SamplingHandler {\n return async (params: CreateMessageRequestParams): Promise<AnySamplingResult> => {\n const model = resolveModel(\n params.modelPreferences,\n this._options.modelSelector,\n this._options.defaultModel ?? 'claude-opus-4-5',\n )\n\n const omitTools = params.toolChoice?.mode === 'none'\n const tools = !omitTools && params.tools?.length\n ? toAnthropicTools(params.tools)\n : undefined\n const toolChoice = tools ? toAnthropicToolChoice(params.toolChoice) : undefined\n const onToken = this._options.onToken\n\n const stream = this._client.messages.stream({\n model,\n messages: toAnthropicMessages(params.messages),\n max_tokens: params.maxTokens ?? 1024,\n ...(params.systemPrompt !== undefined ? { system: params.systemPrompt } : {}),\n ...(params.temperature !== undefined ? { temperature: params.temperature } : {}),\n ...(params.stopSequences?.length ? { stop_sequences: params.stopSequences } : {}),\n ...(tools ? { tools } : {}),\n ...(toolChoice ? { tool_choice: toolChoice } : {}),\n })\n\n if (onToken) {\n stream.on('text', (text) => { onToken(text) })\n }\n\n const message = await stream.finalMessage()\n return buildResult(message)\n }\n }\n}\n","import type OpenAI from 'openai'\nimport type {\n CreateMessageRequestParams,\n SamplingMessage,\n Tool,\n ToolChoice,\n ToolUseContent,\n} from '@modelcontextprotocol/sdk/types'\nimport type { AnySamplingResult } from '../results.js'\nimport type { SamplingHandler } from '../handlers.js'\nimport type { SamplingAdapter, SamplingAdapterOptions } from './types.js'\nimport { resolveModel } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Message translation\n// ---------------------------------------------------------------------------\n\ntype OAIMessage = OpenAI.Chat.ChatCompletionMessageParam\n\nfunction toContentParts(\n content: SamplingMessage['content'],\n): string | OpenAI.Chat.ChatCompletionContentPart[] {\n const items = Array.isArray(content) ? content : [content]\n // Collapse single text block to a plain string for simplicity\n if (items.length === 1 && items[0].type === 'text') return items[0].text\n\n return items.flatMap((block): OpenAI.Chat.ChatCompletionContentPart[] => {\n if (block.type === 'text') {\n return [{ type: 'text', text: block.text }]\n } else if (block.type === 'image') {\n return [{\n type: 'image_url',\n image_url: { url: `data:${block.mimeType};base64,${block.data}` },\n }]\n }\n return []\n })\n}\n\nfunction toOpenAIMessages(\n messages: SamplingMessage[],\n systemPrompt: string | undefined,\n): OAIMessage[] {\n const out: OAIMessage[] = []\n\n if (systemPrompt) {\n out.push({ role: 'system', content: systemPrompt })\n }\n\n for (const m of messages) {\n const items = Array.isArray(m.content) ? m.content : [m.content]\n\n // tool_use blocks → assistant message with tool_calls\n const toolUseItems = items.filter((b) => b.type === 'tool_use')\n if (toolUseItems.length > 0) {\n out.push({\n role: 'assistant',\n tool_calls: toolUseItems.map((b) => {\n if (b.type !== 'tool_use') throw new Error('unreachable')\n return {\n id: b.id,\n type: 'function' as const,\n function: { name: b.name, arguments: JSON.stringify(b.input) },\n }\n }),\n })\n continue\n }\n\n // tool_result blocks → tool messages\n const toolResultItems = items.filter((b) => b.type === 'tool_result')\n if (toolResultItems.length > 0) {\n for (const b of toolResultItems) {\n if (b.type !== 'tool_result') continue\n const text = b.content\n .filter((c) => c.type === 'text')\n .map((c) => (c.type === 'text' ? c.text : ''))\n .join('\\n')\n out.push({ role: 'tool', tool_call_id: b.toolUseId, content: text })\n }\n continue\n }\n\n const role = m.role as 'user' | 'assistant'\n const content = toContentParts(m.content)\n if (role === 'user') {\n out.push({ role, content: content as OpenAI.Chat.ChatCompletionUserMessageParam['content'] })\n } else {\n out.push({ role, content: typeof content === 'string' ? content : '' })\n }\n }\n\n return out\n}\n\nfunction toOpenAITools(tools: Tool[]): OpenAI.Chat.ChatCompletionTool[] {\n return tools.map((t) => ({\n type: 'function' as const,\n function: {\n name: t.name,\n ...(t.description ? { description: t.description } : {}),\n parameters: t.inputSchema as OpenAI.FunctionParameters,\n },\n }))\n}\n\nfunction toOpenAIToolChoice(\n choice: ToolChoice | undefined,\n): OpenAI.Chat.ChatCompletionToolChoiceOption | undefined {\n if (!choice) return undefined\n if (choice.mode === 'required') return 'required'\n if (choice.mode === 'none') return 'none'\n return 'auto'\n}\n\n// ---------------------------------------------------------------------------\n// Response mapping\n// ---------------------------------------------------------------------------\n\nfunction mapFinishReason(reason: string | null | undefined): string {\n if (reason === 'stop') return 'endTurn'\n if (reason === 'length') return 'maxTokens'\n if (reason === 'tool_calls') return 'toolUse'\n return 'endTurn'\n}\n\nfunction buildResult(completion: OpenAI.Chat.ChatCompletion): AnySamplingResult {\n const choice = completion.choices[0]\n const stopReason = mapFinishReason(choice?.finish_reason)\n const model = completion.model\n\n if (stopReason === 'toolUse') {\n const calls = choice.message.tool_calls ?? []\n const content: ToolUseContent[] = calls.flatMap((tc) => {\n // tc is ChatCompletionMessageToolCall (union); filter to function type\n if (tc.type !== 'function') return []\n const fn = (tc as { type: 'function'; id: string; function: { name: string; arguments: string } }).function\n return [{\n type: 'tool_use' as const,\n id: tc.id,\n name: fn.name,\n input: JSON.parse(fn.arguments) as Record<string, unknown>,\n }]\n })\n return { role: 'assistant', model, stopReason, content }\n }\n\n const text = choice.message.content ?? ''\n return { role: 'assistant', model, stopReason, content: { type: 'text', text } }\n}\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\nexport class OpenAISamplingAdapter implements SamplingAdapter {\n private readonly _client: OpenAI\n private readonly _options: SamplingAdapterOptions & { defaultModel?: string }\n\n constructor(\n client: OpenAI,\n options?: SamplingAdapterOptions & { defaultModel?: string },\n ) {\n this._client = client\n this._options = options ?? {}\n }\n\n asHandler(): SamplingHandler {\n return async (params: CreateMessageRequestParams): Promise<AnySamplingResult> => {\n const model = resolveModel(\n params.modelPreferences,\n this._options.modelSelector,\n this._options.defaultModel ?? 'gpt-4o',\n )\n\n const omitTools = params.toolChoice?.mode === 'none'\n const tools = !omitTools && params.tools?.length\n ? toOpenAITools(params.tools)\n : undefined\n const toolChoice = tools ? toOpenAIToolChoice(params.toolChoice) : undefined\n const onToken = this._options.onToken\n\n const stream = this._client.chat.completions.stream({\n model,\n messages: toOpenAIMessages(params.messages, params.systemPrompt),\n max_completion_tokens: params.maxTokens ?? 1024,\n ...(params.temperature !== undefined ? { temperature: params.temperature } : {}),\n ...(params.stopSequences?.length ? { stop: params.stopSequences } : {}),\n ...(tools ? { tools } : {}),\n ...(toolChoice !== undefined ? { tool_choice: toolChoice } : {}),\n })\n\n if (onToken) {\n stream.on('content', (delta) => { onToken(delta) })\n }\n\n const completion = await stream.finalChatCompletion()\n return buildResult(completion)\n }\n }\n}\n","import type { GoogleGenAI } from '@google/genai'\nimport type {\n GenerateContentConfig,\n GenerateContentResponse,\n} from '@google/genai'\nimport type {\n CreateMessageRequestParams,\n SamplingMessage,\n Tool,\n ToolChoice,\n ToolUseContent,\n} from '@modelcontextprotocol/sdk/types'\nimport type { AnySamplingResult } from '../results.js'\nimport type { SamplingHandler } from '../handlers.js'\nimport type { SamplingAdapter, SamplingAdapterOptions } from './types.js'\nimport { resolveModel } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Title pruning\n// ---------------------------------------------------------------------------\n\n/**\n * Removes 'title' from all property definitions in a JSON Schema object.\n * Gemini emits MALFORMED_FUNCTION_CALL when property titles are present.\n */\nfunction pruneTitle(schema: Record<string, unknown>): Record<string, unknown> {\n const { title: _dropped, ...rest } = schema\n if (rest.properties && typeof rest.properties === 'object') {\n rest.properties = Object.fromEntries(\n Object.entries(rest.properties as Record<string, unknown>).map(([k, v]) => [\n k,\n pruneTitle(v as Record<string, unknown>),\n ]),\n )\n }\n return rest\n}\n\n// ---------------------------------------------------------------------------\n// Message translation\n// ---------------------------------------------------------------------------\n\nfunction toGeminiRole(role: 'user' | 'assistant'): 'user' | 'model' {\n return role === 'assistant' ? 'model' : 'user'\n}\n\n/** Build an id→name map from prior tool_use blocks so tool_result can reference by name. */\nfunction buildToolNameMap(messages: SamplingMessage[]): Map<string, string> {\n const map = new Map<string, string>()\n for (const m of messages) {\n const items = Array.isArray(m.content) ? m.content : [m.content]\n for (const b of items) {\n if (b.type === 'tool_use') map.set(b.id, b.name)\n }\n }\n return map\n}\n\nfunction toGeminiContents(\n messages: SamplingMessage[],\n toolNameById: Map<string, string>,\n): object[] {\n return messages.map((m) => {\n const items = Array.isArray(m.content) ? m.content : [m.content]\n const parts = items.flatMap((block): object[] => {\n if (block.type === 'text') {\n return [{ text: block.text }]\n } else if (block.type === 'image') {\n return [{ inlineData: { data: block.data, mimeType: block.mimeType } }]\n } else if (block.type === 'tool_use') {\n return [{ functionCall: { name: block.name, args: block.input } }]\n } else if (block.type === 'tool_result') {\n const name = toolNameById.get(block.toolUseId) ?? block.toolUseId\n const text = block.content\n .filter((c) => c.type === 'text')\n .map((c) => (c.type === 'text' ? c.text : ''))\n .join('\\n')\n return [{ functionResponse: { name, response: { content: text } } }]\n }\n return []\n })\n return { role: toGeminiRole(m.role as 'user' | 'assistant'), parts }\n })\n}\n\nfunction toGeminiFunctionDeclarations(tools: Tool[]): object[] {\n return tools.map((t) => ({\n name: t.name,\n ...(t.description ? { description: t.description } : {}),\n parameters: pruneTitle(t.inputSchema as Record<string, unknown>),\n }))\n}\n\nfunction toGeminiToolConfig(choice: ToolChoice | undefined): object | undefined {\n if (!choice) return undefined\n const mode =\n choice.mode === 'required' ? 'ANY' :\n choice.mode === 'none' ? 'NONE' :\n 'AUTO'\n return { functionCallingConfig: { mode } }\n}\n\n// ---------------------------------------------------------------------------\n// Response mapping\n// ---------------------------------------------------------------------------\n\nfunction buildResult(response: GenerateContentResponse, model: string): AnySamplingResult {\n const functionCalls = response.functionCalls\n\n if (functionCalls?.length) {\n const content: ToolUseContent[] = functionCalls.map((fc, i) => ({\n type: 'tool_use' as const,\n id: fc.id ?? `tool-${i}`,\n name: fc.name ?? '',\n input: (fc.args ?? {}) as Record<string, unknown>,\n }))\n return { role: 'assistant', model, stopReason: 'toolUse', content }\n }\n\n const candidate = response.candidates?.[0]\n const finishReason = candidate?.finishReason\n const stopReason =\n finishReason === 'MAX_TOKENS' ? 'maxTokens' :\n 'endTurn'\n\n const text = response.text ?? ''\n return { role: 'assistant', model, stopReason, content: { type: 'text', text } }\n}\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\nexport class GoogleSamplingAdapter implements SamplingAdapter {\n private readonly _client: GoogleGenAI\n private readonly _options: SamplingAdapterOptions & { defaultModel?: string }\n\n constructor(\n client: GoogleGenAI,\n options?: SamplingAdapterOptions & { defaultModel?: string },\n ) {\n this._client = client\n this._options = options ?? {}\n }\n\n asHandler(): SamplingHandler {\n return async (params: CreateMessageRequestParams): Promise<AnySamplingResult> => {\n const model = resolveModel(\n params.modelPreferences,\n this._options.modelSelector,\n this._options.defaultModel ?? 'gemini-2.0-flash',\n )\n\n const toolNameById = buildToolNameMap(params.messages)\n const contents = toGeminiContents(params.messages, toolNameById)\n const onToken = this._options.onToken\n\n const omitTools = params.toolChoice?.mode === 'none'\n const functionDeclarations = !omitTools && params.tools?.length\n ? toGeminiFunctionDeclarations(params.tools)\n : undefined\n const toolConfig = !omitTools ? toGeminiToolConfig(params.toolChoice) : undefined\n\n const config: GenerateContentConfig = {\n maxOutputTokens: params.maxTokens ?? 1024,\n ...(params.temperature !== undefined ? { temperature: params.temperature } : {}),\n ...(params.stopSequences?.length ? { stopSequences: params.stopSequences } : {}),\n ...(params.systemPrompt\n ? { systemInstruction: { parts: [{ text: params.systemPrompt }] } }\n : {}),\n ...(functionDeclarations ? { tools: [{ functionDeclarations }] } : {}),\n ...(toolConfig ? { toolConfig } : {}),\n }\n\n const stream = await this._client.models.generateContentStream({\n model,\n contents: contents as Parameters<typeof this._client.models.generateContentStream>[0]['contents'],\n config,\n })\n\n let lastChunk: GenerateContentResponse | undefined\n for await (const chunk of stream) {\n lastChunk = chunk\n if (onToken) {\n const text = chunk.text\n if (text) onToken(text)\n }\n }\n\n return buildResult(lastChunk!, model)\n }\n }\n}\n"],"mappings":"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","names":["resolve","SdkClient","CompatibilityCallToolResultSchema","CreateMessageRequestSchema","ElicitRequestSchema","ListRootsRequestSchema","LoggingMessageNotificationSchema","ResourceUpdatedNotificationSchema","serverName","SdkClient","CompatibilityCallToolResultSchema","LoggingMessageNotificationSchema","ResourceUpdatedNotificationSchema","CreateMessageRequestSchema","ElicitRequestSchema","ListRootsRequestSchema","buildResult","buildResult"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/handlers.ts","../src/client/auth.ts","../src/client/transports.ts","../src/client/client.ts","../src/client/multi-server.ts","../src/client/utils.ts","../src/client/sampling/types.ts","../src/client/sampling/generic.ts","../src/client/sampling/anthropic.ts","../src/client/sampling/openai.ts","../src/client/sampling/google.ts"],"sourcesContent":["import type {\n LoggingLevel,\n CreateMessageRequestParams,\n ElicitRequestParams,\n ElicitResult,\n Tool,\n Resource,\n Prompt,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { AnySamplingResult } from './results.js'\n\nexport type LogMessage = {\n level: LoggingLevel\n logger?: string\n data: unknown\n}\n\nexport type LogHandler = (message: LogMessage) => void | Promise<void>\n\nexport type ProgressHandler = (\n progress: number,\n total?: number,\n message?: string,\n) => void | Promise<void>\n\nexport type SamplingHandler = (\n params: CreateMessageRequestParams,\n) => AnySamplingResult | Promise<AnySamplingResult>\n\nexport type ElicitationHandler = (\n params: ElicitRequestParams,\n) => ElicitResult | Promise<ElicitResult>\n\nexport type ResourceUpdateHandler = (uri: string) => void | Promise<void>\n\n/**\n * Config for receiving server-initiated list-change notifications.\n * Set debounceMs: 0 in tests for instant delivery.\n */\nexport type ListChangedHandler<T> = {\n onChanged: (error: Error | null, items: T[] | null) => void | Promise<void>\n /** Whether to auto-fetch the updated list before calling onChanged. Default: true. */\n autoRefresh?: boolean\n /** Debounce window in ms. Default: 300. Set to 0 to disable. */\n debounceMs?: number\n}\n\nexport interface ClientHandlers {\n log?: LogHandler\n progress?: ProgressHandler\n sampling?: SamplingHandler\n elicitation?: ElicitationHandler\n onToolsListChanged?: ListChangedHandler<Tool>\n onResourcesListChanged?: ListChangedHandler<Resource>\n onPromptsListChanged?: ListChangedHandler<Prompt>\n}\n\nexport function defaultLogHandler(message: LogMessage): void {\n const prefix = message.logger ? `[${message.logger}]` : '[server]'\n const data =\n typeof message.data === 'string' ? message.data : JSON.stringify(message.data)\n const text = `${prefix} ${data}`\n const level = message.level\n if (level === 'debug') {\n console.debug(text)\n } else if (level === 'warning') {\n console.warn(text)\n } else if (\n level === 'error' ||\n level === 'critical' ||\n level === 'alert' ||\n level === 'emergency'\n ) {\n console.error(text)\n } else {\n console.info(text)\n }\n}\n\nexport function defaultProgressHandler(\n progress: number,\n total?: number,\n message?: string,\n): void {\n const pct = total != null ? ` (${Math.round((progress / total) * 100)}%)` : ''\n const msg = message ? ` — ${message}` : ''\n console.debug(\n `progress: ${progress}${total != null ? `/${total}` : ''}${pct}${msg}`,\n )\n}\n","import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js'\nimport type { OAuthDiscoveryState } from '@modelcontextprotocol/sdk/client/auth.js'\nimport type {\n OAuthClientInformationMixed,\n OAuthClientMetadata,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js'\nimport { spawn } from 'child_process'\nimport * as fs from 'fs/promises'\nimport * as http from 'http'\nimport { homedir } from 'os'\nimport { dirname, join } from 'path'\n\n// ---------------------------------------------------------------------------\n// OAuthToken — internal type used by ClientCredentials for expiry tracking.\n// Not the SDK's OAuthTokens: we track expires_at in milliseconds.\n// ---------------------------------------------------------------------------\n\nexport type OAuthToken = {\n access_token: string\n token_type?: string\n refresh_token?: string\n /** Unix timestamp in milliseconds (normalized internally). */\n expires_at?: number\n /** Seconds until expiry — used to compute expires_at on receipt. */\n expires_in?: number\n scope?: string\n}\n\n// ---------------------------------------------------------------------------\n// KeyValueStore — single persistence interface for all auth state\n// ---------------------------------------------------------------------------\n\nexport type KeyValueStore = {\n get(key: string): Promise<string | null>\n set(key: string, value: string): Promise<void>\n delete(key: string): Promise<void>\n}\n\n// ---------------------------------------------------------------------------\n// InMemoryStore\n// ---------------------------------------------------------------------------\n\nexport class InMemoryStore implements KeyValueStore {\n private readonly _map = new Map<string, string>()\n\n async get(key: string): Promise<string | null> {\n return this._map.get(key) ?? null\n }\n\n async set(key: string, value: string): Promise<void> {\n this._map.set(key, value)\n }\n\n async delete(key: string): Promise<void> {\n this._map.delete(key)\n }\n}\n\n// ---------------------------------------------------------------------------\n// FileTokenStorage\n// ---------------------------------------------------------------------------\n\nexport class FileTokenStorage implements KeyValueStore {\n private readonly _path: string\n\n constructor(path?: string) {\n this._path = path ?? join(homedir(), '.fastmcp', 'tokens.json')\n }\n\n private async _readAll(): Promise<Record<string, string>> {\n try {\n const raw = await fs.readFile(this._path, 'utf8')\n const parsed: unknown = JSON.parse(raw)\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, string>\n }\n return {}\n } catch {\n return {}\n }\n }\n\n private async _writeAll(data: Record<string, string>): Promise<void> {\n await fs.mkdir(dirname(this._path), { recursive: true })\n const tmp = `${this._path}.tmp`\n await fs.writeFile(tmp, JSON.stringify(data, null, 2), 'utf8')\n await fs.rename(tmp, this._path)\n }\n\n async get(key: string): Promise<string | null> {\n const data = await this._readAll()\n return data[key] ?? null\n }\n\n async set(key: string, value: string): Promise<void> {\n const data = await this._readAll()\n data[key] = value\n await this._writeAll(data)\n }\n\n async delete(key: string): Promise<void> {\n const data = await this._readAll()\n if (!(key in data)) return\n delete data[key]\n await this._writeAll(data)\n }\n}\n\n// ---------------------------------------------------------------------------\n// OAuth — implements OAuthClientProvider (authorization code + PKCE flow)\n// ---------------------------------------------------------------------------\n\nexport interface OAuthOptions {\n /** Pre-registered client ID. When set, Dynamic Client Registration is skipped. */\n clientId?: string\n /** Pre-registered client secret. */\n clientSecret?: string\n /** Requested OAuth scopes (space-separated string or array). */\n scopes?: string | string[]\n /** Client name used in Dynamic Client Registration. Default: \"FastMCP Client\". */\n clientName?: string\n /** Persistent key-value store for tokens, client info, and discovery state. Default: in-memory. */\n store?: KeyValueStore\n /**\n * Port for the local OAuth callback server. Default: 8765.\n * The port must be consistent across calls because it is registered as the\n * redirect_uri during Dynamic Client Registration.\n */\n callbackPort?: number\n /**\n * Override how the authorization URL is opened. When not provided the\n * system browser is launched. Inject a no-op or mock here for testing.\n */\n onRedirect?: (url: URL) => void | Promise<void>\n}\n\nexport class OAuth implements OAuthClientProvider {\n private _serverUrl = ''\n private readonly _clientId?: string\n private readonly _clientSecret?: string\n private readonly _scopes?: string\n private readonly _clientName: string\n private readonly _store: KeyValueStore\n private readonly _callbackPort: number\n private readonly _onRedirect?: (url: URL) => void | Promise<void>\n\n private _codeVerifier: string | undefined\n private _callbackPromise: Promise<string> | null = null\n private _callbackResolve: ((code: string) => void) | null = null\n private _callbackReject: ((err: Error) => void) | null = null\n private _callbackServer: http.Server | null = null\n private _actualCallbackPort: number | null = null\n\n constructor(options: OAuthOptions = {}) {\n this._clientId = options.clientId\n this._clientSecret = options.clientSecret\n this._scopes = Array.isArray(options.scopes)\n ? options.scopes.join(' ')\n : options.scopes\n this._clientName = options.clientName ?? 'FastMCP Client'\n this._store = options.store ?? new InMemoryStore()\n this._callbackPort = options.callbackPort ?? 8765\n this._onRedirect = options.onRedirect\n }\n\n /**\n * Binds the MCP server URL so that all storage keys are namespaced by it.\n * Called by Client before connecting.\n */\n _bind(serverUrl: string): void {\n this._serverUrl = serverUrl\n }\n\n // ---- OAuthClientProvider interface ----\n\n get redirectUrl(): string | URL {\n const port = this._actualCallbackPort ?? this._callbackPort\n return `http://localhost:${port}/callback`\n }\n\n get clientMetadata(): OAuthClientMetadata {\n const port = this._actualCallbackPort ?? this._callbackPort\n return {\n redirect_uris: [`http://localhost:${port}/callback`],\n token_endpoint_auth_method: this._clientSecret ? 'client_secret_post' : 'none',\n grant_types: ['authorization_code'],\n response_types: ['code'],\n client_name: this._clientName,\n ...(this._scopes ? { scope: this._scopes } : {}),\n }\n }\n\n async clientInformation(): Promise<OAuthClientInformationMixed | undefined> {\n if (this._clientId) {\n return {\n client_id: this._clientId,\n ...(this._clientSecret ? { client_secret: this._clientSecret } : {}),\n }\n }\n const raw = await this._store.get(this._key('client_info'))\n if (!raw) return undefined\n return JSON.parse(raw) as OAuthClientInformationMixed\n }\n\n async saveClientInformation(info: OAuthClientInformationMixed): Promise<void> {\n if (this._clientId) return // pre-registered — never overwrite with DCR response\n await this._store.set(this._key('client_info'), JSON.stringify(info))\n }\n\n async tokens(): Promise<OAuthTokens | undefined> {\n const raw = await this._store.get(this._key('tokens'))\n if (!raw) return undefined\n return JSON.parse(raw) as OAuthTokens\n }\n\n async saveTokens(tokens: OAuthTokens): Promise<void> {\n await this._store.set(this._key('tokens'), JSON.stringify(tokens))\n }\n\n async redirectToAuthorization(authorizationUrl: URL): Promise<void> {\n this._callbackPromise = new Promise<string>((resolve, reject) => {\n this._callbackResolve = resolve\n this._callbackReject = reject\n })\n // Suppress unhandled-rejection warnings — waitForCallback observes this via Promise.race\n this._callbackPromise.catch(() => {})\n await this._startCallbackServer()\n if (this._onRedirect) {\n await this._onRedirect(authorizationUrl)\n } else {\n openBrowser(authorizationUrl.toString())\n }\n }\n\n saveCodeVerifier(codeVerifier: string): void {\n this._codeVerifier = codeVerifier\n }\n\n codeVerifier(): string {\n if (this._codeVerifier === undefined) {\n throw new Error('No PKCE code verifier has been saved')\n }\n return this._codeVerifier\n }\n\n async invalidateCredentials(\n scope: 'all' | 'client' | 'tokens' | 'verifier' | 'discovery',\n ): Promise<void> {\n if (scope === 'all' || scope === 'tokens') {\n await this._store.delete(this._key('tokens'))\n }\n if (scope === 'all' || scope === 'client') {\n await this._store.delete(this._key('client_info'))\n }\n if (scope === 'all' || scope === 'verifier') {\n this._codeVerifier = undefined\n }\n if (scope === 'all' || scope === 'discovery') {\n await this._store.delete(this._key('discovery'))\n }\n }\n\n async saveDiscoveryState(state: OAuthDiscoveryState): Promise<void> {\n await this._store.set(this._key('discovery'), JSON.stringify(state))\n }\n\n async discoveryState(): Promise<OAuthDiscoveryState | undefined> {\n const raw = await this._store.get(this._key('discovery'))\n if (!raw) return undefined\n return JSON.parse(raw) as OAuthDiscoveryState\n }\n\n // ---- Internal helpers ----\n\n /**\n * Returns the actual port the callback server bound to.\n * Only populated after redirectToAuthorization() has been called.\n */\n get callbackServerPort(): number | null {\n return this._actualCallbackPort\n }\n\n /**\n * Waits for the OAuth authorization code to arrive via the callback server,\n * then stops the server and resolves with the code.\n *\n * Must be called after the UnauthorizedError thrown by connect() is caught.\n */\n async waitForCallback(timeoutMs = 5 * 60 * 1000): Promise<string> {\n if (!this._callbackPromise) {\n throw new Error('No pending OAuth callback — call redirectToAuthorization() first')\n }\n const timeout = new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error('OAuth callback timed out waiting for authorization')),\n timeoutMs,\n ),\n )\n try {\n return await Promise.race([this._callbackPromise, timeout])\n } finally {\n this._callbackPromise = null\n this._callbackResolve = null\n this._callbackReject = null\n this._stopCallbackServer()\n }\n }\n\n private _key(type: string): string {\n return `${this._serverUrl}/${type}`\n }\n\n private _startCallbackServer(): Promise<void> {\n if (this._callbackServer) return Promise.resolve()\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url ?? '/', `http://localhost`)\n const error = url.searchParams.get('error')\n if (error && this._callbackReject) {\n const description = url.searchParams.get('error_description') ?? error\n this._callbackReject(new Error(`OAuth authorization denied: ${description}`))\n res.writeHead(200, { 'content-type': 'text/html' })\n res.end(\n '<html><body><h1>Authorization denied</h1><p>You may close this tab.</p></body></html>',\n )\n return\n }\n const code = url.searchParams.get('code')\n if (code && this._callbackResolve) {\n this._callbackResolve(code)\n res.writeHead(200, { 'content-type': 'text/html' })\n res.end(\n '<html><body><h1>Authorization complete</h1><p>You may close this tab.</p></body></html>',\n )\n } else {\n res.writeHead(400)\n res.end('Missing code parameter')\n }\n })\n server.on('error', reject)\n server.listen(this._callbackPort, () => {\n const addr = server.address()\n if (addr && typeof addr !== 'string') {\n this._actualCallbackPort = addr.port\n }\n this._callbackServer = server\n resolve()\n })\n })\n }\n\n private _stopCallbackServer(): void {\n this._callbackServer?.close()\n this._callbackServer = null\n this._actualCallbackPort = null\n }\n}\n\n// ---------------------------------------------------------------------------\n// BearerAuth\n// ---------------------------------------------------------------------------\n\nexport class BearerAuth {\n private readonly _token: string\n\n constructor(token: string) {\n // Strip any existing Bearer prefix to avoid double-prepending\n this._token = token.startsWith('Bearer ') ? token.slice(7) : token\n }\n\n getHeaders(): Record<string, string> {\n return { Authorization: `Bearer ${this._token}` }\n }\n}\n\n// ---------------------------------------------------------------------------\n// ClientCredentials — OAuth 2.0 client credentials grant (machine-to-machine)\n// ---------------------------------------------------------------------------\n\nexport interface ClientCredentialsOptions {\n tokenEndpoint: string\n clientId: string\n clientSecret: string\n scope?: string\n store?: KeyValueStore\n /** How many seconds before expiry to proactively re-fetch. Default: 60. */\n refreshBufferSeconds?: number\n}\n\nconst DEFAULT_REFRESH_BUFFER_SECONDS = 60\n\nfunction normalizeToken(token: OAuthToken): OAuthToken {\n if (typeof token.expires_at === 'number' && token.expires_at > 0) {\n if (token.expires_at < 1e10) {\n return { ...token, expires_at: token.expires_at * 1000 }\n }\n return token\n }\n if (typeof token.expires_in === 'number' && token.expires_in > 0) {\n return { ...token, expires_at: Date.now() + token.expires_in * 1000 }\n }\n return token\n}\n\nfunction isExpiring(token: OAuthToken, bufferMs: number): boolean {\n if (token.expires_at == null) return false\n return token.expires_at - Date.now() <= bufferMs\n}\n\nexport class ClientCredentials {\n readonly kind = 'client_credentials' as const\n\n private readonly _tokenEndpoint: string\n private readonly _clientId: string\n private readonly _clientSecret: string\n private readonly _scope?: string\n private readonly _store: KeyValueStore\n private readonly _bufferMs: number\n private _fetchPromise: Promise<OAuthToken> | null = null\n\n constructor(options: ClientCredentialsOptions) {\n this._tokenEndpoint = options.tokenEndpoint\n this._clientId = options.clientId\n this._clientSecret = options.clientSecret\n this._scope = options.scope\n this._store = options.store ?? new InMemoryStore()\n this._bufferMs =\n (options.refreshBufferSeconds ?? DEFAULT_REFRESH_BUFFER_SECONDS) * 1000\n }\n\n async getHeaders(): Promise<Record<string, string>> {\n const token = await this._getValidToken()\n const type = token.token_type?.trim() || 'Bearer'\n return { Authorization: `${type} ${token.access_token}` }\n }\n\n private get _tokenKey(): string {\n return `${this._tokenEndpoint}/token`\n }\n\n private async _getValidToken(): Promise<OAuthToken> {\n const raw = await this._store.get(this._tokenKey)\n if (raw) {\n const normalized = normalizeToken(JSON.parse(raw) as OAuthToken)\n if (!isExpiring(normalized, this._bufferMs)) return normalized\n }\n return await this._doFetch()\n }\n\n private async _doFetch(): Promise<OAuthToken> {\n this._fetchPromise ??= (async () => {\n const params = new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: this._clientId,\n client_secret: this._clientSecret,\n })\n if (this._scope) params.set('scope', this._scope)\n\n const response = await fetch(this._tokenEndpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: params.toString(),\n })\n\n if (!response.ok) {\n const detail = await response.text().catch(() => '')\n throw new Error(\n `ClientCredentials token fetch failed (${response.status})${detail ? `: ${detail}` : ''}`,\n )\n }\n\n const data = (await response.json()) as Partial<OAuthToken>\n if (!data.access_token) {\n throw new Error('ClientCredentials token response missing access_token')\n }\n\n const token = normalizeToken(data as OAuthToken)\n await this._store.set(this._tokenKey, JSON.stringify(token))\n return token\n })().finally(() => {\n this._fetchPromise = null\n })\n\n return this._fetchPromise\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction openBrowser(url: string): void {\n if (process.platform === 'win32') {\n spawn('cmd', ['/c', 'start', '', url], { detached: true, stdio: 'ignore' })\n } else if (process.platform === 'darwin') {\n spawn('open', [url], { detached: true, stdio: 'ignore' })\n } else {\n spawn('xdg-open', [url], { detached: true, stdio: 'ignore' })\n }\n}\n","import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js'\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\nimport { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'\nimport { OAuth, BearerAuth, type ClientCredentials } from './auth.js'\n\n// ---------------------------------------------------------------------------\n// McpServerLike — structural interface for in-process servers.\n// Intentionally loose: avoids importing from the server module.\n// ---------------------------------------------------------------------------\n\nexport interface McpServerLike {\n connect(transport: Transport): Promise<void>\n}\n\nfunction isMcpServerLike(value: unknown): value is McpServerLike {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'connect' in value &&\n typeof (value as Record<string, unknown>).connect === 'function'\n )\n}\n\n// ---------------------------------------------------------------------------\n// MCP config object — { mcpServers: { name: { url | command, ... } } }\n// ---------------------------------------------------------------------------\n\nexport type McpServerEntry =\n | { url: string; headers?: Record<string, string>; auth?: BearerAuth | OAuth | ClientCredentials | string }\n | { command: string; args?: string[]; env?: Record<string, string>; auth?: BearerAuth | OAuth | ClientCredentials | string }\n\n/** Values accepted in mcpServers: either a config object or an in-process server. */\nexport type McpServerValue = McpServerEntry | McpServerLike\n\nexport type McpConfig = {\n mcpServers: Record<string, McpServerValue>\n}\n\nfunction isMcpConfig(value: unknown): value is McpConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'mcpServers' in value &&\n typeof (value as McpConfig).mcpServers === 'object' &&\n (value as McpConfig).mcpServers !== null\n )\n}\n\n// ---------------------------------------------------------------------------\n// StdioTransport — configuration object for stdio subprocess connections.\n// Separate from the SDK's StdioClientTransport so callers work with a plain\n// config value rather than a live transport instance.\n// ---------------------------------------------------------------------------\n\nexport class StdioTransport {\n readonly command: string\n readonly args: string[]\n readonly env?: Record<string, string>\n readonly cwd?: string\n\n constructor(\n command: string,\n args: string[] = [],\n options?: { env?: Record<string, string>; cwd?: string },\n ) {\n this.command = command\n this.args = args\n this.env = options?.env\n this.cwd = options?.cwd\n }\n}\n\n// ---------------------------------------------------------------------------\n// ClientTransportInput — what the Client constructor accepts\n// ---------------------------------------------------------------------------\n\nexport type ClientTransportInput =\n | string // HTTP/HTTPS URL → auto-detect Streamable HTTP or SSE\n | McpServerLike // in-process server instance\n | McpConfig // { mcpServers: { ... } } config object\n | StdioTransport // explicit stdio subprocess config\n | Transport // pass-through — any SDK Transport (advanced)\n\n// ---------------------------------------------------------------------------\n// Resolved transport — what Client.connect() receives\n// ---------------------------------------------------------------------------\n\nexport type ResolvedTransport = {\n transport: Transport\n /**\n * Called before sdkClient.connect(transport). Used for in-process servers\n * that must be connected to their side of the InMemoryTransport first.\n */\n beforeConnect?: () => Promise<void>\n}\n\n// ---------------------------------------------------------------------------\n// Auth header injection helpers\n// ---------------------------------------------------------------------------\n\nfunction normalizeHeaders(headers: RequestInit['headers']): Record<string, string> {\n if (!headers) return {}\n if (headers instanceof Headers) return Object.fromEntries(headers.entries())\n if (Array.isArray(headers)) return Object.fromEntries(headers as string[][])\n return { ...(headers as Record<string, string>) }\n}\n\nfunction isAsyncAuth(\n auth: BearerAuth | OAuth | ClientCredentials,\n): auth is ClientCredentials {\n // Only ClientCredentials uses async per-request injection.\n // OAuth is now an OAuthClientProvider and is passed directly to the transport.\n return 'kind' in auth\n}\n\ntype HttpTransportOptions = {\n requestInit?: RequestInit\n fetch?: (url: string | URL, init?: RequestInit) => Promise<Response>\n eventSourceInit?: Record<string, unknown>\n authProvider?: OAuthClientProvider\n}\n\nfunction buildHttpOptions(\n auth: BearerAuth | OAuth | ClientCredentials | undefined,\n extraHeaders: Record<string, string> = {},\n): HttpTransportOptions {\n const hasExtra = Object.keys(extraHeaders).length > 0\n\n if (!auth && !hasExtra) return {}\n\n // OAuth implements OAuthClientProvider — hand it to the SDK transport which\n // handles the full auth flow (discovery, DCR, PKCE, token refresh, 401 retry).\n if (auth instanceof OAuth) {\n const opts: HttpTransportOptions = { authProvider: auth }\n // Extra headers are injected via requestInit (not Authorization — that's\n // managed by the authProvider).\n if (hasExtra) opts.requestInit = { headers: extraHeaders }\n return opts\n }\n\n if (auth && isAsyncAuth(auth)) {\n // ClientCredentials: inject token per-request via a custom fetch wrapper.\n const customFetch = async (\n url: string | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const authHeaders = await auth.getHeaders()\n return fetch(url, {\n ...init,\n headers: {\n ...authHeaders,\n ...extraHeaders,\n ...normalizeHeaders(init?.headers),\n },\n })\n }\n return { fetch: customFetch }\n }\n\n // Static auth (BearerAuth) or extra headers only.\n const staticHeaders: Record<string, string> = {\n ...(auth ? auth.getHeaders() : {}),\n ...extraHeaders,\n }\n return {\n requestInit: { headers: staticHeaders },\n // Also exposed for SSE's EventSource connection (eventsource npm pkg\n // accepts headers in EventSourceInit, unlike the browser API).\n eventSourceInit: { headers: staticHeaders },\n }\n}\n\n// ---------------------------------------------------------------------------\n// URL → SDK transport\n// ---------------------------------------------------------------------------\n\nfunction urlToTransport(\n url: URL,\n auth: BearerAuth | OAuth | ClientCredentials | undefined,\n extraHeaders: Record<string, string> = {},\n): Transport {\n const { requestInit, fetch: customFetch, eventSourceInit, authProvider } =\n buildHttpOptions(auth, extraHeaders)\n\n const segments = url.pathname.split('/')\n const isSSE = segments.includes('sse') || url.pathname.endsWith('/sse')\n\n if (isSSE) {\n return new SSEClientTransport(url, {\n ...(authProvider ? { authProvider } : {}),\n ...(requestInit ? { requestInit } : {}),\n ...(eventSourceInit ? { eventSourceInit } : {}),\n ...(customFetch ? { fetch: customFetch } : {}),\n })\n }\n\n return new StreamableHTTPClientTransport(url, {\n ...(authProvider ? { authProvider } : {}),\n ...(requestInit ? { requestInit } : {}),\n ...(customFetch ? { fetch: customFetch } : {}),\n })\n}\n\n// ---------------------------------------------------------------------------\n// resolveEntryTransport — resolves a single McpServerEntry to a transport.\n// Used by MultiServerClient to connect to each server independently.\n// ---------------------------------------------------------------------------\n\nexport function resolveEntryTransport(\n entry: McpServerValue,\n auth?: BearerAuth | OAuth | ClientCredentials,\n): ResolvedTransport {\n // In-process server (McpServerLike: has connect(transport)).\n if (isMcpServerLike(entry)) {\n const [serverSide, clientSide] = InMemoryTransport.createLinkedPair()\n return {\n transport: clientSide,\n beforeConnect: () => entry.connect(serverSide),\n }\n }\n\n const entryAuth = resolveEntryAuth(entry.auth) ?? auth\n\n if ('url' in entry) {\n const url = new URL(entry.url)\n const extraHeaders = entry.headers ?? {}\n return { transport: urlToTransport(url, entryAuth, extraHeaders) }\n }\n\n const cmd = entry as { command: string; args?: string[]; env?: Record<string, string> }\n return {\n transport: new StdioClientTransport({\n command: cmd.command,\n args: cmd.args,\n env: cmd.env,\n }),\n }\n}\n\nfunction resolveEntryAuth(\n auth: BearerAuth | OAuth | ClientCredentials | string | undefined,\n): BearerAuth | OAuth | ClientCredentials | undefined {\n if (!auth) return undefined\n if (typeof auth === 'string') return new BearerAuth(auth)\n return auth\n}\n\n// ---------------------------------------------------------------------------\n// resolveTransport — internal; used by Client.connect()\n// ---------------------------------------------------------------------------\n\nexport function resolveTransport(\n input: ClientTransportInput,\n auth?: BearerAuth | OAuth | ClientCredentials,\n): ResolvedTransport {\n // 1. Our StdioTransport config class (check before the duck-type checks below).\n if (input instanceof StdioTransport) {\n return {\n transport: new StdioClientTransport({\n command: input.command,\n args: input.args,\n env: input.env,\n cwd: input.cwd,\n }),\n }\n }\n\n // 2. URL string → auto-detect HTTP transport.\n if (typeof input === 'string') {\n const url = new URL(input)\n return { transport: urlToTransport(url, auth) }\n }\n\n // 3. Pass-through SDK Transport (has the Transport interface: start/close/send).\n if (\n typeof input === 'object' &&\n input !== null &&\n 'start' in input &&\n typeof (input as unknown as Record<string, unknown>).start === 'function'\n ) {\n return { transport: input as Transport }\n }\n\n // 4. MCP config object { mcpServers: { ... } } — use the first entry.\n if (isMcpConfig(input)) {\n const entries = Object.entries(input.mcpServers)\n if (entries.length === 0) throw new Error('mcpServers config is empty')\n const [, entry] = entries[0]!\n return resolveEntryTransport(entry, auth)\n }\n\n // 5. In-process server (McpServerLike: has connect(transport)).\n if (isMcpServerLike(input)) {\n const [serverSide, clientSide] = InMemoryTransport.createLinkedPair()\n return {\n transport: clientSide,\n beforeConnect: () => input.connect(serverSide),\n }\n }\n\n throw new Error(\n 'Unrecognized transport input: expected a URL string, FastMCP server instance, ' +\n 'mcpServers config object, StdioTransport, or SDK Transport',\n )\n}\n","import { resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\n\nimport { Client as SdkClient } from '@modelcontextprotocol/sdk/client'\nimport { UnauthorizedError } from '@modelcontextprotocol/sdk/client/auth.js'\nimport {\n CompatibilityCallToolResultSchema,\n CreateMessageRequestSchema,\n ElicitRequestSchema,\n ListRootsRequestSchema,\n LoggingMessageNotificationSchema,\n ResourceUpdatedNotificationSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { RequestOptions as SdkRequestOptions } from '@modelcontextprotocol/sdk/shared/protocol.js'\n\nimport { BearerAuth, OAuth } from './auth.js'\nimport type { ClientCredentials } from './auth.js'\nimport type { ClientHandlers, ListChangedHandler, ProgressHandler, ResourceUpdateHandler } from './handlers.js'\nimport { defaultLogHandler, defaultProgressHandler } from './handlers.js'\nimport type { CallToolOptions, IClient, RequestOptions } from './interfaces.js'\nimport type {\n CallToolResult,\n CompletionResult,\n ContentBlock,\n GetPromptResult,\n LoggingLevel,\n Prompt,\n Resource,\n ResourceContents,\n ResourceTemplate,\n Root,\n Tool,\n} from './results.js'\nimport type { ClientTransportInput, McpConfig } from './transports.js'\nimport { resolveTransport } from './transports.js'\nimport type { MultiServerOptions } from './multi-server.js'\nimport { MultiServerClient } from './multi-server.js'\n\n// ---------------------------------------------------------------------------\n// Error type\n// ---------------------------------------------------------------------------\n\nexport class ToolCallError extends Error {\n readonly content: ContentBlock[]\n\n constructor(message: string, content: ContentBlock[]) {\n super(message)\n this.name = 'ToolCallError'\n this.content = content\n }\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ClientDefaultOptions {\n /** Global fallback timeout in seconds for all requests. */\n timeout?: number\n tool?: { timeout?: number }\n resource?: { timeout?: number }\n prompt?: { timeout?: number }\n}\n\n/** A single element of the roots option: a URI string or a full Root object. */\nexport type RootInput = string | Root\n\n/**\n * Static list of roots, or an async callback invoked on each roots/list request.\n * URI strings are normalised to file:// URIs automatically; relative paths are\n * resolved against process.cwd().\n */\nexport type RootsValue = RootInput[] | (() => RootInput[] | Promise<RootInput[]>)\n\nexport interface ClientOptions {\n /**\n * Authentication to attach to HTTP requests.\n * A plain string is treated as a Bearer token.\n */\n auth?: BearerAuth | OAuth | ClientCredentials | string\n handlers?: ClientHandlers\n /**\n * Filesystem roots to advertise to the server.\n * Accepts a static array of strings / Root objects, or an async callback\n * invoked on each roots/list request (useful for dynamic root sets).\n */\n roots?: RootsValue\n /**\n * When true (default), the MCP initialize handshake is performed\n * automatically inside connect().\n */\n autoInitialize?: boolean\n defaultOptions?: ClientDefaultOptions\n}\n\n// ---------------------------------------------------------------------------\n// Client\n// ---------------------------------------------------------------------------\n\ntype OptionalHandlerKeys =\n | 'sampling'\n | 'elicitation'\n | 'onToolsListChanged'\n | 'onResourcesListChanged'\n | 'onPromptsListChanged'\n\nexport class Client implements IClient {\n private _sdkClient: SdkClient | null = null\n private _refCount = 0\n private _connectPromise: Promise<void> | null = null\n private readonly _resourceSubscriptions = new Map<string, ResourceUpdateHandler>()\n\n private readonly _input: ClientTransportInput\n private readonly _auth: BearerAuth | OAuth | ClientCredentials | undefined\n private readonly _handlers: Required<Omit<ClientHandlers, OptionalHandlerKeys>> &\n Pick<ClientHandlers, OptionalHandlerKeys>\n private readonly _roots: (() => Promise<Root[]>) | undefined\n private readonly _autoInitialize: boolean\n private readonly _defaultOptions: ClientDefaultOptions\n\n constructor(input: ClientTransportInput, options?: ClientOptions) {\n this._input = input\n this._auth = resolveAuth(options?.auth)\n this._handlers = {\n log: options?.handlers?.log ?? defaultLogHandler,\n progress: options?.handlers?.progress ?? defaultProgressHandler,\n sampling: options?.handlers?.sampling,\n elicitation: options?.handlers?.elicitation,\n onToolsListChanged: options?.handlers?.onToolsListChanged,\n onResourcesListChanged: options?.handlers?.onResourcesListChanged,\n onPromptsListChanged: options?.handlers?.onPromptsListChanged,\n }\n this._roots = options?.roots ? normalizeRootsOption(options.roots) : undefined\n this._autoInitialize = options?.autoInitialize ?? true\n this._defaultOptions = options?.defaultOptions ?? {}\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n async connect(): Promise<void> {\n this._refCount++\n\n // If another concurrent connect() is in progress, wait for it.\n if (this._connectPromise) {\n await this._connectPromise\n return\n }\n\n // Already connected — just bump the ref count.\n if (this._sdkClient) return\n\n this._connectPromise = this._doConnect().finally(() => {\n this._connectPromise = null\n })\n\n try {\n await this._connectPromise\n } catch (err) {\n this._refCount = Math.max(0, this._refCount - 1)\n throw err\n }\n }\n\n private async _doConnect(): Promise<void> {\n const sdkClient = new SdkClient(\n { name: 'fastmcp-ts', version: '1.0.0' },\n {\n capabilities: this._buildCapabilities(),\n listChanged: this._buildListChangedConfig(),\n },\n )\n\n this._registerHandlers(sdkClient)\n\n const { transport, beforeConnect } = resolveTransport(this._input, this._auth)\n\n // Bind the server URL into the OAuth provider before the SDK transport\n // reads clientMetadata or tokens() so storage keys are properly namespaced.\n if (this._auth instanceof OAuth) {\n const serverUrl = this._extractServerUrl()\n if (serverUrl) this._auth._bind(serverUrl)\n }\n\n if (beforeConnect) await beforeConnect()\n\n try {\n await sdkClient.connect(transport)\n } catch (err) {\n if (err instanceof UnauthorizedError && this._auth instanceof OAuth) {\n // The SDK opened the browser and is waiting for the user to authorize.\n // Wait for the callback server to receive the code, then finish auth\n // and retry the connection.\n const code = await this._auth.waitForCallback()\n if (\n 'finishAuth' in transport &&\n typeof (transport as Record<string, unknown>).finishAuth === 'function'\n ) {\n await (transport as { finishAuth(code: string): Promise<void> }).finishAuth(\n code,\n )\n }\n await sdkClient.connect(transport)\n } else {\n throw err\n }\n }\n\n this._sdkClient = sdkClient\n }\n\n private _extractServerUrl(): string | undefined {\n const input = this._input\n if (typeof input === 'string') return input\n if (\n typeof input === 'object' &&\n input !== null &&\n 'mcpServers' in input\n ) {\n const entries = Object.entries(\n (input as { mcpServers: Record<string, { url?: string }> }).mcpServers,\n )\n if (entries.length > 0) {\n const [, entry] = entries[0]!\n if (entry && 'url' in entry && typeof entry.url === 'string') {\n return entry.url\n }\n }\n }\n return undefined\n }\n\n async close(): Promise<void> {\n this._refCount = Math.max(0, this._refCount - 1)\n if (this._refCount > 0) return\n\n const sdk = this._sdkClient\n this._sdkClient = null\n if (sdk) await sdk.close()\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close()\n }\n\n isConnected(): boolean {\n return this._sdkClient !== null\n }\n\n /** Creates a connected MultiServerClient when given a multi-entry McpConfig. */\n static async connect(input: McpConfig, options?: MultiServerOptions): Promise<MultiServerClient>\n /** Creates a connected Client for a single-server transport. Use with `await using` for automatic cleanup. */\n static async connect(input: ClientTransportInput, options?: ClientOptions): Promise<Client>\n static async connect(\n input: ClientTransportInput | McpConfig,\n options?: ClientOptions | MultiServerOptions,\n ): Promise<Client | MultiServerClient> {\n if (\n typeof input === 'object' &&\n input !== null &&\n 'mcpServers' in input &&\n Object.keys((input as McpConfig).mcpServers).length > 1\n ) {\n return MultiServerClient.connect(input as McpConfig, options as MultiServerOptions)\n }\n const client = new Client(input as ClientTransportInput, options as ClientOptions)\n await client.connect()\n return client\n }\n\n // -------------------------------------------------------------------------\n // Core protocol\n // -------------------------------------------------------------------------\n\n async ping(options?: RequestOptions): Promise<boolean> {\n await this._sdk().ping(this._toSdkOptions(options))\n return true\n }\n\n // -------------------------------------------------------------------------\n // Tools (IToolsClient)\n // -------------------------------------------------------------------------\n\n async listTools(options?: RequestOptions): Promise<Tool[]> {\n const result = await this._sdk().listTools(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.tool?.timeout),\n )\n return result.tools as Tool[]\n }\n\n async callTool<TData = unknown>(\n name: string,\n args?: Record<string, unknown>,\n options?: CallToolOptions,\n ): Promise<CallToolResult<TData>> {\n const raw = await this.callToolRaw<TData>(name, args, options)\n if (raw.isError) {\n const message =\n (raw.content as Array<{ type: string; text?: string }>)\n .filter((c) => c.type === 'text')\n .map((c) => c.text ?? '')\n .join('\\n') || 'Tool returned an error'\n throw new ToolCallError(message, raw.content)\n }\n return raw\n }\n\n /** Returns the full result including isError without throwing. */\n async callToolRaw<TData = unknown>(\n name: string,\n args?: Record<string, unknown>,\n options?: CallToolOptions,\n ): Promise<CallToolResult<TData>> {\n const sdkOptions = this._toSdkOptions(\n options,\n options?.onProgress,\n this._defaultOptions.tool?.timeout,\n )\n const result = await this._sdk().callTool(\n { name, arguments: args ?? {} },\n CompatibilityCallToolResultSchema,\n sdkOptions,\n )\n return {\n content: result.content as ContentBlock[],\n structuredContent: (result.structuredContent as TData | undefined) ?? null,\n isError: result.isError === true,\n }\n }\n\n // -------------------------------------------------------------------------\n // Resources (IResourcesClient)\n // -------------------------------------------------------------------------\n\n async listResources(options?: RequestOptions): Promise<Resource[]> {\n const result = await this._sdk().listResources(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return result.resources as Resource[]\n }\n\n async listResourceTemplates(options?: RequestOptions): Promise<ResourceTemplate[]> {\n const result = await this._sdk().listResourceTemplates(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return result.resourceTemplates as ResourceTemplate[]\n }\n\n async readResource(uri: string, options?: RequestOptions): Promise<ResourceContents[]> {\n const result = await this._sdk().readResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return result.contents as ResourceContents[]\n }\n\n /** Returns the raw SDK ReadResourceResult without unwrapping. */\n async readResourceRaw(uri: string, options?: RequestOptions) {\n return this._sdk().readResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n }\n\n async subscribeResource(\n uri: string,\n handler: ResourceUpdateHandler,\n options?: RequestOptions,\n ): Promise<void> {\n this._resourceSubscriptions.set(uri, handler)\n await this._sdk().subscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n }\n\n async unsubscribeResource(uri: string, options?: RequestOptions): Promise<void> {\n this._resourceSubscriptions.delete(uri)\n await this._sdk().unsubscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n }\n\n // -------------------------------------------------------------------------\n // Prompts (IPromptsClient)\n // -------------------------------------------------------------------------\n\n async listPrompts(options?: RequestOptions): Promise<Prompt[]> {\n const result = await this._sdk().listPrompts(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.prompt?.timeout),\n )\n return result.prompts as Prompt[]\n }\n\n async getPrompt(\n name: string,\n args?: Record<string, string>,\n options?: RequestOptions,\n ): Promise<GetPromptResult> {\n const result = await this._sdk().getPrompt(\n { name, arguments: args },\n this._toSdkOptions(options, undefined, this._defaultOptions.prompt?.timeout),\n )\n return result as GetPromptResult\n }\n\n // -------------------------------------------------------------------------\n // Completion\n // -------------------------------------------------------------------------\n\n async complete(\n ref: { type: 'ref/prompt'; name: string } | { type: 'ref/resource'; uri: string },\n argument: { name: string; value: string },\n context?: { arguments?: Record<string, string> },\n options?: RequestOptions,\n ): Promise<CompletionResult> {\n const result = await this._sdk().complete(\n { ref, argument, ...(context ? { context } : {}) },\n this._toSdkOptions(options),\n )\n return result.completion as CompletionResult\n }\n\n // -------------------------------------------------------------------------\n // Logging\n // -------------------------------------------------------------------------\n\n async setLogLevel(level: LoggingLevel, options?: RequestOptions): Promise<void> {\n await this._sdk().setLoggingLevel(level, this._toSdkOptions(options))\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private _sdk(): SdkClient {\n if (!this._sdkClient) {\n throw new Error('Client is not connected. Call connect() first.')\n }\n return this._sdkClient\n }\n\n private _toSdkOptions(\n options?: RequestOptions,\n overrideProgress?: ProgressHandler,\n scopedTimeoutSeconds?: number,\n ): SdkRequestOptions {\n const timeoutSeconds =\n options?.timeout ?? scopedTimeoutSeconds ?? this._defaultOptions.timeout\n const progressHandler = overrideProgress ?? this._handlers.progress\n\n const sdkOptions: SdkRequestOptions = {}\n if (timeoutSeconds != null) sdkOptions.timeout = timeoutSeconds * 1000\n if (options?.signal) sdkOptions.signal = options.signal\n if (progressHandler) {\n sdkOptions.onprogress = ({ progress, total, message }) => {\n void progressHandler(progress, total, message)\n }\n }\n return sdkOptions\n }\n\n private _buildCapabilities() {\n return {\n ...(this._handlers.sampling ? { sampling: { tools: {} } } : {}),\n ...(this._handlers.elicitation ? { elicitation: {} } : {}),\n ...(this._roots ? { roots: { listChanged: true } } : {}),\n }\n }\n\n private _buildListChangedConfig() {\n const { onToolsListChanged, onResourcesListChanged, onPromptsListChanged } = this._handlers\n if (!onToolsListChanged && !onResourcesListChanged && !onPromptsListChanged) return undefined\n\n const adapt = <T>(h: ListChangedHandler<T>) => ({\n onChanged: (err: Error | null, items: T[] | null) => { void h.onChanged(err, items) },\n ...(h.autoRefresh !== undefined ? { autoRefresh: h.autoRefresh } : {}),\n ...(h.debounceMs !== undefined ? { debounceMs: h.debounceMs } : {}),\n })\n\n return {\n ...(onToolsListChanged ? { tools: adapt(onToolsListChanged) } : {}),\n ...(onResourcesListChanged ? { resources: adapt(onResourcesListChanged) } : {}),\n ...(onPromptsListChanged ? { prompts: adapt(onPromptsListChanged) } : {}),\n }\n }\n\n private _registerHandlers(sdk: SdkClient): void {\n // Log notifications from the server\n sdk.setNotificationHandler(LoggingMessageNotificationSchema, (notification) => {\n void this._handlers.log({\n level: notification.params.level,\n logger: notification.params.logger ?? undefined,\n data: notification.params.data,\n })\n })\n\n // Resource update notifications (for active subscriptions)\n sdk.setNotificationHandler(ResourceUpdatedNotificationSchema, (notification) => {\n const handler = this._resourceSubscriptions.get(notification.params.uri)\n if (handler) void handler(notification.params.uri)\n })\n\n // Sampling: server requests an LLM completion from the client\n if (this._handlers.sampling) {\n const samplingHandler = this._handlers.sampling\n sdk.setRequestHandler(CreateMessageRequestSchema, async (request) => {\n return samplingHandler(request.params)\n })\n }\n\n // Elicitation: server requests structured user input\n if (this._handlers.elicitation) {\n const elicitationHandler = this._handlers.elicitation\n sdk.setRequestHandler(ElicitRequestSchema, async (request) => {\n return elicitationHandler(request.params)\n })\n }\n\n // Roots: server requests the client's accessible filesystem roots\n if (this._roots) {\n const getRoots = this._roots\n sdk.setRequestHandler(ListRootsRequestSchema, async () => ({\n roots: await getRoots(),\n }))\n }\n }\n\n // -------------------------------------------------------------------------\n // Roots\n // -------------------------------------------------------------------------\n\n /**\n * Notify the connected server that the client's roots list has changed.\n * The server should re-issue a roots/list request to get the updated list.\n */\n async notifyRootsChanged(): Promise<void> {\n await this._sdk().sendRootsListChanged()\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveAuth(\n auth: BearerAuth | OAuth | ClientCredentials | string | undefined,\n): BearerAuth | OAuth | ClientCredentials | undefined {\n if (!auth) return undefined\n if (typeof auth === 'string') return new BearerAuth(auth)\n return auth\n}\n\nfunction normalizeRootsOption(roots: RootsValue): () => Promise<Root[]> {\n if (typeof roots === 'function') {\n return async () => (await roots()).map(normalizeRootInput)\n }\n const normalized = roots.map(normalizeRootInput)\n return () => Promise.resolve(normalized)\n}\n\nfunction normalizeRootInput(input: RootInput): Root {\n if (typeof input === 'string') return { uri: normalizeRootUri(input) }\n return { ...input, uri: normalizeRootUri(input.uri) }\n}\n\nfunction normalizeRootUri(input: string): string {\n if (input.startsWith('file://')) return input\n return pathToFileURL(resolve(input)).href\n}\n","import { Client as SdkClient } from '@modelcontextprotocol/sdk/client'\nimport {\n CompatibilityCallToolResultSchema,\n LoggingMessageNotificationSchema,\n ResourceUpdatedNotificationSchema,\n CreateMessageRequestSchema,\n ElicitRequestSchema,\n ListRootsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { LoggingLevel } from '@modelcontextprotocol/sdk/types.js'\n\nimport type { BearerAuth, OAuth, ClientCredentials } from './auth.js'\nimport type { ClientHandlers, LogHandler, ProgressHandler, ResourceUpdateHandler } from './handlers.js'\nimport { defaultLogHandler, defaultProgressHandler } from './handlers.js'\nimport type { CallToolOptions, IClient, RequestOptions } from './interfaces.js'\nimport type {\n CallToolResult,\n CompletionResult,\n ContentBlock,\n GetPromptResult,\n Prompt,\n Resource,\n ResourceContents,\n ResourceTemplate,\n Tool,\n} from './results.js'\nimport type { McpConfig, McpServerValue } from './transports.js'\nimport { resolveEntryTransport } from './transports.js'\nimport type { ClientDefaultOptions } from './client.js'\nimport { ToolCallError } from './client.js'\nimport type { RequestOptions as SdkRequestOptions } from '@modelcontextprotocol/sdk/shared/protocol.js'\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface MultiServerOptions {\n handlers?: ClientHandlers\n /** file:// URIs to advertise to all servers as accessible roots. */\n roots?: string[]\n defaultOptions?: ClientDefaultOptions\n}\n\n// ---------------------------------------------------------------------------\n// MultiServerClient\n// ---------------------------------------------------------------------------\n\nexport class MultiServerClient implements IClient {\n private _clients: Map<string, SdkClient> = new Map()\n private _connectPromise: Promise<void> | null = null\n private _connected = false\n\n /** URI (or namespaced template URI) → server name, populated by list calls */\n private _uriMap: Map<string, string> = new Map()\n\n private readonly _config: McpConfig\n private readonly _handlers: {\n log: LogHandler\n progress: ProgressHandler\n sampling?: ClientHandlers['sampling']\n elicitation?: ClientHandlers['elicitation']\n }\n private readonly _roots: string[] | undefined\n private readonly _defaultOptions: ClientDefaultOptions\n private _resourceSubscriptions: Map<string, ResourceUpdateHandler> = new Map()\n\n constructor(config: McpConfig, options?: MultiServerOptions) {\n this._config = config\n this._handlers = {\n log: options?.handlers?.log ?? defaultLogHandler,\n progress: options?.handlers?.progress ?? defaultProgressHandler,\n sampling: options?.handlers?.sampling,\n elicitation: options?.handlers?.elicitation,\n }\n this._roots = options?.roots\n this._defaultOptions = options?.defaultOptions ?? {}\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n async connect(): Promise<void> {\n if (this._connected) return\n if (this._connectPromise) {\n await this._connectPromise\n return\n }\n\n this._connectPromise = this._doConnect().finally(() => {\n this._connectPromise = null\n })\n\n await this._connectPromise\n }\n\n private async _doConnect(): Promise<void> {\n const entries = Object.entries(this._config.mcpServers)\n if (entries.length === 0) throw new Error('mcpServers config is empty')\n\n const connected: Array<[string, SdkClient]> = []\n\n try {\n await Promise.all(\n entries.map(async ([name, entry]) => {\n const sdk = this._buildSdkClient()\n this._registerHandlers(sdk)\n const { transport, beforeConnect } = resolveEntryTransport(\n entry as McpServerValue,\n )\n if (beforeConnect) await beforeConnect()\n await sdk.connect(transport)\n connected.push([name, sdk])\n }),\n )\n } catch (err) {\n // Roll back any connections that succeeded before the failure.\n await Promise.allSettled(connected.map(([, sdk]) => sdk.close()))\n throw err\n }\n\n for (const [name, sdk] of connected) {\n this._clients.set(name, sdk)\n }\n\n this._connected = true\n }\n\n async close(): Promise<void> {\n if (!this._connected) return\n this._connected = false\n this._uriMap.clear()\n await Promise.allSettled([...this._clients.values()].map((sdk) => sdk.close()))\n this._clients.clear()\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close()\n }\n\n isConnected(): boolean {\n return this._connected\n }\n\n static async connect(\n config: McpConfig,\n options?: MultiServerOptions,\n ): Promise<MultiServerClient> {\n const client = new MultiServerClient(config, options)\n await client.connect()\n return client\n }\n\n // -------------------------------------------------------------------------\n // Core protocol\n // -------------------------------------------------------------------------\n\n async ping(options?: RequestOptions): Promise<boolean> {\n this._assertConnected()\n await Promise.all(\n [...this._clients.values()].map((sdk) =>\n sdk.ping(this._toSdkOptions(options)),\n ),\n )\n return true\n }\n\n // -------------------------------------------------------------------------\n // Tools\n // -------------------------------------------------------------------------\n\n async listTools(options?: RequestOptions): Promise<Tool[]> {\n this._assertConnected()\n const results = await Promise.all(\n [...this._clients.entries()].map(async ([name, sdk]) => {\n const r = await sdk.listTools(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.tool?.timeout),\n )\n return (r.tools as Tool[]).map((t) => ({ ...t, name: `${name}_${t.name}` }))\n }),\n )\n return results.flat()\n }\n\n async callTool<TData = unknown>(\n name: string,\n args?: Record<string, unknown>,\n options?: CallToolOptions,\n ): Promise<CallToolResult<TData>> {\n const raw = await this.callToolRaw<TData>(name, args, options)\n if (raw.isError) {\n const message =\n (raw.content as Array<{ type: string; text?: string }>)\n .filter((c) => c.type === 'text')\n .map((c) => c.text ?? '')\n .join('\\n') || 'Tool returned an error'\n throw new ToolCallError(message, raw.content)\n }\n return raw\n }\n\n async callToolRaw<TData = unknown>(\n name: string,\n args?: Record<string, unknown>,\n options?: CallToolOptions,\n ): Promise<CallToolResult<TData>> {\n const { serverName, localName } = this._parseNamespacedName(name)\n const sdk = this._sdkForServer(serverName)\n const sdkOptions = this._toSdkOptions(\n options,\n options?.onProgress,\n this._defaultOptions.tool?.timeout,\n )\n const result = await sdk.callTool(\n { name: localName, arguments: args ?? {} },\n CompatibilityCallToolResultSchema,\n sdkOptions,\n )\n return {\n content: result.content as ContentBlock[],\n structuredContent: (result.structuredContent as TData | undefined) ?? null,\n isError: result.isError === true,\n }\n }\n\n // -------------------------------------------------------------------------\n // Resources\n // -------------------------------------------------------------------------\n\n async listResources(options?: RequestOptions): Promise<Resource[]> {\n this._assertConnected()\n const results = await Promise.all(\n [...this._clients.entries()].map(async ([name, sdk]) => {\n const r = await sdk.listResources(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n const resources = r.resources as Resource[]\n for (const res of resources) {\n this._uriMap.set(res.uri, name)\n }\n return resources.map((res) => ({\n ...res,\n name: res.name ? `${name}_${res.name}` : res.name,\n }))\n }),\n )\n return results.flat()\n }\n\n async listResourceTemplates(options?: RequestOptions): Promise<ResourceTemplate[]> {\n this._assertConnected()\n const results = await Promise.all(\n [...this._clients.entries()].map(async ([name, sdk]) => {\n const r = await sdk.listResourceTemplates(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n const templates = r.resourceTemplates as ResourceTemplate[]\n for (const tmpl of templates) {\n this._uriMap.set(tmpl.uriTemplate, name)\n }\n return templates.map((tmpl) => ({\n ...tmpl,\n name: tmpl.name ? `${name}_${tmpl.name}` : tmpl.name,\n }))\n }),\n )\n return results.flat()\n }\n\n async readResource(uri: string, options?: RequestOptions): Promise<ResourceContents[]> {\n this._assertConnected()\n const sdkOptions = this._toSdkOptions(\n options,\n undefined,\n this._defaultOptions.resource?.timeout,\n )\n\n // Fast path: URI was seen during a previous list call.\n const knownServer = this._uriMap.get(uri)\n if (knownServer) {\n const sdk = this._clients.get(knownServer)!\n const result = await sdk.readResource({ uri }, sdkOptions)\n return result.contents as ResourceContents[]\n }\n\n // Fallback: try each server in order, return the first success.\n const errors: unknown[] = []\n for (const sdk of this._clients.values()) {\n try {\n const result = await sdk.readResource({ uri }, sdkOptions)\n return result.contents as ResourceContents[]\n } catch (err) {\n errors.push(err)\n }\n }\n throw new Error(\n `Resource not found on any server: ${uri}\\n` +\n errors.map((e) => String(e)).join('\\n'),\n )\n }\n\n // -------------------------------------------------------------------------\n // Prompts\n // -------------------------------------------------------------------------\n\n async listPrompts(options?: RequestOptions): Promise<Prompt[]> {\n this._assertConnected()\n const results = await Promise.all(\n [...this._clients.entries()].map(async ([name, sdk]) => {\n const r = await sdk.listPrompts(\n undefined,\n this._toSdkOptions(options, undefined, this._defaultOptions.prompt?.timeout),\n )\n return (r.prompts as Prompt[]).map((p) => ({ ...p, name: `${name}_${p.name}` }))\n }),\n )\n return results.flat()\n }\n\n async getPrompt(\n name: string,\n args?: Record<string, string>,\n options?: RequestOptions,\n ): Promise<GetPromptResult> {\n const { serverName, localName } = this._parseNamespacedName(name)\n const sdk = this._sdkForServer(serverName)\n const result = await sdk.getPrompt(\n { name: localName, arguments: args },\n this._toSdkOptions(options, undefined, this._defaultOptions.prompt?.timeout),\n )\n return result as GetPromptResult\n }\n\n // -------------------------------------------------------------------------\n // Resource subscriptions\n // -------------------------------------------------------------------------\n\n async subscribeResource(\n uri: string,\n handler: ResourceUpdateHandler,\n options?: RequestOptions,\n ): Promise<void> {\n this._assertConnected()\n this._resourceSubscriptions.set(uri, handler)\n const serverName = this._uriMap.get(uri)\n if (serverName) {\n await this._clients.get(serverName)!.subscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return\n }\n const errors: unknown[] = []\n for (const sdk of this._clients.values()) {\n try {\n await sdk.subscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return\n } catch (err) {\n errors.push(err)\n }\n }\n throw new Error(`Subscribe failed on all servers:\\n${errors.map(String).join('\\n')}`)\n }\n\n async unsubscribeResource(uri: string, options?: RequestOptions): Promise<void> {\n this._assertConnected()\n this._resourceSubscriptions.delete(uri)\n const serverName = this._uriMap.get(uri)\n if (serverName) {\n await this._clients.get(serverName)!.unsubscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n )\n return\n }\n await Promise.allSettled(\n [...this._clients.values()].map((sdk) =>\n sdk.unsubscribeResource(\n { uri },\n this._toSdkOptions(options, undefined, this._defaultOptions.resource?.timeout),\n ),\n ),\n )\n }\n\n // -------------------------------------------------------------------------\n // Completion\n // -------------------------------------------------------------------------\n\n async complete(\n ref: { type: 'ref/prompt'; name: string } | { type: 'ref/resource'; uri: string },\n argument: { name: string; value: string },\n context?: { arguments?: Record<string, string> },\n options?: RequestOptions,\n ): Promise<CompletionResult> {\n this._assertConnected()\n const sdkOptions = this._toSdkOptions(options)\n\n if (ref.type === 'ref/prompt') {\n const { serverName, localName } = this._parseNamespacedName(ref.name)\n const sdk = this._sdkForServer(serverName)\n const result = await sdk.complete(\n { ref: { type: 'ref/prompt', name: localName }, argument, ...(context ? { context } : {}) },\n sdkOptions,\n )\n return result.completion as CompletionResult\n }\n\n const serverName = this._uriMap.get(ref.uri)\n if (serverName) {\n const result = await this._clients.get(serverName)!.complete(\n { ref, argument, ...(context ? { context } : {}) },\n sdkOptions,\n )\n return result.completion as CompletionResult\n }\n\n const errors: unknown[] = []\n for (const sdk of this._clients.values()) {\n try {\n const result = await sdk.complete(\n { ref, argument, ...(context ? { context } : {}) },\n sdkOptions,\n )\n return result.completion as CompletionResult\n } catch (err) {\n errors.push(err)\n }\n }\n throw new Error(`Completion failed on all servers:\\n${errors.map(String).join('\\n')}`)\n }\n\n // -------------------------------------------------------------------------\n // Logging\n // -------------------------------------------------------------------------\n\n async setLogLevel(level: LoggingLevel, options?: RequestOptions): Promise<void> {\n this._assertConnected()\n await Promise.all(\n [...this._clients.values()].map((sdk) =>\n sdk.setLoggingLevel(level, this._toSdkOptions(options)),\n ),\n )\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private _assertConnected(): void {\n if (!this._connected) {\n throw new Error('MultiServerClient is not connected. Call connect() first.')\n }\n }\n\n private _parseNamespacedName(name: string): { serverName: string; localName: string } {\n // Sort longest-first so that server names like \"my_server\" are matched\n // before the shorter prefix \"my\".\n const serverNames = [...this._clients.keys()].sort((a, b) => b.length - a.length)\n for (const serverName of serverNames) {\n const prefix = `${serverName}_`\n if (name.startsWith(prefix)) {\n return { serverName, localName: name.slice(prefix.length) }\n }\n }\n throw new Error(\n `Tool/prompt name \"${name}\" has no server namespace prefix. ` +\n `Expected format: \"<serverName>_<name>\".`,\n )\n }\n\n private _sdkForServer(serverName: string): SdkClient {\n const sdk = this._clients.get(serverName)\n if (!sdk) {\n throw new Error(\n `No server named \"${serverName}\" in this MultiServerClient. ` +\n `Known servers: ${[...this._clients.keys()].join(', ')}.`,\n )\n }\n return sdk\n }\n\n private _buildSdkClient(): SdkClient {\n return new SdkClient(\n { name: 'fastmcp-ts', version: '1.0.0' },\n { capabilities: this._buildCapabilities() },\n )\n }\n\n private _buildCapabilities() {\n return {\n ...(this._handlers.sampling ? { sampling: { tools: {} } } : {}),\n ...(this._handlers.elicitation ? { elicitation: {} } : {}),\n ...(this._roots ? { roots: { listChanged: false } } : {}),\n }\n }\n\n private _registerHandlers(sdk: SdkClient): void {\n sdk.setNotificationHandler(LoggingMessageNotificationSchema, (notification) => {\n void this._handlers.log({\n level: notification.params.level,\n logger: notification.params.logger ?? undefined,\n data: notification.params.data,\n })\n })\n\n sdk.setNotificationHandler(ResourceUpdatedNotificationSchema, (notification) => {\n const handler = this._resourceSubscriptions.get(notification.params.uri)\n if (handler) void handler(notification.params.uri)\n })\n\n if (this._handlers.sampling) {\n const h = this._handlers.sampling\n sdk.setRequestHandler(CreateMessageRequestSchema, async (req) => h(req.params))\n }\n\n if (this._handlers.elicitation) {\n const h = this._handlers.elicitation\n sdk.setRequestHandler(ElicitRequestSchema, async (req) => h(req.params))\n }\n\n if (this._roots) {\n const roots = this._roots\n sdk.setRequestHandler(ListRootsRequestSchema, async () => ({\n roots: roots.map((uri) => ({ uri })),\n }))\n }\n }\n\n private _toSdkOptions(\n options?: RequestOptions,\n overrideProgress?: ProgressHandler,\n scopedTimeoutSeconds?: number,\n ): SdkRequestOptions {\n const timeoutSeconds =\n options?.timeout ?? scopedTimeoutSeconds ?? this._defaultOptions.timeout\n const progressHandler = overrideProgress ?? this._handlers.progress\n\n const sdkOptions: SdkRequestOptions = {}\n if (timeoutSeconds != null) sdkOptions.timeout = timeoutSeconds * 1000\n if (options?.signal) sdkOptions.signal = options.signal\n if (progressHandler) {\n sdkOptions.onprogress = ({ progress, total, message }) => {\n void progressHandler(progress, total, message)\n }\n }\n return sdkOptions\n }\n}\n","export type Result<T, E = Error> =\n | { ok: true; value: T }\n | { ok: false; error: E }\n\nexport async function toResult<T, E = Error>(\n fn: Promise<T> | (() => Promise<T>),\n): Promise<Result<T, E>> {\n try {\n const value = await (typeof fn === 'function' ? fn() : fn)\n return { ok: true, value }\n } catch (error) {\n return { ok: false, error: error as E }\n }\n}\n","import type { ModelPreferences } from '@modelcontextprotocol/sdk/types.js'\nimport type { SamplingHandler } from '../handlers.js'\n\nexport type { SamplingHandler }\n\n/**\n * Resolve a concrete model name from the server's modelPreferences.\n * A plain string always uses that model; a function inspects the preferences.\n */\nexport type ModelSelector = string | ((prefs: ModelPreferences | undefined) => string)\n\n/** Called with each text token as it is streamed from the provider. */\nexport type OnTokenCallback = (token: string) => void\n\nexport interface SamplingAdapterOptions {\n /** Override or replace the model selection logic. */\n modelSelector?: ModelSelector\n /** Fired for each streamed text token. Tool-use deltas are not surfaced. */\n onToken?: OnTokenCallback\n}\n\n/** Implemented by all sampling adapters. */\nexport interface SamplingAdapter {\n asHandler(): SamplingHandler\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nexport function resolveModel(\n prefs: ModelPreferences | undefined,\n selector: ModelSelector | undefined,\n defaultModel: string,\n): string {\n if (!selector) {\n return prefs?.hints?.[0]?.name ?? defaultModel\n }\n if (typeof selector === 'string') return selector\n return selector(prefs)\n}\n","import type {\n SamplingMessage,\n Tool,\n ToolChoice,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { AnySamplingResult } from '../results.js'\nimport type { SamplingAdapter, SamplingAdapterOptions, ModelSelector, OnTokenCallback } from './types.js'\nimport type { SamplingHandler } from '../handlers.js'\nimport { resolveModel } from './types.js'\nimport type { CreateMessageRequestParams } from '@modelcontextprotocol/sdk/types.js'\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface GenericCompletionParams {\n model: string\n messages: SamplingMessage[]\n system?: string\n /** Defaulted to 1024 when absent in the original request. */\n maxTokens: number\n temperature?: number\n stopSequences?: string[]\n tools?: Tool[]\n toolChoice?: ToolChoice\n onToken?: OnTokenCallback\n}\n\nexport type GenericCompletionFn = (\n params: GenericCompletionParams,\n) => Promise<AnySamplingResult>\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\n/**\n * Contribution template. Wraps any async function into a SamplingHandler.\n *\n * The adapter resolves the model from modelPreferences, defaults maxTokens,\n * and threads onToken through. Message format conversion, tool translation,\n * and streaming are the caller's responsibility.\n *\n * Example:\n * ```ts\n * const adapter = new GenericSamplingAdapter(async ({ model, messages }) => {\n * const text = await myLlm.complete(model, messages)\n * return { role: 'assistant', content: { type: 'text', text }, model, stopReason: 'endTurn' }\n * })\n * ```\n */\nexport class GenericSamplingAdapter implements SamplingAdapter {\n private readonly _fn: GenericCompletionFn\n private readonly _options: SamplingAdapterOptions & { defaultModel?: string }\n\n constructor(\n fn: GenericCompletionFn,\n options?: SamplingAdapterOptions & { defaultModel?: string },\n ) {\n this._fn = fn\n this._options = options ?? {}\n }\n\n asHandler(): SamplingHandler {\n return async (params: CreateMessageRequestParams): Promise<AnySamplingResult> => {\n const model = resolveModel(\n params.modelPreferences,\n this._options.modelSelector,\n this._options.defaultModel ?? 'unknown',\n )\n return this._fn({\n model,\n messages: params.messages,\n system: params.systemPrompt,\n maxTokens: params.maxTokens ?? 1024,\n temperature: params.temperature,\n stopSequences: params.stopSequences,\n tools: params.tools,\n toolChoice: params.toolChoice,\n onToken: this._options.onToken,\n })\n }\n }\n}\n","import type Anthropic from '@anthropic-ai/sdk'\nimport type {\n ContentBlockParam,\n ToolResultBlockParam,\n} from '@anthropic-ai/sdk/resources/messages'\nimport type {\n CreateMessageRequestParams,\n SamplingMessage,\n Tool,\n ToolChoice,\n ToolUseContent,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { AnySamplingResult } from '../results.js'\nimport type { SamplingHandler } from '../handlers.js'\nimport type { SamplingAdapter, SamplingAdapterOptions } from './types.js'\nimport { resolveModel } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Message translation\n// ---------------------------------------------------------------------------\n\nfunction toBlocks(content: SamplingMessage['content']): ContentBlockParam[] {\n const items = Array.isArray(content) ? content : [content]\n const out: ContentBlockParam[] = []\n\n for (const block of items) {\n if (block.type === 'text') {\n out.push({ type: 'text', text: block.text })\n } else if (block.type === 'image') {\n out.push({\n type: 'image',\n source: {\n type: 'base64',\n media_type: block.mimeType as Anthropic.Base64ImageSource['media_type'],\n data: block.data,\n },\n })\n } else if (block.type === 'tool_use') {\n out.push({\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n })\n } else if (block.type === 'tool_result') {\n const resultContent: ToolResultBlockParam['content'] = block.content.flatMap((c) =>\n c.type === 'text' ? [{ type: 'text' as const, text: c.text }] : [],\n )\n out.push({\n type: 'tool_result',\n tool_use_id: block.toolUseId,\n content: resultContent,\n is_error: block.isError,\n })\n }\n // audio: not supported by Anthropic messages API — skip\n }\n return out\n}\n\nfunction toAnthropicMessages(messages: SamplingMessage[]): Anthropic.MessageParam[] {\n return messages.map((m) => ({\n role: m.role as 'user' | 'assistant',\n content: toBlocks(m.content),\n }))\n}\n\nfunction toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description ?? '',\n input_schema: t.inputSchema as Anthropic.Tool['input_schema'],\n }))\n}\n\nfunction toAnthropicToolChoice(\n choice: ToolChoice | undefined,\n): Anthropic.MessageCreateParams['tool_choice'] {\n if (!choice) return undefined\n if (choice.mode === 'required') return { type: 'any' }\n return { type: 'auto' }\n}\n\n// ---------------------------------------------------------------------------\n// Response mapping\n// ---------------------------------------------------------------------------\n\nfunction mapStopReason(reason: string | null | undefined): string {\n if (reason === 'end_turn') return 'endTurn'\n if (reason === 'stop_sequence') return 'stopSequence'\n if (reason === 'max_tokens') return 'maxTokens'\n if (reason === 'tool_use') return 'toolUse'\n return reason ?? 'endTurn'\n}\n\nfunction buildResult(message: Anthropic.Message): AnySamplingResult {\n const stopReason = mapStopReason(message.stop_reason)\n\n if (stopReason === 'toolUse') {\n const content = message.content.flatMap((block): ToolUseContent[] => {\n if (block.type === 'tool_use') {\n return [{\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n }]\n }\n return []\n })\n return { role: 'assistant', model: message.model, stopReason, content }\n }\n\n const textBlock = message.content.find((b) => b.type === 'text')\n const text = textBlock?.type === 'text' ? textBlock.text : ''\n return { role: 'assistant', model: message.model, stopReason, content: { type: 'text', text } }\n}\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\nexport class AnthropicSamplingAdapter implements SamplingAdapter {\n private readonly _client: Anthropic\n private readonly _options: SamplingAdapterOptions & { defaultModel?: string }\n\n constructor(\n client: Anthropic,\n options?: SamplingAdapterOptions & { defaultModel?: string },\n ) {\n this._client = client\n this._options = options ?? {}\n }\n\n asHandler(): SamplingHandler {\n return async (params: CreateMessageRequestParams): Promise<AnySamplingResult> => {\n const model = resolveModel(\n params.modelPreferences,\n this._options.modelSelector,\n this._options.defaultModel ?? 'claude-opus-4-5',\n )\n\n const omitTools = params.toolChoice?.mode === 'none'\n const tools = !omitTools && params.tools?.length\n ? toAnthropicTools(params.tools)\n : undefined\n const toolChoice = tools ? toAnthropicToolChoice(params.toolChoice) : undefined\n const onToken = this._options.onToken\n\n const stream = this._client.messages.stream({\n model,\n messages: toAnthropicMessages(params.messages),\n max_tokens: params.maxTokens ?? 1024,\n ...(params.systemPrompt !== undefined ? { system: params.systemPrompt } : {}),\n ...(params.temperature !== undefined ? { temperature: params.temperature } : {}),\n ...(params.stopSequences?.length ? { stop_sequences: params.stopSequences } : {}),\n ...(tools ? { tools } : {}),\n ...(toolChoice ? { tool_choice: toolChoice } : {}),\n })\n\n if (onToken) {\n stream.on('text', (text) => { onToken(text) })\n }\n\n const message = await stream.finalMessage()\n return buildResult(message)\n }\n }\n}\n","import type OpenAI from 'openai'\nimport type {\n CreateMessageRequestParams,\n SamplingMessage,\n Tool,\n ToolChoice,\n ToolUseContent,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { AnySamplingResult } from '../results.js'\nimport type { SamplingHandler } from '../handlers.js'\nimport type { SamplingAdapter, SamplingAdapterOptions } from './types.js'\nimport { resolveModel } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Message translation\n// ---------------------------------------------------------------------------\n\ntype OAIMessage = OpenAI.Chat.ChatCompletionMessageParam\n\nfunction toContentParts(\n content: SamplingMessage['content'],\n): string | OpenAI.Chat.ChatCompletionContentPart[] {\n const items = Array.isArray(content) ? content : [content]\n // Collapse single text block to a plain string for simplicity\n if (items.length === 1 && items[0].type === 'text') return items[0].text\n\n return items.flatMap((block): OpenAI.Chat.ChatCompletionContentPart[] => {\n if (block.type === 'text') {\n return [{ type: 'text', text: block.text }]\n } else if (block.type === 'image') {\n return [{\n type: 'image_url',\n image_url: { url: `data:${block.mimeType};base64,${block.data}` },\n }]\n }\n return []\n })\n}\n\nfunction toOpenAIMessages(\n messages: SamplingMessage[],\n systemPrompt: string | undefined,\n): OAIMessage[] {\n const out: OAIMessage[] = []\n\n if (systemPrompt) {\n out.push({ role: 'system', content: systemPrompt })\n }\n\n for (const m of messages) {\n const items = Array.isArray(m.content) ? m.content : [m.content]\n\n // tool_use blocks → assistant message with tool_calls\n const toolUseItems = items.filter((b) => b.type === 'tool_use')\n if (toolUseItems.length > 0) {\n out.push({\n role: 'assistant',\n tool_calls: toolUseItems.map((b) => {\n if (b.type !== 'tool_use') throw new Error('unreachable')\n return {\n id: b.id,\n type: 'function' as const,\n function: { name: b.name, arguments: JSON.stringify(b.input) },\n }\n }),\n })\n continue\n }\n\n // tool_result blocks → tool messages\n const toolResultItems = items.filter((b) => b.type === 'tool_result')\n if (toolResultItems.length > 0) {\n for (const b of toolResultItems) {\n if (b.type !== 'tool_result') continue\n const text = b.content\n .filter((c) => c.type === 'text')\n .map((c) => (c.type === 'text' ? c.text : ''))\n .join('\\n')\n out.push({ role: 'tool', tool_call_id: b.toolUseId, content: text })\n }\n continue\n }\n\n const role = m.role as 'user' | 'assistant'\n const content = toContentParts(m.content)\n if (role === 'user') {\n out.push({ role, content: content as OpenAI.Chat.ChatCompletionUserMessageParam['content'] })\n } else {\n out.push({ role, content: typeof content === 'string' ? content : '' })\n }\n }\n\n return out\n}\n\nfunction toOpenAITools(tools: Tool[]): OpenAI.Chat.ChatCompletionTool[] {\n return tools.map((t) => ({\n type: 'function' as const,\n function: {\n name: t.name,\n ...(t.description ? { description: t.description } : {}),\n parameters: t.inputSchema as OpenAI.FunctionParameters,\n },\n }))\n}\n\nfunction toOpenAIToolChoice(\n choice: ToolChoice | undefined,\n): OpenAI.Chat.ChatCompletionToolChoiceOption | undefined {\n if (!choice) return undefined\n if (choice.mode === 'required') return 'required'\n if (choice.mode === 'none') return 'none'\n return 'auto'\n}\n\n// ---------------------------------------------------------------------------\n// Response mapping\n// ---------------------------------------------------------------------------\n\nfunction mapFinishReason(reason: string | null | undefined): string {\n if (reason === 'stop') return 'endTurn'\n if (reason === 'length') return 'maxTokens'\n if (reason === 'tool_calls') return 'toolUse'\n return 'endTurn'\n}\n\nfunction buildResult(completion: OpenAI.Chat.ChatCompletion): AnySamplingResult {\n const choice = completion.choices[0]\n const stopReason = mapFinishReason(choice?.finish_reason)\n const model = completion.model\n\n if (stopReason === 'toolUse') {\n const calls = choice.message.tool_calls ?? []\n const content: ToolUseContent[] = calls.flatMap((tc) => {\n // tc is ChatCompletionMessageToolCall (union); filter to function type\n if (tc.type !== 'function') return []\n const fn = (tc as { type: 'function'; id: string; function: { name: string; arguments: string } }).function\n return [{\n type: 'tool_use' as const,\n id: tc.id,\n name: fn.name,\n input: JSON.parse(fn.arguments) as Record<string, unknown>,\n }]\n })\n return { role: 'assistant', model, stopReason, content }\n }\n\n const text = choice.message.content ?? ''\n return { role: 'assistant', model, stopReason, content: { type: 'text', text } }\n}\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\nexport class OpenAISamplingAdapter implements SamplingAdapter {\n private readonly _client: OpenAI\n private readonly _options: SamplingAdapterOptions & { defaultModel?: string }\n\n constructor(\n client: OpenAI,\n options?: SamplingAdapterOptions & { defaultModel?: string },\n ) {\n this._client = client\n this._options = options ?? {}\n }\n\n asHandler(): SamplingHandler {\n return async (params: CreateMessageRequestParams): Promise<AnySamplingResult> => {\n const model = resolveModel(\n params.modelPreferences,\n this._options.modelSelector,\n this._options.defaultModel ?? 'gpt-4o',\n )\n\n const omitTools = params.toolChoice?.mode === 'none'\n const tools = !omitTools && params.tools?.length\n ? toOpenAITools(params.tools)\n : undefined\n const toolChoice = tools ? toOpenAIToolChoice(params.toolChoice) : undefined\n const onToken = this._options.onToken\n\n const stream = this._client.chat.completions.stream({\n model,\n messages: toOpenAIMessages(params.messages, params.systemPrompt),\n max_completion_tokens: params.maxTokens ?? 1024,\n ...(params.temperature !== undefined ? { temperature: params.temperature } : {}),\n ...(params.stopSequences?.length ? { stop: params.stopSequences } : {}),\n ...(tools ? { tools } : {}),\n ...(toolChoice !== undefined ? { tool_choice: toolChoice } : {}),\n })\n\n if (onToken) {\n stream.on('content', (delta) => { onToken(delta) })\n }\n\n const completion = await stream.finalChatCompletion()\n return buildResult(completion)\n }\n }\n}\n","import type { GoogleGenAI } from '@google/genai'\nimport type {\n GenerateContentConfig,\n GenerateContentResponse,\n} from '@google/genai'\nimport type {\n CreateMessageRequestParams,\n SamplingMessage,\n Tool,\n ToolChoice,\n ToolUseContent,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { AnySamplingResult } from '../results.js'\nimport type { SamplingHandler } from '../handlers.js'\nimport type { SamplingAdapter, SamplingAdapterOptions } from './types.js'\nimport { resolveModel } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Title pruning\n// ---------------------------------------------------------------------------\n\n/**\n * Removes 'title' from all property definitions in a JSON Schema object.\n * Gemini emits MALFORMED_FUNCTION_CALL when property titles are present.\n */\nfunction pruneTitle(schema: Record<string, unknown>): Record<string, unknown> {\n const { title: _dropped, ...rest } = schema\n if (rest.properties && typeof rest.properties === 'object') {\n rest.properties = Object.fromEntries(\n Object.entries(rest.properties as Record<string, unknown>).map(([k, v]) => [\n k,\n pruneTitle(v as Record<string, unknown>),\n ]),\n )\n }\n return rest\n}\n\n// ---------------------------------------------------------------------------\n// Message translation\n// ---------------------------------------------------------------------------\n\nfunction toGeminiRole(role: 'user' | 'assistant'): 'user' | 'model' {\n return role === 'assistant' ? 'model' : 'user'\n}\n\n/** Build an id→name map from prior tool_use blocks so tool_result can reference by name. */\nfunction buildToolNameMap(messages: SamplingMessage[]): Map<string, string> {\n const map = new Map<string, string>()\n for (const m of messages) {\n const items = Array.isArray(m.content) ? m.content : [m.content]\n for (const b of items) {\n if (b.type === 'tool_use') map.set(b.id, b.name)\n }\n }\n return map\n}\n\nfunction toGeminiContents(\n messages: SamplingMessage[],\n toolNameById: Map<string, string>,\n): object[] {\n return messages.map((m) => {\n const items = Array.isArray(m.content) ? m.content : [m.content]\n const parts = items.flatMap((block): object[] => {\n if (block.type === 'text') {\n return [{ text: block.text }]\n } else if (block.type === 'image') {\n return [{ inlineData: { data: block.data, mimeType: block.mimeType } }]\n } else if (block.type === 'tool_use') {\n return [{ functionCall: { name: block.name, args: block.input } }]\n } else if (block.type === 'tool_result') {\n const name = toolNameById.get(block.toolUseId) ?? block.toolUseId\n const text = block.content\n .filter((c) => c.type === 'text')\n .map((c) => (c.type === 'text' ? c.text : ''))\n .join('\\n')\n return [{ functionResponse: { name, response: { content: text } } }]\n }\n return []\n })\n return { role: toGeminiRole(m.role as 'user' | 'assistant'), parts }\n })\n}\n\nfunction toGeminiFunctionDeclarations(tools: Tool[]): object[] {\n return tools.map((t) => ({\n name: t.name,\n ...(t.description ? { description: t.description } : {}),\n parameters: pruneTitle(t.inputSchema as Record<string, unknown>),\n }))\n}\n\nfunction toGeminiToolConfig(choice: ToolChoice | undefined): object | undefined {\n if (!choice) return undefined\n const mode =\n choice.mode === 'required' ? 'ANY' :\n choice.mode === 'none' ? 'NONE' :\n 'AUTO'\n return { functionCallingConfig: { mode } }\n}\n\n// ---------------------------------------------------------------------------\n// Response mapping\n// ---------------------------------------------------------------------------\n\nfunction buildResult(response: GenerateContentResponse, model: string): AnySamplingResult {\n const functionCalls = response.functionCalls\n\n if (functionCalls?.length) {\n const content: ToolUseContent[] = functionCalls.map((fc, i) => ({\n type: 'tool_use' as const,\n id: fc.id ?? `tool-${i}`,\n name: fc.name ?? '',\n input: (fc.args ?? {}) as Record<string, unknown>,\n }))\n return { role: 'assistant', model, stopReason: 'toolUse', content }\n }\n\n const candidate = response.candidates?.[0]\n const finishReason = candidate?.finishReason\n const stopReason =\n finishReason === 'MAX_TOKENS' ? 'maxTokens' :\n 'endTurn'\n\n const text = response.text ?? ''\n return { role: 'assistant', model, stopReason, content: { type: 'text', text } }\n}\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\nexport class GoogleSamplingAdapter implements SamplingAdapter {\n private readonly _client: GoogleGenAI\n private readonly _options: SamplingAdapterOptions & { defaultModel?: string }\n\n constructor(\n client: GoogleGenAI,\n options?: SamplingAdapterOptions & { defaultModel?: string },\n ) {\n this._client = client\n this._options = options ?? {}\n }\n\n asHandler(): SamplingHandler {\n return async (params: CreateMessageRequestParams): Promise<AnySamplingResult> => {\n const model = resolveModel(\n params.modelPreferences,\n this._options.modelSelector,\n this._options.defaultModel ?? 'gemini-2.0-flash',\n )\n\n const toolNameById = buildToolNameMap(params.messages)\n const contents = toGeminiContents(params.messages, toolNameById)\n const onToken = this._options.onToken\n\n const omitTools = params.toolChoice?.mode === 'none'\n const functionDeclarations = !omitTools && params.tools?.length\n ? toGeminiFunctionDeclarations(params.tools)\n : undefined\n const toolConfig = !omitTools ? toGeminiToolConfig(params.toolChoice) : undefined\n\n const config: GenerateContentConfig = {\n maxOutputTokens: params.maxTokens ?? 1024,\n ...(params.temperature !== undefined ? { temperature: params.temperature } : {}),\n ...(params.stopSequences?.length ? { stopSequences: params.stopSequences } : {}),\n ...(params.systemPrompt\n ? { systemInstruction: { parts: [{ text: params.systemPrompt }] } }\n : {}),\n ...(functionDeclarations ? { tools: [{ functionDeclarations }] } : {}),\n ...(toolConfig ? { toolConfig } : {}),\n }\n\n const stream = await this._client.models.generateContentStream({\n model,\n contents: contents as Parameters<typeof this._client.models.generateContentStream>[0]['contents'],\n config,\n })\n\n let lastChunk: GenerateContentResponse | undefined\n for await (const chunk of stream) {\n lastChunk = chunk\n if (onToken) {\n const text = chunk.text\n if (text) onToken(text)\n }\n }\n\n return buildResult(lastChunk!, model)\n }\n }\n}\n"],"mappings":"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","names":["resolve","SdkClient","CompatibilityCallToolResultSchema","CreateMessageRequestSchema","ElicitRequestSchema","ListRootsRequestSchema","LoggingMessageNotificationSchema","ResourceUpdatedNotificationSchema","serverName","SdkClient","CompatibilityCallToolResultSchema","LoggingMessageNotificationSchema","ResourceUpdatedNotificationSchema","CreateMessageRequestSchema","ElicitRequestSchema","ListRootsRequestSchema","buildResult","buildResult"]}
|