diff --git a/core/auth/cimd.ts b/core/auth/cimd.ts index 216dce2a..76f125cb 100644 --- a/core/auth/cimd.ts +++ b/core/auth/cimd.ts @@ -1,4 +1,7 @@ -import { discoverAuthorizationServerMetadata, discoverOAuthProtectedResourceMetadata } from "@modelcontextprotocol/client"; +import { + discoverAuthorizationServerMetadata, + discoverOAuthProtectedResourceMetadata, +} from "@modelcontextprotocol/client"; import type { OAuthClientInformation } from "@modelcontextprotocol/client"; import { getAuthorizationServerUrl } from "./discovery.js"; import type { BaseOAuthClientProvider } from "./providers.js"; diff --git a/core/auth/connection-state.ts b/core/auth/connection-state.ts index 1e4b277c..8d20d7e2 100644 --- a/core/auth/connection-state.ts +++ b/core/auth/connection-state.ts @@ -1,10 +1,18 @@ -import type { OAuthClientInformation, OAuthTokens } from "@modelcontextprotocol/client"; +import type { + OAuthClientInformation, + OAuthTokens, +} from "@modelcontextprotocol/client"; import type { EnterpriseManagedAuthIdpConfig } from "../client/types.js"; import { getEmaIdpLoginState, normalizeIdpIssuer } from "./ema/idpSession.js"; import { idpOAuthStorageKey } from "./ema/storage.js"; import { isJwtExpired } from "./ema/jwt.js"; import type { OAuthStorage } from "./storage.js"; -import type { AuthProtocol, OAuthClientRegistrationKind, OAuthConnectionState, OAuthFlowState } from "./types.js"; +import type { + AuthProtocol, + OAuthClientRegistrationKind, + OAuthConnectionState, + OAuthFlowState, +} from "./types.js"; import { authProtocolFromEnterpriseManaged } from "./types.js"; export interface BuildOAuthConnectionStateParams { @@ -17,9 +25,7 @@ export interface BuildOAuthConnectionStateParams { } /** True when persisted tokens include a non-expired access token (JWT exp when parseable). */ -export function isAccessTokenUsable( - tokens: OAuthTokens | undefined, -): boolean { +export function isAccessTokenUsable(tokens: OAuthTokens | undefined): boolean { if (!tokens?.access_token) return false; return !isJwtExpired(tokens.access_token); } @@ -27,10 +33,9 @@ export function isAccessTokenUsable( function resolveClient( preregistered: OAuthClientInformation | undefined, dynamic: OAuthClientInformation | undefined, - dynamicRegistrationKind: Extract< - OAuthClientRegistrationKind, - "dcr" | "cimd" - > | undefined, + dynamicRegistrationKind: + | Extract + | undefined, ): OAuthConnectionState["client"] | undefined { if (preregistered?.client_id) { return { @@ -81,7 +86,7 @@ export async function buildOAuthConnectionState( ? flowTokens : storedTokens && isAccessTokenUsable(storedTokens) ? storedTokens - : flowTokens ?? storedTokens; + : (flowTokens ?? storedTokens); const preregistered = await storage.getClientInformation(serverUrl, true); const dynamic = await storage.getClientInformation(serverUrl); @@ -120,7 +125,9 @@ export async function buildOAuthConnectionState( const idp = params.enterpriseManagedAuth.idp; const issuer = normalizeIdpIssuer(idp.issuer); const idpSession = await getEmaIdpLoginState(storage, issuer); - const idpMetadata = await storage.getServerMetadata(idpOAuthStorageKey(issuer)); + const idpMetadata = await storage.getServerMetadata( + idpOAuthStorageKey(issuer), + ); state.ema = { idpIssuer: issuer, idpClientId: idp.clientId, diff --git a/core/auth/ema/idpOidc.ts b/core/auth/ema/idpOidc.ts index c7edbba2..78fc6978 100644 --- a/core/auth/ema/idpOidc.ts +++ b/core/auth/ema/idpOidc.ts @@ -1,5 +1,12 @@ -import { discoverAuthorizationServerMetadata, exchangeAuthorization, startAuthorization } from "@modelcontextprotocol/client"; -import type { OAuthClientInformation, OAuthMetadata } from "@modelcontextprotocol/client"; +import { + discoverAuthorizationServerMetadata, + exchangeAuthorization, + startAuthorization, +} from "@modelcontextprotocol/client"; +import type { + OAuthClientInformation, + OAuthMetadata, +} from "@modelcontextprotocol/client"; import { OAuthMetadataSchema } from "@modelcontextprotocol/core"; import type { OAuthStorage } from "../storage.js"; import type { EnterpriseManagedAuthIdpConfig } from "../../client/types.js"; @@ -44,7 +51,9 @@ export async function discoverIdpMetadata( fetchFn, }); if (!metadata) { - throw new Error(`Failed to discover OIDC metadata for IdP issuer ${issuer}`); + throw new Error( + `Failed to discover OIDC metadata for IdP issuer ${issuer}`, + ); } return OAuthMetadataSchema.parse(metadata); } @@ -56,7 +65,11 @@ export async function startIdpOidcAuthorization(params: { fetchFn?: typeof fetch; }): Promise<{ authorizationUrl: URL }> { const issuer = normalizeIdpIssuer(params.idp.issuer); - const metadata = await resolveIdpMetadata(issuer, params.storage, params.fetchFn); + const metadata = await resolveIdpMetadata( + issuer, + params.storage, + params.fetchFn, + ); const clientInformation = idpClientInformation(params.idp); const storageKey = idpOAuthStorageKey(issuer); const state = generateOAuthState(); diff --git a/core/auth/ema/resourceContext.ts b/core/auth/ema/resourceContext.ts index 05fc6e4f..0ed0e43b 100644 --- a/core/auth/ema/resourceContext.ts +++ b/core/auth/ema/resourceContext.ts @@ -1,4 +1,8 @@ -import { discoverAuthorizationServerMetadata, discoverOAuthProtectedResourceMetadata, selectResourceURL } from "@modelcontextprotocol/client"; +import { + discoverAuthorizationServerMetadata, + discoverOAuthProtectedResourceMetadata, + selectResourceURL, +} from "@modelcontextprotocol/client"; import type { OAuthClientProvider } from "@modelcontextprotocol/client"; import type { OAuthProtectedResourceMetadata } from "@modelcontextprotocol/client"; import { getAuthorizationServerUrl } from "../discovery.js"; diff --git a/core/auth/ema/tokenEndpoint.ts b/core/auth/ema/tokenEndpoint.ts index 46247857..bc76a59f 100644 --- a/core/auth/ema/tokenEndpoint.ts +++ b/core/auth/ema/tokenEndpoint.ts @@ -1,5 +1,8 @@ import { selectClientAuthMethod } from "@modelcontextprotocol/client"; -import type { OAuthClientInformation, OAuthMetadata } from "@modelcontextprotocol/client"; +import type { + OAuthClientInformation, + OAuthMetadata, +} from "@modelcontextprotocol/client"; export async function parseOAuthTokenErrorResponse( response: Response, diff --git a/core/auth/ema/transportProvider.ts b/core/auth/ema/transportProvider.ts index e5ee3531..b130fff9 100644 --- a/core/auth/ema/transportProvider.ts +++ b/core/auth/ema/transportProvider.ts @@ -1,5 +1,9 @@ import type { OAuthClientProvider } from "@modelcontextprotocol/client"; -import type { OAuthClientInformationMixed, OAuthClientMetadata, OAuthTokens } from "@modelcontextprotocol/client"; +import type { + OAuthClientInformationMixed, + OAuthClientMetadata, + OAuthTokens, +} from "@modelcontextprotocol/client"; import type { BaseOAuthClientProvider } from "../providers.js"; import { refreshEmaResourceTokens, @@ -8,10 +12,7 @@ import { } from "./emaFlow.js"; import { isJwtExpired } from "./jwt.js"; -function isAccessTokenUsable( - tokens: OAuthTokens, - skewMs = 60_000, -): boolean { +function isAccessTokenUsable(tokens: OAuthTokens, skewMs = 60_000): boolean { if (!tokens.access_token) return false; return !isJwtExpired(tokens.access_token, skewMs); } @@ -28,10 +29,7 @@ export class EmaTransportOAuthProvider implements OAuthClientProvider { private readonly inner: BaseOAuthClientProvider; private readonly emaConfig: EmaFlowConfig; - constructor( - inner: BaseOAuthClientProvider, - emaConfig: EmaFlowConfig, - ) { + constructor(inner: BaseOAuthClientProvider, emaConfig: EmaFlowConfig) { this.inner = inner; this.emaConfig = emaConfig; } diff --git a/core/auth/ema/wire.ts b/core/auth/ema/wire.ts index 4f6bada6..a5f0170a 100644 --- a/core/auth/ema/wire.ts +++ b/core/auth/ema/wire.ts @@ -1,5 +1,8 @@ import { discoverAuthorizationServerMetadata } from "@modelcontextprotocol/client"; -import type { OAuthClientInformation, OAuthTokens } from "@modelcontextprotocol/client"; +import type { + OAuthClientInformation, + OAuthTokens, +} from "@modelcontextprotocol/client"; import { OAuthTokensSchema } from "@modelcontextprotocol/core"; import type { EnterpriseManagedAuthIdpConfig } from "../../client/types.js"; import { diff --git a/core/auth/mcpAuth.ts b/core/auth/mcpAuth.ts index e672e6cb..45b7b1e6 100644 --- a/core/auth/mcpAuth.ts +++ b/core/auth/mcpAuth.ts @@ -10,7 +10,14 @@ * (the same path v2 `auth()` takes when refresh cannot widen scope). */ -import { auth as sdkAuth, discoverOAuthServerInfo, isHttpsUrl, registerClient, selectResourceURL, startAuthorization } from "@modelcontextprotocol/client"; +import { + auth as sdkAuth, + discoverOAuthServerInfo, + isHttpsUrl, + registerClient, + selectResourceURL, + startAuthorization, +} from "@modelcontextprotocol/client"; import type { OAuthClientProvider } from "@modelcontextprotocol/client"; import type { FetchLike } from "@modelcontextprotocol/client"; /** diff --git a/core/auth/oauth-storage.ts b/core/auth/oauth-storage.ts index 87c2457f..cef19cc3 100644 --- a/core/auth/oauth-storage.ts +++ b/core/auth/oauth-storage.ts @@ -1,5 +1,12 @@ -import type { OAuthClientInformation, OAuthTokens, OAuthMetadata } from "@modelcontextprotocol/client"; -import { OAuthClientInformationSchema, OAuthTokensSchema } from "@modelcontextprotocol/core"; +import type { + OAuthClientInformation, + OAuthTokens, + OAuthMetadata, +} from "@modelcontextprotocol/client"; +import { + OAuthClientInformationSchema, + OAuthTokensSchema, +} from "@modelcontextprotocol/core"; import type { OAuthStorage } from "./storage.js"; import { type OAuthMemoryStore, type ServerOAuthState } from "./store.js"; import type { OAuthPersistBackend } from "./oauth-persist.js"; @@ -173,7 +180,9 @@ export class OAuthStorageBase implements OAuthStorage { async clearCodeVerifier(serverUrl: string): Promise { await this.ensureLoaded(); - this.memory.getState().setServerState(serverUrl, { codeVerifier: undefined }); + this.memory + .getState() + .setServerState(serverUrl, { codeVerifier: undefined }); await this.persist(); } @@ -206,7 +215,9 @@ export class OAuthStorageBase implements OAuthStorage { metadata: OAuthMetadata, ): Promise { await this.ensureLoaded(); - this.memory.getState().setServerState(serverUrl, { serverMetadata: metadata }); + this.memory + .getState() + .setServerState(serverUrl, { serverMetadata: metadata }); await this.persist(); } diff --git a/core/auth/providers.ts b/core/auth/providers.ts index 263f4b88..0ce42215 100644 --- a/core/auth/providers.ts +++ b/core/auth/providers.ts @@ -2,7 +2,12 @@ import type { OAuthClientProvider, OAuthClientInformationContext, } from "@modelcontextprotocol/client"; -import type { OAuthClientInformation, OAuthClientMetadata, OAuthTokens, OAuthMetadata } from "@modelcontextprotocol/client"; +import type { + OAuthClientInformation, + OAuthClientMetadata, + OAuthTokens, + OAuthMetadata, +} from "@modelcontextprotocol/client"; import type { OAuthStorage, SaveClientInformationOptions } from "./storage.js"; import { generateOAuthState } from "./utils.js"; @@ -210,9 +215,13 @@ export class BaseOAuthClientProvider implements OAuthClientProvider { options && "registrationKind" in options ? options.registrationKind : "dcr"; - await this.storage.saveClientInformation(this.serverUrl, clientInformation, { - registrationKind, - }); + await this.storage.saveClientInformation( + this.serverUrl, + clientInformation, + { + registrationKind, + }, + ); } async saveScope(scope: string | undefined): Promise { diff --git a/core/auth/storage.ts b/core/auth/storage.ts index 1e0e48f3..1af4d61f 100644 --- a/core/auth/storage.ts +++ b/core/auth/storage.ts @@ -1,4 +1,8 @@ -import type { OAuthClientInformation, OAuthTokens, OAuthMetadata } from "@modelcontextprotocol/client"; +import type { + OAuthClientInformation, + OAuthTokens, + OAuthMetadata, +} from "@modelcontextprotocol/client"; import type { OAuthClientRegistrationKind } from "./types.js"; /** diff --git a/core/auth/store.ts b/core/auth/store.ts index e29f61a2..ba72ff6f 100644 --- a/core/auth/store.ts +++ b/core/auth/store.ts @@ -3,7 +3,11 @@ * Persisted via `OAuthStorageBase` + `OAuthPersistBackend` backends. */ -import type { OAuthClientInformation, OAuthTokens, OAuthMetadata } from "@modelcontextprotocol/client"; +import type { + OAuthClientInformation, + OAuthTokens, + OAuthMetadata, +} from "@modelcontextprotocol/client"; import type { IdpSessionState, OAuthClientRegistrationKind, diff --git a/core/auth/types.ts b/core/auth/types.ts index 65c09e59..e40a7416 100644 --- a/core/auth/types.ts +++ b/core/auth/types.ts @@ -1,4 +1,10 @@ -import type { OAuthMetadata, OAuthClientInformation, OAuthClientInformationFull, OAuthTokens, OAuthProtectedResourceMetadata } from "@modelcontextprotocol/client"; +import type { + OAuthMetadata, + OAuthClientInformation, + OAuthClientInformationFull, + OAuthTokens, + OAuthProtectedResourceMetadata, +} from "@modelcontextprotocol/client"; // OAuth flow steps export type OAuthStep = diff --git a/core/mcp/__tests__/fakeInspectorClient.ts b/core/mcp/__tests__/fakeInspectorClient.ts index 518e4315..8eed2dd0 100644 --- a/core/mcp/__tests__/fakeInspectorClient.ts +++ b/core/mcp/__tests__/fakeInspectorClient.ts @@ -6,7 +6,17 @@ */ import { vi } from "vitest"; -import type { ClientCapabilities, Implementation, LoggingLevel, Prompt, Resource, ResourceTemplateType as ResourceTemplate, ServerCapabilities, Task, Tool } from "@modelcontextprotocol/client"; +import type { + ClientCapabilities, + Implementation, + LoggingLevel, + Prompt, + Resource, + ResourceTemplateType as ResourceTemplate, + ServerCapabilities, + Task, + Tool, +} from "@modelcontextprotocol/client"; import { InspectorClientEventTarget } from "../inspectorClientEventTarget.js"; import type { AppRendererClient, diff --git a/core/mcp/inspectorClient.ts b/core/mcp/inspectorClient.ts index 185387b9..34e7d03b 100644 --- a/core/mcp/inspectorClient.ts +++ b/core/mcp/inspectorClient.ts @@ -46,7 +46,38 @@ import { MessageTrackingTransport, type MessageTrackingCallbacks, } from "./messageTrackingTransport.js"; -import type { CallToolRequest, JSONRPCRequest, JSONRPCNotification, JSONRPCResultResponse, JSONRPCErrorResponse, ServerCapabilities, ClientCapabilities, Implementation, LoggingLevel, Tool, Resource, ResourceTemplateType as ResourceTemplate, Prompt, Root, CreateMessageRequest, CreateMessageResult, ElicitRequest, ElicitResult, ElicitRequestURLParams, CallToolResult, Task, Progress, ProgressToken, ListToolsRequest, ListResourcesRequest, ListResourceTemplatesRequest, ListPromptsRequest, ReadResourceRequest, GetPromptRequest, CompleteRequest } from "@modelcontextprotocol/client"; +import type { + CallToolRequest, + JSONRPCRequest, + JSONRPCNotification, + JSONRPCResultResponse, + JSONRPCErrorResponse, + ServerCapabilities, + ClientCapabilities, + Implementation, + LoggingLevel, + Tool, + Resource, + ResourceTemplateType as ResourceTemplate, + Prompt, + Root, + CreateMessageRequest, + CreateMessageResult, + ElicitRequest, + ElicitResult, + ElicitRequestURLParams, + CallToolResult, + Task, + Progress, + ProgressToken, + ListToolsRequest, + ListResourcesRequest, + ListResourceTemplatesRequest, + ListPromptsRequest, + ReadResourceRequest, + GetPromptRequest, + CompleteRequest, +} from "@modelcontextprotocol/client"; import type { Transport } from "@modelcontextprotocol/client"; import type { RequestOptions, @@ -633,9 +664,7 @@ export class InspectorClient extends InspectorClientEventTarget { internal._requestHandlers.set(method, (request, ctx) => { const task = (request as { params?: { task?: unknown } })?.params?.task; if (this.receiverTasks && task != null) { - return rawHandler( - request as CreateMessageRequest & ElicitRequest, - ); + return rawHandler(request as CreateMessageRequest & ElicitRequest); } return validating(request, ctx); }); @@ -723,7 +752,10 @@ export class InspectorClient extends InspectorClientEventTarget { private async getReceiverTaskPayload(taskId: string): Promise { const record = this.receiverTaskRecords.get(taskId); if (!record) { - throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Unknown taskId: ${taskId}`); + throw new ProtocolError( + ProtocolErrorCode.InvalidParams, + `Unknown taskId: ${taskId}`, + ); } return record.payloadPromise; } @@ -731,7 +763,10 @@ export class InspectorClient extends InspectorClientEventTarget { private cancelReceiverTask(taskId: string): Task { const record = this.receiverTaskRecords.get(taskId); if (!record) { - throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Unknown taskId: ${taskId}`); + throw new ProtocolError( + ProtocolErrorCode.InvalidParams, + `Unknown taskId: ${taskId}`, + ); } if (InspectorClient.isTerminalTaskStatus(record.task.status)) { return record.task; @@ -1012,7 +1047,10 @@ export class InspectorClient extends InspectorClientEventTarget { this.addPendingSample(samplingRequest); }); }; - this.client.setRequestHandler("sampling/createMessage", samplingHandler); + this.client.setRequestHandler( + "sampling/createMessage", + samplingHandler, + ); if (this.receiverTasks) { this.installReceiverTaskResponseBypass( "sampling/createMessage", @@ -2001,7 +2039,14 @@ export class InspectorClient extends InspectorClientEventTarget { result as CallToolResult, ); if (outputValidationError && !options?.skipOutputValidation) { - throw new Error(outputValidationError); + // Match the prior contract: on v1 a strict output-schema violation + // surfaced as the SDK's typed `McpError`/`ProtocolError` (code + // InvalidParams), not a bare Error — so downstream code that branches on + // `instanceof ProtocolError` / `error.code` keeps working. + throw new ProtocolError( + ProtocolErrorCode.InvalidParams, + outputValidationError, + ); } const invocation: ToolCallInvocation = { @@ -2161,6 +2206,14 @@ export class InspectorClient extends InspectorClientEventTarget { ); // The SDK registers the progress handler synchronously while constructing // the request promise (before this await), so the new key is present now. + // ASSUMES SERIAL CONSTRUCTION: `find` takes the first key not present in the + // pre-request snapshot, which is unambiguous only because no OTHER request + // registers a progress handler between the snapshot and this request's + // synchronous registration. Tool calls are user-driven and serial, so that + // holds today; if concurrent task-augmented calls are ever constructed in + // the same microtask window, two subscription ids could cross-wire and this + // must move to an SDK-supported correlation (see the delete-when-native note + // on `installReceiverTaskResponseBypass`). const progressSubscriptionId = requestOptions.onprogress ? [...progressHandlers.keys()].find((k) => !keysBeforeRequest.has(k)) : undefined; diff --git a/core/mcp/inspectorClientEventTarget.ts b/core/mcp/inspectorClientEventTarget.ts index 57e386ab..c7da5094 100644 --- a/core/mcp/inspectorClientEventTarget.ts +++ b/core/mcp/inspectorClientEventTarget.ts @@ -24,7 +24,17 @@ import type { ResourceReadInvocation, ResourceTemplateReadInvocation, } from "./types.js"; -import type { Tool, ServerCapabilities, Implementation, Root, Progress, ProgressToken, Task, CallToolResult, ProtocolError } from "@modelcontextprotocol/client"; +import type { + Tool, + ServerCapabilities, + Implementation, + Root, + Progress, + ProgressToken, + Task, + CallToolResult, + ProtocolError, +} from "@modelcontextprotocol/client"; import type { SamplingCreateMessage } from "./samplingCreateMessage.js"; import type { ElicitationCreateMessage } from "./elicitationCreateMessage.js"; import type { JsonValue } from "../json/jsonUtils.js"; diff --git a/core/mcp/inspectorClientProtocol.ts b/core/mcp/inspectorClientProtocol.ts index f052b8e4..78d02158 100644 --- a/core/mcp/inspectorClientProtocol.ts +++ b/core/mcp/inspectorClientProtocol.ts @@ -20,7 +20,17 @@ import type { PromptGetInvocation, ToolCallInvocation, } from "./types.js"; -import type { ClientCapabilities, Implementation, LoggingLevel, Prompt, Resource, ResourceTemplateType as ResourceTemplate, ServerCapabilities, Task, Tool } from "@modelcontextprotocol/client"; +import type { + ClientCapabilities, + Implementation, + LoggingLevel, + Prompt, + Resource, + ResourceTemplateType as ResourceTemplate, + ServerCapabilities, + Task, + Tool, +} from "@modelcontextprotocol/client"; import type { JsonValue } from "../json/jsonUtils.js"; import type { InspectorClientEventTarget } from "./inspectorClientEventTarget.js"; import type { SamplingCreateMessage } from "./samplingCreateMessage.js"; diff --git a/core/mcp/messageTrackingTransport.ts b/core/mcp/messageTrackingTransport.ts index 28dd896f..d5515880 100644 --- a/core/mcp/messageTrackingTransport.ts +++ b/core/mcp/messageTrackingTransport.ts @@ -1,6 +1,17 @@ -import type { Transport, TransportSendOptions } from "@modelcontextprotocol/client"; -import type { JSONRPCMessage, MessageExtraInfo } from "@modelcontextprotocol/client"; -import type { JSONRPCRequest, JSONRPCNotification, JSONRPCResultResponse, JSONRPCErrorResponse } from "@modelcontextprotocol/client"; +import type { + Transport, + TransportSendOptions, +} from "@modelcontextprotocol/client"; +import type { + JSONRPCMessage, + MessageExtraInfo, +} from "@modelcontextprotocol/client"; +import type { + JSONRPCRequest, + JSONRPCNotification, + JSONRPCResultResponse, + JSONRPCErrorResponse, +} from "@modelcontextprotocol/client"; import type { MessageOrigin } from "./types.js"; export interface MessageTrackingCallbacks { @@ -21,10 +32,7 @@ export class MessageTrackingTransport implements Transport { private callbacks: MessageTrackingCallbacks; private negotiatedProtocolVersion?: string; - constructor( - baseTransport: Transport, - callbacks: MessageTrackingCallbacks, - ) { + constructor(baseTransport: Transport, callbacks: MessageTrackingCallbacks) { this.baseTransport = baseTransport; this.callbacks = callbacks; } diff --git a/core/mcp/oauthManager.ts b/core/mcp/oauthManager.ts index 790077d1..64b0b461 100644 --- a/core/mcp/oauthManager.ts +++ b/core/mcp/oauthManager.ts @@ -286,8 +286,7 @@ export class OAuthManager { try { if (this.isEnterpriseManaged()) { const emaConfig = await this.getEmaFlowConfig(); - const scopeForMint = - this.pendingAuthorizationScope ?? emaConfig.scope; + const scopeForMint = this.pendingAuthorizationScope ?? emaConfig.scope; const config = scopeForMint ? { ...emaConfig, scope: scopeForMint } : emaConfig; @@ -449,7 +448,9 @@ export class OAuthManager { */ async refreshEnterpriseManagedTokens(): Promise { if (!this.isEnterpriseManaged()) return false; - const tokens = await refreshEmaResourceTokens(await this.getEmaFlowConfig()); + const tokens = await refreshEmaResourceTokens( + await this.getEmaFlowConfig(), + ); return tokens !== undefined; } diff --git a/core/mcp/remote/node/tokenAuthProvider.ts b/core/mcp/remote/node/tokenAuthProvider.ts index b10676b5..2bf8a9df 100644 --- a/core/mcp/remote/node/tokenAuthProvider.ts +++ b/core/mcp/remote/node/tokenAuthProvider.ts @@ -1,5 +1,9 @@ import type { OAuthClientProvider } from "@modelcontextprotocol/client"; -import type { OAuthClientInformation, OAuthClientMetadata, OAuthTokens } from "@modelcontextprotocol/client"; +import type { + OAuthClientInformation, + OAuthClientMetadata, + OAuthTokens, +} from "@modelcontextprotocol/client"; import type { RemoteAuthState } from "../types.js"; const REMOTE_OAUTH_STUB_METADATA: OAuthClientMetadata = { diff --git a/core/mcp/remote/remoteClientTransport.ts b/core/mcp/remote/remoteClientTransport.ts index 2244dfcf..2a80a3f9 100644 --- a/core/mcp/remote/remoteClientTransport.ts +++ b/core/mcp/remote/remoteClientTransport.ts @@ -3,8 +3,14 @@ * Pure TypeScript; works in browser, Deno, or Node. */ -import type { Transport, TransportSendOptions } from "@modelcontextprotocol/client"; -import type { JSONRPCMessage, MessageExtraInfo } from "@modelcontextprotocol/client"; +import type { + Transport, + TransportSendOptions, +} from "@modelcontextprotocol/client"; +import type { + JSONRPCMessage, + MessageExtraInfo, +} from "@modelcontextprotocol/client"; import type { InspectorServerSettings, StderrLogEntry } from "../types.js"; import type { FetchRequestEntryBase } from "../types.js"; import type { diff --git a/core/mcp/samplingCreateMessage.ts b/core/mcp/samplingCreateMessage.ts index 301373e9..b03b098f 100644 --- a/core/mcp/samplingCreateMessage.ts +++ b/core/mcp/samplingCreateMessage.ts @@ -1,4 +1,7 @@ -import type { CreateMessageRequest, CreateMessageResult } from "@modelcontextprotocol/client"; +import type { + CreateMessageRequest, + CreateMessageResult, +} from "@modelcontextprotocol/client"; import { RELATED_TASK_META_KEY } from "@modelcontextprotocol/client"; export type { CreateMessageRequest, CreateMessageResult }; diff --git a/core/mcp/serverList.ts b/core/mcp/serverList.ts index 1289e871..58f7646f 100644 --- a/core/mcp/serverList.ts +++ b/core/mcp/serverList.ts @@ -106,9 +106,7 @@ type StoredInspectorFields = Pick< export function envRecordToPairs( env: Record | undefined, ): { key: string; value: string }[] { - return env - ? Object.entries(env).map(([key, value]) => ({ key, value })) - : []; + return env ? Object.entries(env).map(([key, value]) => ({ key, value })) : []; } /** @@ -232,9 +230,7 @@ export function inspectorSettingsToStoredFields( out.headers = headersRecord; } - const metadataFiltered = settings.metadata.filter( - (m) => m.key.trim() !== "", - ); + const metadataFiltered = settings.metadata.filter((m) => m.key.trim() !== ""); if (metadataFiltered.length > 0) { out.metadata = metadataFiltered; } @@ -333,9 +329,7 @@ export const INSPECTOR_FIELD_KEYS = new Set( * `satisfies` constraint above forces the map update, which propagates * here. */ -export function stripInspectorFields( - stored: StoredMCPServer, -): MCPServerConfig { +export function stripInspectorFields(stored: StoredMCPServer): MCPServerConfig { const out: Record = {}; for (const [k, v] of Object.entries( stored as unknown as Record, @@ -361,7 +355,9 @@ export function mcpConfigToServerEntries(config: MCPConfig): ServerEntry[] { // `InspectorServerSettings` only. const inspectorFields: StoredInspectorFields = {}; const sdkOnly: Record = {}; - for (const [k, v] of Object.entries(raw as unknown as Record)) { + for (const [k, v] of Object.entries( + raw as unknown as Record, + )) { if (INSPECTOR_FIELD_KEYS.has(k as keyof StoredInspectorFields)) { (inspectorFields as Record)[k] = v; } else { diff --git a/core/mcp/state/managedListState.ts b/core/mcp/state/managedListState.ts index 809acfc3..0cf67137 100644 --- a/core/mcp/state/managedListState.ts +++ b/core/mcp/state/managedListState.ts @@ -194,9 +194,10 @@ export abstract class ManagedListState< * concrete subclass event maps keep the call sites type-safe. */ private emit(type: keyof M, detail: unknown): void { - ( - this.dispatchTypedEvent as unknown as (t: keyof M, d: unknown) => void - )(type, detail); + (this.dispatchTypedEvent as unknown as (t: keyof M, d: unknown) => void)( + type, + detail, + ); } private setListChanged(value: boolean): void { diff --git a/core/mcp/toolOutputValidation.ts b/core/mcp/toolOutputValidation.ts index b834c45c..add2c81e 100644 --- a/core/mcp/toolOutputValidation.ts +++ b/core/mcp/toolOutputValidation.ts @@ -1,5 +1,8 @@ import type { CallToolResult, Tool } from "@modelcontextprotocol/client"; -import type { JsonSchemaType, jsonSchemaValidator } from "@modelcontextprotocol/client"; +import type { + JsonSchemaType, + jsonSchemaValidator, +} from "@modelcontextprotocol/client"; /** * Validate a delivered tool result's `structuredContent` against the tool's diff --git a/core/mcp/types.ts b/core/mcp/types.ts index a34ed710..19278541 100644 --- a/core/mcp/types.ts +++ b/core/mcp/types.ts @@ -1,4 +1,23 @@ -import type { CallToolResult, ClientNotification, ClientRequest, GetPromptResult, Implementation, JSONRPCErrorResponse, JSONRPCNotification, JSONRPCRequest, JSONRPCResultResponse, LoggingLevel, Prompt, ReadResourceResult, Resource, Root, ServerCapabilities, ServerNotification, ServerRequest, Tool } from "@modelcontextprotocol/client"; +import type { + CallToolResult, + ClientNotification, + ClientRequest, + GetPromptResult, + Implementation, + JSONRPCErrorResponse, + JSONRPCNotification, + JSONRPCRequest, + JSONRPCResultResponse, + LoggingLevel, + Prompt, + ReadResourceResult, + Resource, + Root, + ServerCapabilities, + ServerNotification, + ServerRequest, + Tool, +} from "@modelcontextprotocol/client"; import type { Client } from "@modelcontextprotocol/client"; import type { OAuthClientProvider } from "@modelcontextprotocol/client"; import type { Transport } from "@modelcontextprotocol/client"; @@ -149,7 +168,9 @@ export type ConnectionStatus = * (see InspectorClient's `onclose` handler, #1490). A bare `=== "disconnected"` * check would therefore tear down in one ordering but not the other. */ -export function isTerminalStatus(status: ConnectionStatus | undefined): boolean { +export function isTerminalStatus( + status: ConnectionStatus | undefined, +): boolean { return status === "disconnected" || status === "error"; } diff --git a/core/mcp/urlElicitation.ts b/core/mcp/urlElicitation.ts index facdce6c..5e33b11c 100644 --- a/core/mcp/urlElicitation.ts +++ b/core/mcp/urlElicitation.ts @@ -1,4 +1,8 @@ -import { ProtocolErrorCode, ProtocolError, UrlElicitationRequiredError } from "@modelcontextprotocol/client"; +import { + ProtocolErrorCode, + ProtocolError, + UrlElicitationRequiredError, +} from "@modelcontextprotocol/client"; import type { ElicitRequestURLParams } from "@modelcontextprotocol/client"; export type { ElicitRequestURLParams }; @@ -46,7 +50,10 @@ export function getUrlElicitationsFromError( if (error instanceof UrlElicitationRequiredError) { return error.elicitations ?? []; } - if (error instanceof ProtocolError && error.code === ProtocolErrorCode.UrlElicitationRequired) { + if ( + error instanceof ProtocolError && + error.code === ProtocolErrorCode.UrlElicitationRequired + ) { const data = error.data as | { elicitations?: ElicitRequestURLParams[] } | undefined; diff --git a/core/react/useInspectorClient.ts b/core/react/useInspectorClient.ts index b9c0e023..a7bc6485 100644 --- a/core/react/useInspectorClient.ts +++ b/core/react/useInspectorClient.ts @@ -3,7 +3,11 @@ import type { InspectorClientProtocol } from "../mcp/inspectorClientProtocol.js" import type { AppRendererClient } from "../mcp/inspectorClientProtocol.js"; import type { TypedEvent } from "../mcp/inspectorClientEventTarget.js"; import type { ConnectionStatus } from "../mcp/types.js"; -import type { ClientCapabilities, ServerCapabilities, Implementation } from "@modelcontextprotocol/client"; +import type { + ClientCapabilities, + ServerCapabilities, + Implementation, +} from "@modelcontextprotocol/client"; // Module-scope frozen object so the `?? EMPTY_CLIENT_CAPABILITIES` // fallback below doesn't return a fresh literal on every render — diff --git a/core/react/useManagedPrompts.ts b/core/react/useManagedPrompts.ts index 39ed10a0..cacb8bd8 100644 --- a/core/react/useManagedPrompts.ts +++ b/core/react/useManagedPrompts.ts @@ -55,10 +55,7 @@ export function useManagedPrompts( onListChangedChange, ); return () => { - managedPromptsState.removeEventListener( - "promptsChange", - onPromptsChange, - ); + managedPromptsState.removeEventListener("promptsChange", onPromptsChange); managedPromptsState.removeEventListener( "listChangedChange", onListChangedChange, diff --git a/core/react/usePagedRequestorTasks.ts b/core/react/usePagedRequestorTasks.ts index 6ef84b31..aefb4cc7 100644 --- a/core/react/usePagedRequestorTasks.ts +++ b/core/react/usePagedRequestorTasks.ts @@ -39,10 +39,7 @@ export function usePagedRequestorTasks( setTasks(pagedRequestorTasksState.getTasks()); setNextCursor(pagedRequestorTasksState.getNextCursor() ?? undefined); const onTasksChange = ( - event: TypedEventGeneric< - PagedRequestorTasksStateEventMap, - "tasksChange" - >, + event: TypedEventGeneric, ) => { setTasks(event.detail); setNextCursor(pagedRequestorTasksState.getNextCursor() ?? undefined); diff --git a/core/react/usePagedTools.ts b/core/react/usePagedTools.ts index 61c6e0fc..0f9254aa 100644 --- a/core/react/usePagedTools.ts +++ b/core/react/usePagedTools.ts @@ -21,9 +21,7 @@ export function usePagedTools( client: InspectorClientProtocol | null, pagedToolsState: PagedToolsState | null, ): UsePagedToolsResult { - const [tools, setTools] = useState( - pagedToolsState?.getTools() ?? [], - ); + const [tools, setTools] = useState(pagedToolsState?.getTools() ?? []); useEffect(() => { if (!pagedToolsState) {