@executor-js/plugin-mcp 0.0.1-beta.6 → 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/README.md +19 -15
- package/dist/api/group.d.ts +114 -147
- package/dist/api/handlers.d.ts +2 -2
- package/dist/api/handlers.test.d.ts +1 -0
- package/dist/chunk-DJANY5EU.js +1325 -0
- package/dist/chunk-DJANY5EU.js.map +1 -0
- package/dist/core.js +8 -52
- package/dist/core.js.map +1 -1
- package/dist/index.js +2 -5
- package/dist/index.js.map +1 -1
- package/dist/promise.d.ts +2 -6
- package/dist/react/AddMcpSource.d.ts +2 -0
- package/dist/react/McpSignInButton.d.ts +3 -0
- package/dist/react/atoms.d.ts +153 -0
- package/dist/react/client.d.ts +437 -3
- package/dist/react/index.d.ts +3 -2
- package/dist/react/source-plugin.d.ts +13 -1
- package/dist/sdk/binding-store.d.ts +74 -18
- package/dist/sdk/connection-pool.test.d.ts +1 -0
- package/dist/sdk/connection.d.ts +3 -1
- package/dist/sdk/cross-user-isolation.test.d.ts +1 -0
- package/dist/sdk/errors.d.ts +15 -23
- package/dist/sdk/index.d.ts +3 -3
- package/dist/sdk/invoke.d.ts +18 -17
- package/dist/sdk/manifest.d.ts +1 -0
- package/dist/sdk/per-user-auth-isolation.test.d.ts +1 -0
- package/dist/sdk/plugin.d.ts +109 -43
- package/dist/sdk/probe-shape.d.ts +39 -0
- package/dist/sdk/probe-shape.test.d.ts +1 -0
- package/dist/sdk/stdio-connector.d.ts +8 -0
- package/dist/sdk/stored-source.d.ts +31 -105
- package/dist/sdk/types.d.ts +77 -93
- package/dist/stdio-connector-KNHLETKM.js +12 -0
- package/dist/stdio-connector-KNHLETKM.js.map +1 -0
- package/package.json +11 -21
- package/dist/chunk-NJ4CITCV.js +0 -1203
- package/dist/chunk-NJ4CITCV.js.map +0 -1
- package/dist/react/McpSourceSummary.d.ts +0 -3
- package/dist/sdk/config-file-store.d.ts +0 -10
- package/dist/sdk/oauth.d.ts +0 -36
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdk/binding-store.ts","../src/sdk/types.ts","../src/sdk/plugin.ts","../src/sdk/connection.ts","../src/sdk/errors.ts","../src/sdk/oauth.ts","../src/sdk/discover.ts","../src/sdk/manifest.ts","../src/sdk/invoke.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// McpBindingStore — plugin's own storage for tool bindings + source data\n// ---------------------------------------------------------------------------\n\nimport { Effect, Schema } from \"effect\";\nimport { makeInMemoryScopedKv, scopeKv, type Kv, type ToolId, type ScopedKv } from \"@executor/sdk\";\n\nimport { McpToolBinding } from \"./types\";\nimport type { McpStoredSourceData } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Stored source — combines meta + config into one entry\n// ---------------------------------------------------------------------------\n\nexport interface McpStoredSource {\n readonly namespace: string;\n readonly name: string;\n readonly config: McpStoredSourceData;\n}\n\n// ---------------------------------------------------------------------------\n// Stored binding schema\n// ---------------------------------------------------------------------------\n\nconst StoredBindingEntry = Schema.Struct({\n namespace: Schema.String,\n binding: McpToolBinding,\n sourceData: Schema.Unknown,\n});\n\nconst encodeBindingEntry = Schema.encodeSync(Schema.parseJson(StoredBindingEntry));\nconst decodeBindingEntry = Schema.decodeUnknownSync(Schema.parseJson(StoredBindingEntry));\n\n// ---------------------------------------------------------------------------\n// Store interface\n// ---------------------------------------------------------------------------\n\nexport interface McpBindingStore {\n readonly get: (toolId: ToolId) => Effect.Effect<{\n binding: McpToolBinding;\n sourceData: McpStoredSourceData;\n } | null>;\n\n readonly put: (\n toolId: ToolId,\n namespace: string,\n binding: McpToolBinding,\n sourceData: McpStoredSourceData,\n ) => Effect.Effect<void>;\n\n readonly remove: (toolId: ToolId) => Effect.Effect<void>;\n\n readonly listByNamespace: (namespace: string) => Effect.Effect<readonly ToolId[]>;\n\n readonly removeByNamespace: (namespace: string) => Effect.Effect<readonly ToolId[]>;\n\n readonly putSource: (source: McpStoredSource) => Effect.Effect<void>;\n readonly removeSource: (namespace: string) => Effect.Effect<void>;\n readonly listSources: () => Effect.Effect<readonly McpStoredSource[]>;\n readonly getSource: (namespace: string) => Effect.Effect<McpStoredSource | null>;\n readonly getSourceConfig: (namespace: string) => Effect.Effect<McpStoredSourceData | null>;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation — two KV namespaces: bindings + sources\n// ---------------------------------------------------------------------------\n\nconst makeStore = (bindings: ScopedKv, sources: ScopedKv): McpBindingStore => ({\n // ---- Bindings ----\n\n get: (toolId) =>\n Effect.gen(function* () {\n const raw = yield* bindings.get(toolId);\n if (!raw) return null;\n const entry = decodeBindingEntry(raw);\n return {\n binding: entry.binding as McpToolBinding,\n sourceData: entry.sourceData as McpStoredSourceData,\n };\n }),\n\n put: (toolId, namespace, binding, sourceData) =>\n bindings.set([{ key: toolId, value: encodeBindingEntry({ namespace, binding, sourceData }) }]),\n\n remove: (toolId) => bindings.delete([toolId]).pipe(Effect.asVoid),\n\n listByNamespace: (namespace) =>\n Effect.gen(function* () {\n const entries = yield* bindings.list();\n const ids: ToolId[] = [];\n for (const e of entries) {\n const entry = decodeBindingEntry(e.value);\n if (entry.namespace === namespace) ids.push(e.key as ToolId);\n }\n return ids;\n }),\n\n removeByNamespace: (namespace) =>\n Effect.gen(function* () {\n const entries = yield* bindings.list();\n const ids: ToolId[] = [];\n for (const e of entries) {\n const entry = decodeBindingEntry(e.value);\n if (entry.namespace === namespace) ids.push(e.key as ToolId);\n }\n if (ids.length > 0) yield* bindings.delete(ids);\n return ids;\n }),\n\n // ---- Sources (meta + config combined) ----\n\n putSource: (source) => sources.set([{ key: source.namespace, value: JSON.stringify(source) }]),\n\n removeSource: (namespace) => sources.delete([namespace]).pipe(Effect.asVoid),\n\n listSources: () =>\n Effect.gen(function* () {\n const entries = yield* sources.list();\n return entries.map((e) => JSON.parse(e.value) as McpStoredSource);\n }),\n\n getSource: (namespace) =>\n Effect.gen(function* () {\n const raw = yield* sources.get(namespace);\n if (!raw) return null;\n // @effect-diagnostics-next-line preferSchemaOverJson:off\n return JSON.parse(raw) as McpStoredSource;\n }),\n\n getSourceConfig: (namespace) =>\n Effect.gen(function* () {\n const raw = yield* sources.get(namespace);\n if (!raw) return null;\n // @effect-diagnostics-next-line preferSchemaOverJson:off\n const source = JSON.parse(raw) as McpStoredSource;\n return source.config;\n }),\n});\n\n// ---------------------------------------------------------------------------\n// Factory from global Kv — two scoped sub-namespaces\n// ---------------------------------------------------------------------------\n\nexport const makeKvBindingStore = (kv: Kv, namespace: string): McpBindingStore =>\n makeStore(scopeKv(kv, `${namespace}.bindings`), scopeKv(kv, `${namespace}.sources`));\n\n// ---------------------------------------------------------------------------\n// In-memory convenience\n// ---------------------------------------------------------------------------\n\nexport const makeInMemoryBindingStore = (): McpBindingStore =>\n makeStore(makeInMemoryScopedKv(), makeInMemoryScopedKv());\n","import { Schema } from \"effect\";\n\n// ---------------------------------------------------------------------------\n// Remote transport type\n// ---------------------------------------------------------------------------\n\nexport const McpRemoteTransport = Schema.Literal(\"streamable-http\", \"sse\", \"auto\");\nexport type McpRemoteTransport = typeof McpRemoteTransport.Type;\n\n/** All transport types (used in the connector layer) */\nexport const McpTransport = Schema.Literal(\"streamable-http\", \"sse\", \"stdio\", \"auto\");\nexport type McpTransport = typeof McpTransport.Type;\n\n// ---------------------------------------------------------------------------\n// Connection auth (only applies to remote sources)\n// ---------------------------------------------------------------------------\n\nexport const McpConnectionAuth = Schema.Union(\n Schema.Struct({ kind: Schema.Literal(\"none\") }),\n Schema.Struct({\n kind: Schema.Literal(\"header\"),\n headerName: Schema.String,\n secretId: Schema.String,\n prefix: Schema.optional(Schema.String),\n }),\n Schema.Struct({\n kind: Schema.Literal(\"oauth2\"),\n accessTokenSecretId: Schema.String,\n refreshTokenSecretId: Schema.NullOr(Schema.String),\n tokenType: Schema.optionalWith(Schema.String, { default: () => \"Bearer\" }),\n expiresAt: Schema.NullOr(Schema.Number),\n scope: Schema.NullOr(Schema.String),\n }),\n);\nexport type McpConnectionAuth = typeof McpConnectionAuth.Type;\n\n// ---------------------------------------------------------------------------\n// Stored source data — discriminated union on transport\n// ---------------------------------------------------------------------------\n\n/** Common fields for remote string map schemas */\nconst StringMap = Schema.Record({ key: Schema.String, value: Schema.String });\n\nexport const McpRemoteSourceData = Schema.Struct({\n transport: Schema.Literal(\"remote\"),\n /** The MCP server endpoint URL */\n endpoint: Schema.String,\n /** Transport preference for this remote source */\n remoteTransport: Schema.optionalWith(McpRemoteTransport, { default: () => \"auto\" as const }),\n /** Extra query params appended to the endpoint URL */\n queryParams: Schema.optional(StringMap),\n /** Extra headers sent on every request */\n headers: Schema.optional(StringMap),\n /** Auth configuration */\n auth: McpConnectionAuth,\n});\nexport type McpRemoteSourceData = typeof McpRemoteSourceData.Type;\n\nexport const McpStdioSourceData = Schema.Struct({\n transport: Schema.Literal(\"stdio\"),\n /** The command to run */\n command: Schema.String,\n /** Arguments to the command */\n args: Schema.optional(Schema.Array(Schema.String)),\n /** Environment variables */\n env: Schema.optional(StringMap),\n /** Working directory */\n cwd: Schema.optional(Schema.String),\n});\nexport type McpStdioSourceData = typeof McpStdioSourceData.Type;\n\nexport const McpStoredSourceData = Schema.Union(McpRemoteSourceData, McpStdioSourceData);\nexport type McpStoredSourceData = typeof McpStoredSourceData.Type;\n\n// ---------------------------------------------------------------------------\n// Tool binding — maps a registered ToolId back to the MCP tool name\n// ---------------------------------------------------------------------------\n\nexport class McpToolBinding extends Schema.Class<McpToolBinding>(\"McpToolBinding\")({\n toolId: Schema.String,\n toolName: Schema.String,\n description: Schema.NullOr(Schema.String),\n inputSchema: Schema.optional(Schema.Unknown),\n outputSchema: Schema.optional(Schema.Unknown),\n}) {}\n","import { Effect, Exit, ScopedCache, Duration, Scope } from \"effect\";\n\nimport type { OAuthClientProvider } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type { OAuthTokens } from \"@modelcontextprotocol/sdk/shared/auth.js\";\nimport {\n Source,\n SourceDetectionResult,\n definePlugin,\n type ExecutorPlugin,\n type PluginContext,\n ToolId,\n SecretId,\n type ToolRegistration,\n} from \"@executor/sdk\";\n\nimport { type McpStoredSourceData, type McpConnectionAuth, McpToolBinding } from \"./types\";\nimport {\n makeInMemoryBindingStore,\n type McpBindingStore,\n type McpStoredSource,\n} from \"./binding-store\";\nimport { createMcpConnector, type McpConnection, type ConnectorInput } from \"./connection\";\nimport { McpConnectionError, McpOAuthError, McpToolDiscoveryError } from \"./errors\";\nimport { startMcpOAuthAuthorization, exchangeMcpOAuthCode, type McpOAuthSession } from \"./oauth\";\nimport { discoverTools } from \"./discover\";\nimport { makeMcpInvoker } from \"./invoke\";\nimport { deriveMcpNamespace, joinToolPath, type McpToolManifestEntry } from \"./manifest\";\n\n// ---------------------------------------------------------------------------\n// Plugin config — discriminated union on transport\n// ---------------------------------------------------------------------------\n\nexport interface McpRemoteSourceConfig {\n readonly transport: \"remote\";\n readonly name: string;\n readonly endpoint: string;\n readonly remoteTransport?: \"streamable-http\" | \"sse\" | \"auto\";\n readonly queryParams?: Record<string, string>;\n readonly headers?: Record<string, string>;\n readonly namespace?: string;\n readonly auth?: McpConnectionAuth;\n}\n\nexport interface McpStdioSourceConfig {\n readonly transport: \"stdio\";\n readonly name: string;\n readonly command: string;\n readonly args?: string[];\n readonly env?: Record<string, string>;\n readonly cwd?: string;\n readonly namespace?: string;\n}\n\nexport type McpSourceConfig = McpRemoteSourceConfig | McpStdioSourceConfig;\n\n// ---------------------------------------------------------------------------\n// Plugin extension types\n// ---------------------------------------------------------------------------\n\nexport interface McpOAuthStartInput {\n readonly endpoint: string;\n readonly redirectUrl: string;\n readonly queryParams?: Record<string, string> | null;\n}\n\nexport interface McpOAuthStartResponse {\n readonly sessionId: string;\n readonly authorizationUrl: string;\n}\n\nexport interface McpOAuthCompleteInput {\n readonly state: string;\n readonly code?: string;\n readonly error?: string;\n}\n\nexport interface McpOAuthCompleteResponse {\n readonly accessTokenSecretId: string;\n readonly refreshTokenSecretId: string | null;\n readonly tokenType: string;\n readonly expiresAt: number | null;\n readonly scope: string | null;\n}\n\nexport interface McpProbeResult {\n readonly connected: boolean;\n readonly requiresOAuth: boolean;\n readonly name: string;\n readonly namespace: string;\n readonly toolCount: number | null;\n readonly serverName: string | null;\n}\n\nexport interface McpUpdateSourceInput {\n readonly endpoint?: string;\n readonly headers?: Record<string, string>;\n readonly queryParams?: Record<string, string>;\n readonly auth?: McpConnectionAuth;\n}\n\nexport interface McpPluginExtension {\n readonly probeEndpoint: (endpoint: string) => Effect.Effect<McpProbeResult, Error>;\n\n readonly addSource: (\n config: McpSourceConfig,\n ) => Effect.Effect<{ readonly toolCount: number; readonly namespace: string }, Error>;\n\n readonly removeSource: (namespace: string) => Effect.Effect<void>;\n\n readonly refreshSource: (\n namespace: string,\n ) => Effect.Effect<{ readonly toolCount: number }, Error>;\n\n readonly startOAuth: (input: McpOAuthStartInput) => Effect.Effect<McpOAuthStartResponse, Error>;\n\n readonly completeOAuth: (\n input: McpOAuthCompleteInput,\n ) => Effect.Effect<McpOAuthCompleteResponse, Error>;\n\n /** Fetch the full stored source by namespace (or null if missing) */\n readonly getSource: (namespace: string) => Effect.Effect<McpStoredSource | null>;\n\n /** Update config for an existing remote MCP source */\n readonly updateSource: (namespace: string, input: McpUpdateSourceInput) => Effect.Effect<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst toRegistration = (entry: McpToolManifestEntry, namespace: string): ToolRegistration => ({\n id: ToolId.make(joinToolPath(namespace, entry.toolId)),\n pluginKey: \"mcp\",\n sourceId: namespace,\n name: entry.toolName,\n description: entry.description ?? `MCP tool: ${entry.toolName}`,\n inputSchema: entry.inputSchema,\n outputSchema: entry.outputSchema,\n});\n\nconst toBinding = (entry: McpToolManifestEntry): McpToolBinding =>\n new McpToolBinding({\n toolId: entry.toolId,\n toolName: entry.toolName,\n description: entry.description,\n inputSchema: entry.inputSchema,\n outputSchema: entry.outputSchema,\n });\n\nconst toStoredSourceData = (config: McpSourceConfig): McpStoredSourceData => {\n if (config.transport === \"stdio\") {\n return {\n transport: \"stdio\",\n command: config.command,\n args: config.args,\n env: config.env,\n cwd: config.cwd,\n };\n }\n return {\n transport: \"remote\",\n endpoint: config.endpoint,\n remoteTransport: config.remoteTransport ?? \"auto\",\n queryParams: config.queryParams,\n headers: config.headers,\n auth: config.auth ?? { kind: \"none\" },\n };\n};\n\nconst normalizeNamespace = (config: McpSourceConfig): string =>\n config.namespace ??\n deriveMcpNamespace({\n name: config.name,\n endpoint: config.transport === \"remote\" ? config.endpoint : undefined,\n command: config.transport === \"stdio\" ? config.command : undefined,\n });\n\nconst makeOAuthProvider = (\n accessToken: string,\n tokenType: string,\n refreshToken?: string,\n): OAuthClientProvider => ({\n get redirectUrl() {\n return \"http://localhost/oauth/callback\";\n },\n get clientMetadata() {\n return {\n redirect_uris: [\"http://localhost/oauth/callback\"],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\" as const,\n client_name: \"Executor\",\n };\n },\n clientInformation: () => undefined,\n saveClientInformation: () => {},\n tokens: async (): Promise<OAuthTokens> => ({\n access_token: accessToken,\n token_type: tokenType,\n ...(refreshToken ? { refresh_token: refreshToken } : {}),\n }),\n saveTokens: async () => {},\n redirectToAuthorization: async () => {\n throw new Error(\"MCP OAuth re-authorization required\");\n },\n saveCodeVerifier: () => {},\n codeVerifier: () => {\n throw new Error(\"No active PKCE verifier\");\n },\n saveDiscoveryState: () => {},\n discoveryState: () => undefined,\n});\n\nconst remoteConnectionError = (message: string) =>\n new McpConnectionError({ transport: \"remote\", message });\n\nconst mcpOAuthError = (message: string) => new McpOAuthError({ message });\n\nconst mcpDiscoveryError = (message: string) =>\n new McpToolDiscoveryError({ stage: \"list_tools\", message });\n\n// ---------------------------------------------------------------------------\n// Plugin factory\n// ---------------------------------------------------------------------------\n\nexport const mcpPlugin = (options?: {\n readonly bindingStore?: McpBindingStore;\n}): ExecutorPlugin<\"mcp\", McpPluginExtension> => {\n const bindingStore = options?.bindingStore ?? makeInMemoryBindingStore();\n const addedSources = new Map<string, Source>();\n const oauthSessions = new Map<string, McpOAuthSession>();\n\n return definePlugin({\n key: \"mcp\",\n init: (ctx: PluginContext) =>\n Effect.gen(function* () {\n // Create a long-lived scope for the connection cache\n const cacheScope = yield* Scope.make();\n\n // Side-channel for deferred connector lookup (populated before\n // each cache.get call so the lookup knows how to connect)\n const pendingConnectors = new Map<\n string,\n Effect.Effect<McpConnection, McpConnectionError>\n >();\n\n // ScopedCache: keyed by source identity, acquireRelease manages\n // connection lifecycle, TTL evicts idle connections.\n const connectionCache = yield* ScopedCache.make({\n lookup: (key: string) =>\n Effect.acquireRelease(\n Effect.suspend(() => {\n const connector = pendingConnectors.get(key);\n if (!connector) {\n return Effect.fail(\n new McpConnectionError({\n transport: \"auto\",\n message: `No pending connector for key: ${key}`,\n }),\n );\n }\n return connector;\n }),\n (connection) => Effect.promise(() => connection.close().catch(() => {})),\n ),\n capacity: 64,\n timeToLive: Duration.minutes(5),\n }).pipe(Scope.extend(cacheScope));\n\n const invoker = makeMcpInvoker({\n bindingStore,\n secrets: ctx.secrets,\n scopeId: ctx.scope.id,\n connectionCache,\n pendingConnectors,\n });\n yield* ctx.tools.registerInvoker(\"mcp\", invoker);\n\n // Restore source metadata\n const savedSources = yield* bindingStore.listSources();\n for (const s of savedSources) {\n const isRemote = s.config.transport === \"remote\";\n addedSources.set(\n s.namespace,\n new Source({\n id: s.namespace,\n name: s.name,\n kind: \"mcp\",\n canEdit: isRemote,\n }),\n );\n }\n\n // ----- Shared: resolve ConnectorInput from stored data -----\n\n const resolveConnectorInput = (\n sd: McpStoredSourceData,\n ): Effect.Effect<ConnectorInput, Error> => {\n if (sd.transport === \"stdio\") {\n return Effect.succeed({\n transport: \"stdio\" as const,\n command: sd.command,\n args: sd.args,\n env: sd.env,\n cwd: sd.cwd,\n });\n }\n\n return Effect.gen(function* () {\n const headers: Record<string, string> = {\n ...sd.headers,\n };\n let authProvider: OAuthClientProvider | undefined;\n\n const auth = sd.auth;\n if (auth.kind === \"header\") {\n const val = yield* ctx.secrets\n .resolve(SecretId.make(auth.secretId), ctx.scope.id)\n .pipe(\n Effect.mapError(() =>\n remoteConnectionError(`Failed to resolve secret \"${auth.secretId}\"`),\n ),\n );\n headers[auth.headerName] = auth.prefix ? `${auth.prefix}${val}` : val;\n } else if (auth.kind === \"oauth2\") {\n const accessToken = yield* ctx.secrets\n .resolve(SecretId.make(auth.accessTokenSecretId), ctx.scope.id)\n .pipe(\n Effect.mapError(() =>\n remoteConnectionError(\"Failed to resolve OAuth access token\"),\n ),\n );\n\n let refreshToken: string | undefined;\n if (auth.refreshTokenSecretId) {\n refreshToken = yield* ctx.secrets\n .resolve(SecretId.make(auth.refreshTokenSecretId), ctx.scope.id)\n .pipe(\n Effect.option,\n Effect.map((o) => (o._tag === \"Some\" ? o.value : undefined)),\n );\n }\n\n authProvider = makeOAuthProvider(\n accessToken,\n auth.tokenType ?? \"Bearer\",\n refreshToken,\n );\n }\n\n return {\n transport: \"remote\" as const,\n endpoint: sd.endpoint,\n remoteTransport: sd.remoteTransport,\n queryParams: sd.queryParams,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n authProvider,\n };\n });\n };\n\n // ----- Source manager -----\n\n yield* ctx.sources.addManager({\n kind: \"mcp\",\n\n list: () => Effect.sync(() => [...addedSources.values()]),\n\n remove: (sourceId: string) =>\n Effect.gen(function* () {\n yield* bindingStore.removeByNamespace(sourceId);\n yield* bindingStore.removeSource(sourceId);\n yield* ctx.tools.unregisterBySource(sourceId);\n addedSources.delete(sourceId);\n }),\n\n detect: (url: string) =>\n Effect.gen(function* () {\n const trimmed = url.trim();\n if (!trimmed) return null;\n const parsed = yield* Effect.try(() => new URL(trimmed)).pipe(Effect.option);\n if (parsed._tag === \"None\") return null;\n\n const name = parsed.value.hostname || \"mcp\";\n const namespace = deriveMcpNamespace({ endpoint: trimmed });\n\n const connector = createMcpConnector({\n transport: \"remote\",\n endpoint: trimmed,\n });\n\n const connected = yield* discoverTools(connector).pipe(\n Effect.map(() => true),\n Effect.catchAll(() => Effect.succeed(false)),\n );\n\n if (connected) {\n return new SourceDetectionResult({\n kind: \"mcp\",\n confidence: \"high\",\n endpoint: trimmed,\n name,\n namespace,\n });\n }\n\n // Probe for OAuth — still means it's an MCP server\n const hasOAuth = yield* startMcpOAuthAuthorization({\n endpoint: trimmed,\n redirectUrl: \"http://127.0.0.1/executor/discovery/oauth/probe\",\n state: \"probe\",\n }).pipe(\n Effect.map(() => true),\n Effect.catchAll(() => Effect.succeed(false)),\n );\n\n if (hasOAuth) {\n return new SourceDetectionResult({\n kind: \"mcp\",\n confidence: \"high\",\n endpoint: trimmed,\n name,\n namespace,\n });\n }\n\n return null;\n }),\n\n refresh: (sourceId: string) =>\n Effect.gen(function* () {\n const sd = yield* bindingStore.getSourceConfig(sourceId);\n if (!sd || !addedSources.has(sourceId)) return;\n\n const ci = yield* resolveConnectorInput(sd).pipe(\n Effect.catchAll(() => Effect.succeed(null)),\n );\n if (!ci) return;\n\n const manifest = yield* discoverTools(createMcpConnector(ci)).pipe(\n Effect.catchAll(() => Effect.succeed(null)),\n );\n if (!manifest) return;\n\n const oldIds = yield* bindingStore.removeByNamespace(sourceId);\n if (oldIds.length > 0) yield* ctx.tools.unregister(oldIds);\n\n yield* Effect.forEach(\n manifest.tools,\n (e) =>\n bindingStore.put(\n ToolId.make(joinToolPath(sourceId, e.toolId)),\n sourceId,\n toBinding(e),\n sd,\n ),\n { discard: true },\n );\n yield* ctx.tools.register(manifest.tools.map((e) => toRegistration(e, sourceId)));\n }),\n });\n\n // ----- Extension methods -----\n\n const probeEndpoint = (endpoint: string) =>\n Effect.gen(function* () {\n const trimmed = endpoint.trim();\n if (!trimmed) return yield* remoteConnectionError(\"Endpoint URL is required\");\n\n const name = yield* Effect.try(() => new URL(trimmed).hostname).pipe(\n Effect.orElseSucceed(() => \"mcp\"),\n );\n const namespace = deriveMcpNamespace({ endpoint: trimmed });\n\n // Try connecting directly\n const connector = createMcpConnector({\n transport: \"remote\",\n endpoint: trimmed,\n });\n\n const result = yield* discoverTools(connector).pipe(\n Effect.map((m) => ({ ok: true as const, manifest: m })),\n Effect.catchAll(() => Effect.succeed({ ok: false as const, manifest: null })),\n );\n\n if (result.ok && result.manifest) {\n return {\n connected: true,\n requiresOAuth: false,\n name: result.manifest.server?.name ?? name,\n namespace,\n toolCount: result.manifest.tools.length,\n serverName: result.manifest.server?.name ?? null,\n } satisfies McpProbeResult;\n }\n\n // Probe for OAuth\n const hasOAuth = yield* startMcpOAuthAuthorization({\n endpoint: trimmed,\n redirectUrl: \"http://127.0.0.1/executor/discovery/oauth/probe\",\n state: \"probe\",\n }).pipe(\n Effect.map(() => true),\n Effect.catchAll(() => Effect.succeed(false)),\n );\n\n if (hasOAuth) {\n return {\n connected: false,\n requiresOAuth: true,\n name,\n namespace,\n toolCount: null,\n serverName: null,\n } satisfies McpProbeResult;\n }\n\n return yield* remoteConnectionError(\n \"Could not connect to MCP endpoint and no OAuth was detected\",\n );\n });\n\n const addSource = (config: McpSourceConfig) =>\n Effect.gen(function* () {\n const namespace = normalizeNamespace(config);\n const sd = toStoredSourceData(config);\n const ci = yield* resolveConnectorInput(sd);\n const connector = createMcpConnector(ci);\n\n const manifest = yield* discoverTools(connector).pipe(\n Effect.mapError((err) => mcpDiscoveryError(`MCP discovery failed: ${err.message}`)),\n );\n\n const registrations = manifest.tools.map((e) => toRegistration(e, namespace));\n\n yield* Effect.forEach(\n manifest.tools,\n (e) =>\n bindingStore.put(\n ToolId.make(joinToolPath(namespace, e.toolId)),\n namespace,\n toBinding(e),\n sd,\n ),\n { discard: true },\n );\n\n yield* ctx.tools.register(registrations);\n\n const sourceName = manifest.server?.name ?? config.name ?? namespace;\n yield* bindingStore.putSource({\n namespace,\n name: sourceName,\n config: sd,\n });\n\n addedSources.set(\n namespace,\n new Source({\n id: namespace,\n name: sourceName,\n kind: \"mcp\",\n canEdit: config.transport === \"remote\",\n }),\n );\n\n return { toolCount: registrations.length, namespace };\n });\n\n const removeSource = (namespace: string) =>\n Effect.gen(function* () {\n const ids = yield* bindingStore.removeByNamespace(namespace);\n if (ids.length > 0) yield* ctx.tools.unregister(ids);\n yield* bindingStore.removeSource(namespace);\n addedSources.delete(namespace);\n });\n\n const refreshSource = (namespace: string) =>\n Effect.gen(function* () {\n const sd = yield* bindingStore.getSourceConfig(namespace);\n if (!sd)\n return yield* remoteConnectionError(`No stored config for MCP source \"${namespace}\"`);\n\n const ci = yield* resolveConnectorInput(sd);\n const manifest = yield* discoverTools(createMcpConnector(ci)).pipe(\n Effect.mapError((err) => mcpDiscoveryError(`MCP refresh failed: ${err.message}`)),\n );\n\n const oldIds = yield* bindingStore.removeByNamespace(namespace);\n if (oldIds.length > 0) yield* ctx.tools.unregister(oldIds);\n\n yield* Effect.forEach(\n manifest.tools,\n (e) =>\n bindingStore.put(\n ToolId.make(joinToolPath(namespace, e.toolId)),\n namespace,\n toBinding(e),\n sd,\n ),\n { discard: true },\n );\n yield* ctx.tools.register(manifest.tools.map((e) => toRegistration(e, namespace)));\n\n return { toolCount: manifest.tools.length };\n });\n\n const startOAuth = (input: McpOAuthStartInput) =>\n Effect.gen(function* () {\n const endpoint = input.endpoint.trim();\n if (!endpoint) return yield* mcpOAuthError(\"MCP OAuth requires an endpoint\");\n\n let fullEndpoint = endpoint;\n if (input.queryParams && Object.keys(input.queryParams).length > 0) {\n const u = new URL(endpoint);\n for (const [k, v] of Object.entries(input.queryParams)) u.searchParams.set(k, v);\n fullEndpoint = u.toString();\n }\n\n const sessionId = `mcp_oauth_${crypto.randomUUID()}`;\n const started = yield* startMcpOAuthAuthorization({\n endpoint: fullEndpoint,\n redirectUrl: input.redirectUrl,\n state: sessionId,\n }).pipe(Effect.mapError((e) => mcpOAuthError(`OAuth start failed: ${e.message}`)));\n\n oauthSessions.set(sessionId, {\n endpoint: fullEndpoint,\n redirectUrl: input.redirectUrl,\n codeVerifier: started.codeVerifier,\n resourceMetadataUrl: started.resourceMetadataUrl,\n authorizationServerUrl: started.authorizationServerUrl,\n resourceMetadata: started.resourceMetadata,\n authorizationServerMetadata: started.authorizationServerMetadata,\n clientInformation: started.clientInformation,\n });\n\n return {\n sessionId,\n authorizationUrl: started.authorizationUrl,\n };\n });\n\n const completeOAuth = (input: McpOAuthCompleteInput) =>\n Effect.gen(function* () {\n if (input.error) return yield* mcpOAuthError(`OAuth error: ${input.error}`);\n if (!input.code) return yield* mcpOAuthError(\"Missing OAuth authorization code\");\n\n const session = oauthSessions.get(input.state);\n if (!session) return yield* mcpOAuthError(`OAuth session not found: ${input.state}`);\n\n const exchanged = yield* exchangeMcpOAuthCode({\n session,\n code: input.code,\n }).pipe(Effect.mapError((e) => mcpOAuthError(`OAuth exchange failed: ${e.message}`)));\n\n const accessTokenRef = yield* ctx.secrets\n .set({\n id: SecretId.make(`mcp-oauth-access-${input.state}`),\n scopeId: ctx.scope.id,\n name: \"MCP OAuth Access Token\",\n value: exchanged.tokens.access_token,\n purpose: \"oauth_access_token\",\n })\n .pipe(\n Effect.mapError((e) => mcpOAuthError(`Failed to store access token: ${String(e)}`)),\n );\n\n let refreshTokenSecretId: string | null = null;\n if (exchanged.tokens.refresh_token) {\n const ref = yield* ctx.secrets\n .set({\n id: SecretId.make(`mcp-oauth-refresh-${input.state}`),\n scopeId: ctx.scope.id,\n name: \"MCP OAuth Refresh Token\",\n value: exchanged.tokens.refresh_token,\n purpose: \"oauth_refresh_token\",\n })\n .pipe(\n Effect.mapError((e) =>\n mcpOAuthError(`Failed to store refresh token: ${String(e)}`),\n ),\n );\n refreshTokenSecretId = ref.id;\n }\n\n oauthSessions.delete(input.state);\n\n const expiresAt =\n typeof exchanged.tokens.expires_in === \"number\"\n ? Date.now() + exchanged.tokens.expires_in * 1000\n : null;\n\n return {\n accessTokenSecretId: accessTokenRef.id,\n refreshTokenSecretId,\n tokenType: exchanged.tokens.token_type ?? \"Bearer\",\n expiresAt,\n scope: exchanged.tokens.scope ?? null,\n };\n });\n\n const updateSource = (namespace: string, input: McpUpdateSourceInput) =>\n Effect.gen(function* () {\n const existingConfig = yield* bindingStore.getSourceConfig(namespace);\n if (!existingConfig || existingConfig.transport !== \"remote\") return;\n\n const remote = existingConfig as Extract<McpStoredSourceData, { transport: \"remote\" }>;\n const updatedConfig: McpStoredSourceData = {\n ...remote,\n ...(input.endpoint !== undefined ? { endpoint: input.endpoint } : {}),\n ...(input.headers !== undefined ? { headers: input.headers } : {}),\n ...(input.auth !== undefined ? { auth: input.auth } : {}),\n ...(input.queryParams !== undefined ? { queryParams: input.queryParams } : {}),\n };\n\n const sources = yield* bindingStore.listSources();\n const existingMeta = sources.find((s) => s.namespace === namespace);\n\n yield* bindingStore.putSource({\n namespace,\n name: existingMeta?.name ?? namespace,\n config: updatedConfig,\n });\n\n const toolIds = yield* bindingStore.listByNamespace(namespace);\n for (const toolId of toolIds) {\n const entry = yield* bindingStore.get(toolId);\n if (entry) {\n yield* bindingStore.put(toolId, namespace, entry.binding, updatedConfig);\n }\n }\n });\n\n const getSource = (namespace: string) => bindingStore.getSource(namespace);\n\n return {\n extension: {\n probeEndpoint,\n addSource,\n removeSource,\n refreshSource,\n startOAuth,\n completeOAuth,\n getSource,\n updateSource,\n },\n\n close: () =>\n Effect.gen(function* () {\n yield* invoker.closeConnections();\n yield* Scope.close(cacheScope, Exit.void);\n for (const sourceId of addedSources.keys()) {\n yield* ctx.tools.unregisterBySource(sourceId);\n }\n addedSources.clear();\n }),\n };\n }),\n });\n};\n","import type { OAuthClientProvider } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { Effect } from \"effect\";\n\nimport type { McpRemoteSourceData, McpStdioSourceData } from \"./types\";\nimport { McpConnectionError } from \"./errors\";\n\n// ---------------------------------------------------------------------------\n// Connection type\n// ---------------------------------------------------------------------------\n\nexport type McpConnection = {\n readonly client: Client;\n readonly close: () => Promise<void>;\n};\n\nexport type McpConnector = Effect.Effect<McpConnection, McpConnectionError>;\n\n// ---------------------------------------------------------------------------\n// Connector input — extends stored source data with resolved auth\n// ---------------------------------------------------------------------------\n\nexport type RemoteConnectorInput = Omit<McpRemoteSourceData, \"auth\" | \"remoteTransport\"> & {\n readonly remoteTransport?: McpRemoteSourceData[\"remoteTransport\"];\n readonly authProvider?: OAuthClientProvider;\n};\n\nexport type StdioConnectorInput = McpStdioSourceData;\n\nexport type ConnectorInput = RemoteConnectorInput | StdioConnectorInput;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst buildEndpointUrl = (endpoint: string, queryParams: Record<string, string>): URL => {\n const url = new URL(endpoint);\n for (const [key, value] of Object.entries(queryParams)) {\n url.searchParams.set(key, value);\n }\n return url;\n};\n\nconst createClient = (): Client =>\n new Client(\n { name: \"executor-mcp\", version: \"0.1.0\" },\n { capabilities: { elicitation: { form: {}, url: {} } } },\n );\n\nconst connectionFromClient = (client: Client): McpConnection => ({\n client,\n close: () => client.close(),\n});\n\nconst connectClient = (input: {\n transport: string;\n createTransport: () => Parameters<Client[\"connect\"]>[0];\n}): Effect.Effect<McpConnection, McpConnectionError> =>\n Effect.gen(function* () {\n const client = createClient();\n const transportInstance = input.createTransport();\n\n yield* Effect.tryPromise({\n try: () => client.connect(transportInstance),\n catch: (cause) =>\n new McpConnectionError({\n transport: input.transport,\n message: `Failed connecting via ${input.transport}: ${\n cause instanceof Error ? cause.message : String(cause)\n }`,\n }),\n });\n\n return connectionFromClient(client);\n });\n\n// ---------------------------------------------------------------------------\n// Public factory\n// ---------------------------------------------------------------------------\n\nexport const createMcpConnector = (input: ConnectorInput): McpConnector => {\n if (input.transport === \"stdio\") {\n const command = input.command.trim();\n if (!command) {\n return new McpConnectionError({\n transport: \"stdio\",\n message: \"MCP stdio transport requires a command\",\n });\n }\n\n return connectClient({\n transport: \"stdio\",\n createTransport: () =>\n new StdioClientTransport({\n command,\n args: input.args ? [...input.args] : undefined,\n env: input.env ? ({ ...process.env, ...input.env } as Record<string, string>) : undefined,\n cwd: input.cwd?.trim().length ? input.cwd.trim() : undefined,\n }),\n });\n }\n\n // Remote transport\n const headers = input.headers ?? {};\n const remoteTransport = input.remoteTransport ?? \"auto\";\n const requestInit = Object.keys(headers).length > 0 ? { headers } : undefined;\n\n const endpoint = buildEndpointUrl(input.endpoint, input.queryParams ?? {});\n\n const connectStreamableHttp = connectClient({\n transport: \"streamable-http\",\n createTransport: () =>\n new StreamableHTTPClientTransport(endpoint, {\n requestInit,\n authProvider: input.authProvider,\n }),\n });\n\n const connectSse = connectClient({\n transport: \"sse\",\n createTransport: () =>\n new SSEClientTransport(endpoint, {\n requestInit,\n authProvider: input.authProvider,\n }),\n });\n\n if (remoteTransport === \"streamable-http\") return connectStreamableHttp;\n if (remoteTransport === \"sse\") return connectSse;\n\n // auto — try streamable-http first, fall back to SSE\n return connectStreamableHttp.pipe(Effect.catchAll(() => connectSse));\n};\n","import { Schema } from \"effect\";\n\nexport class McpConnectionError extends Schema.TaggedError<McpConnectionError>()(\n \"McpConnectionError\",\n {\n transport: Schema.String,\n message: Schema.String,\n },\n) {}\n\nexport class McpToolDiscoveryError extends Schema.TaggedError<McpToolDiscoveryError>()(\n \"McpToolDiscoveryError\",\n {\n stage: Schema.Literal(\"connect\", \"list_tools\"),\n message: Schema.String,\n },\n) {}\n\nexport class McpInvocationError extends Schema.TaggedError<McpInvocationError>()(\n \"McpInvocationError\",\n {\n toolName: Schema.String,\n message: Schema.String,\n },\n) {}\n\nexport class McpOAuthError extends Schema.TaggedError<McpOAuthError>()(\"McpOAuthError\", {\n message: Schema.String,\n}) {}\n","// ---------------------------------------------------------------------------\n// MCP OAuth flow — start authorization + exchange code for tokens\n// ---------------------------------------------------------------------------\n\nimport {\n auth,\n type OAuthClientProvider,\n type OAuthDiscoveryState,\n} from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type {\n OAuthClientInformationMixed,\n OAuthTokens,\n} from \"@modelcontextprotocol/sdk/shared/auth.js\";\nimport { Effect } from \"effect\";\nimport { McpOAuthError } from \"./errors\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype JsonObject = { readonly [key: string]: unknown };\n\n/** Discovery + client state persisted between start and exchange */\nexport interface McpOAuthDiscoveryState {\n readonly resourceMetadataUrl: string | null;\n readonly authorizationServerUrl: string | null;\n readonly resourceMetadata: JsonObject | null;\n readonly authorizationServerMetadata: JsonObject | null;\n readonly clientInformation: JsonObject | null;\n}\n\nexport interface McpOAuthStartResult extends McpOAuthDiscoveryState {\n readonly authorizationUrl: string;\n readonly codeVerifier: string;\n}\n\nexport interface McpOAuthSession extends McpOAuthDiscoveryState {\n readonly endpoint: string;\n readonly redirectUrl: string;\n readonly codeVerifier: string;\n}\n\nexport interface McpOAuthExchangeResult extends McpOAuthDiscoveryState {\n readonly tokens: OAuthTokens;\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nconst toJsonObject = (value: unknown): JsonObject | null =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as JsonObject)\n : null;\n\nconst CLIENT_METADATA = {\n grant_types: [\"authorization_code\", \"refresh_token\"] as string[],\n response_types: [\"code\"] as string[],\n token_endpoint_auth_method: \"none\" as const,\n client_name: \"Executor\",\n};\n\nconst extractDiscoveryState = (\n discoveryState: OAuthDiscoveryState | undefined,\n clientInformation: OAuthClientInformationMixed | undefined,\n): McpOAuthDiscoveryState => ({\n resourceMetadataUrl: discoveryState?.resourceMetadataUrl ?? null,\n authorizationServerUrl: discoveryState?.authorizationServerUrl ?? null,\n resourceMetadata: toJsonObject(discoveryState?.resourceMetadata),\n authorizationServerMetadata: toJsonObject(discoveryState?.authorizationServerMetadata),\n clientInformation: toJsonObject(clientInformation),\n});\n\nconst callAuth = (provider: OAuthClientProvider, opts: Parameters<typeof auth>[1]) =>\n Effect.tryPromise({\n try: () => auth(provider, opts),\n catch: (cause) =>\n new McpOAuthError({\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n });\n\n// ---------------------------------------------------------------------------\n// Start — initiate the authorization flow, get a redirect URL\n// ---------------------------------------------------------------------------\n\nexport const startMcpOAuthAuthorization = (input: {\n endpoint: string;\n redirectUrl: string;\n state: string;\n}): Effect.Effect<McpOAuthStartResult, McpOAuthError> =>\n Effect.gen(function* () {\n let authorizationUrl: URL | undefined;\n let codeVerifier: string | undefined;\n let discoveryState: OAuthDiscoveryState | undefined;\n let clientInformation: OAuthClientInformationMixed | undefined;\n\n const provider: OAuthClientProvider = {\n get redirectUrl() {\n return input.redirectUrl;\n },\n get clientMetadata() {\n return { ...CLIENT_METADATA, redirect_uris: [input.redirectUrl] };\n },\n state: () => input.state,\n clientInformation: () => clientInformation,\n saveClientInformation: (ci) => {\n clientInformation = ci;\n },\n tokens: () => undefined,\n saveTokens: () => undefined,\n redirectToAuthorization: (url) => {\n authorizationUrl = url;\n },\n saveCodeVerifier: (cv) => {\n codeVerifier = cv;\n },\n codeVerifier: () => {\n if (!codeVerifier) throw new Error(\"Code verifier not captured\");\n return codeVerifier;\n },\n saveDiscoveryState: (s) => {\n discoveryState = s;\n },\n discoveryState: () => discoveryState,\n };\n\n const result = yield* callAuth(provider, { serverUrl: input.endpoint });\n\n if (result !== \"REDIRECT\" || !authorizationUrl || !codeVerifier) {\n return yield* new McpOAuthError({\n message: \"OAuth flow did not produce an authorization redirect\",\n });\n }\n\n return {\n authorizationUrl: authorizationUrl.toString(),\n codeVerifier,\n ...extractDiscoveryState(discoveryState, clientInformation),\n };\n });\n\n// ---------------------------------------------------------------------------\n// Exchange — trade an authorization code for tokens\n// ---------------------------------------------------------------------------\n\nexport const exchangeMcpOAuthCode = (input: {\n session: McpOAuthSession;\n code: string;\n}): Effect.Effect<McpOAuthExchangeResult, McpOAuthError> =>\n Effect.gen(function* () {\n const { session } = input;\n\n let tokens: OAuthTokens | undefined;\n let discoveryState: OAuthDiscoveryState | undefined = {\n authorizationServerUrl:\n session.authorizationServerUrl ?? new URL(\"/\", session.endpoint).toString(),\n resourceMetadataUrl: session.resourceMetadataUrl ?? undefined,\n resourceMetadata: session.resourceMetadata as OAuthDiscoveryState[\"resourceMetadata\"],\n authorizationServerMetadata:\n session.authorizationServerMetadata as OAuthDiscoveryState[\"authorizationServerMetadata\"],\n };\n let clientInformation = session.clientInformation as OAuthClientInformationMixed | undefined;\n\n const provider: OAuthClientProvider = {\n get redirectUrl() {\n return session.redirectUrl;\n },\n get clientMetadata() {\n return { ...CLIENT_METADATA, redirect_uris: [session.redirectUrl] };\n },\n clientInformation: () => clientInformation,\n saveClientInformation: (ci) => {\n clientInformation = ci;\n },\n tokens: () => undefined,\n saveTokens: (t) => {\n tokens = t;\n },\n redirectToAuthorization: () => {\n throw new Error(\"Unexpected redirect during code exchange\");\n },\n saveCodeVerifier: () => undefined,\n codeVerifier: () => session.codeVerifier,\n saveDiscoveryState: (s) => {\n discoveryState = s;\n },\n discoveryState: () => discoveryState,\n };\n\n const result = yield* callAuth(provider, {\n serverUrl: session.endpoint,\n authorizationCode: input.code,\n });\n\n if (result !== \"AUTHORIZED\" || !tokens) {\n return yield* new McpOAuthError({\n message: \"OAuth exchange did not produce tokens\",\n });\n }\n\n return {\n tokens,\n ...extractDiscoveryState(discoveryState, clientInformation),\n };\n });\n","// ---------------------------------------------------------------------------\n// MCP tool discovery — connect to an MCP server and list its tools\n// ---------------------------------------------------------------------------\n\nimport { Effect } from \"effect\";\n\nimport type { McpConnector } from \"./connection\";\nimport { McpToolDiscoveryError } from \"./errors\";\nimport { extractManifestFromListToolsResult, type McpToolManifest } from \"./manifest\";\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Connect to an MCP server and discover all available tools.\n * Returns the parsed manifest containing server metadata and tool entries.\n */\nexport const discoverTools = (\n connector: McpConnector,\n): Effect.Effect<McpToolManifest, McpToolDiscoveryError> =>\n Effect.gen(function* () {\n // Acquire connection\n const connection = yield* connector.pipe(\n Effect.mapError(\n (err) =>\n new McpToolDiscoveryError({\n stage: \"connect\",\n message: `Failed connecting to MCP server: ${err.message}`,\n }),\n ),\n );\n\n // List tools\n const listResult = yield* Effect.tryPromise({\n try: () => connection.client.listTools(),\n catch: (cause) =>\n new McpToolDiscoveryError({\n stage: \"list_tools\",\n message: `Failed listing MCP tools: ${\n cause instanceof Error ? cause.message : String(cause)\n }`,\n }),\n });\n\n const manifest = extractManifestFromListToolsResult(listResult, {\n serverInfo: connection.client.getServerVersion?.(),\n });\n\n // Close the connection after discovery\n yield* Effect.promise(() => connection.close().catch(() => {}));\n\n return manifest;\n });\n","import { Schema } from \"effect\";\n\n// ---------------------------------------------------------------------------\n// Output types\n// ---------------------------------------------------------------------------\n\nexport interface McpToolManifestEntry {\n readonly toolId: string;\n readonly toolName: string;\n readonly description: string | null;\n readonly inputSchema?: unknown;\n readonly outputSchema?: unknown;\n}\n\nexport interface McpServerMetadata {\n readonly name: string | null;\n readonly version: string | null;\n}\n\nexport interface McpToolManifest {\n readonly server: McpServerMetadata | null;\n readonly tools: readonly McpToolManifestEntry[];\n}\n\n// ---------------------------------------------------------------------------\n// Schemas\n// ---------------------------------------------------------------------------\n\nconst ListedTool = Schema.Struct({\n name: Schema.String,\n description: Schema.optional(Schema.NullOr(Schema.String)),\n inputSchema: Schema.optional(Schema.Unknown),\n parameters: Schema.optional(Schema.Unknown),\n outputSchema: Schema.optional(Schema.Unknown),\n});\n\nconst ListToolsResult = Schema.Struct({\n tools: Schema.Array(ListedTool),\n});\n\nconst ServerInfo = Schema.Struct({\n name: Schema.optional(Schema.String),\n version: Schema.optional(Schema.String),\n});\n\nconst decodeListToolsResult = Schema.decodeUnknownOption(ListToolsResult);\nconst decodeServerInfo = Schema.decodeUnknownOption(ServerInfo);\n\n// ---------------------------------------------------------------------------\n// Tool ID sanitization\n// ---------------------------------------------------------------------------\n\nconst sanitize = (value: string): string => {\n const s = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return s || \"tool\";\n};\n\nconst uniqueId = (value: string, seen: Map<string, number>): string => {\n const base = sanitize(value);\n const n = (seen.get(base) ?? 0) + 1;\n seen.set(base, n);\n return n === 1 ? base : `${base}_${n}`;\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport const joinToolPath = (namespace: string | undefined, toolId: string): string =>\n namespace?.trim() ? `${namespace}.${toolId}` : toolId;\n\nexport const extractManifestFromListToolsResult = (\n listToolsResult: unknown,\n metadata?: { serverInfo?: unknown },\n): McpToolManifest => {\n const seen = new Map<string, number>();\n\n const listed = decodeListToolsResult(listToolsResult).pipe((opt) =>\n opt._tag === \"Some\" ? opt.value.tools : [],\n );\n\n const server = decodeServerInfo(metadata?.serverInfo).pipe((opt): McpServerMetadata | null =>\n opt._tag === \"Some\"\n ? { name: opt.value.name ?? null, version: opt.value.version ?? null }\n : null,\n );\n\n const tools = listed.flatMap((tool): McpToolManifestEntry[] => {\n const toolName = tool.name.trim();\n if (!toolName) return [];\n\n return [\n {\n toolId: uniqueId(toolName, seen),\n toolName,\n description: tool.description ?? null,\n inputSchema: tool.inputSchema ?? tool.parameters,\n outputSchema: tool.outputSchema,\n },\n ];\n });\n\n return { server, tools };\n};\n\n// ---------------------------------------------------------------------------\n// Namespace derivation\n// ---------------------------------------------------------------------------\n\nconst slugify = (value: string): string =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n\nconst hostnameOf = (url: string): string | null => {\n try {\n return new URL(url).hostname;\n } catch {\n return null;\n }\n};\n\nconst basenameOf = (path: string): string => path.trim().split(/[\\\\/]/).pop() ?? path.trim();\n\nexport const deriveMcpNamespace = (input: {\n name?: string | null;\n endpoint?: string | null;\n command?: string | null;\n}): string => {\n if (input.name?.trim()) return slugify(input.name) || \"mcp\";\n\n const fromEndpoint = input.endpoint?.trim() ? hostnameOf(input.endpoint) : null;\n if (fromEndpoint) return slugify(fromEndpoint) || \"mcp\";\n\n if (input.command?.trim()) return slugify(basenameOf(input.command)) || \"mcp\";\n\n return \"mcp\";\n};\n","// ---------------------------------------------------------------------------\n// MCP tool invoker — bridges the binding store + MCP client into SDK invoker\n// ---------------------------------------------------------------------------\n\nimport { Effect, Schema, type ScopedCache } from \"effect\";\n\nimport type { OAuthClientProvider } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type { OAuthTokens } from \"@modelcontextprotocol/sdk/shared/auth.js\";\nimport { ElicitRequestSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n type ToolId,\n type ToolInvoker,\n ToolInvocationResult,\n ToolInvocationError,\n ToolAnnotations,\n ElicitationResponse,\n FormElicitation,\n UrlElicitation,\n type ElicitationHandler,\n type ElicitationRequest,\n type ScopeId,\n type SecretId,\n type InvokeOptions,\n} from \"@executor/sdk\";\n\nimport type { McpBindingStore } from \"./binding-store\";\nimport type { McpStoredSourceData } from \"./types\";\nimport { McpConnectionError } from \"./errors\";\nimport { createMcpConnector, type McpConnection, type ConnectorInput } from \"./connection\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n\ntype Secrets = {\n readonly resolve: (secretId: SecretId, scopeId: ScopeId) => Effect.Effect<string, unknown>;\n};\n\n// ---------------------------------------------------------------------------\n// OAuth provider factory\n// ---------------------------------------------------------------------------\n\nconst makeOAuthProvider = (\n accessToken: string,\n tokenType: string,\n refreshToken?: string,\n): OAuthClientProvider => ({\n get redirectUrl() {\n return \"http://localhost/oauth/callback\";\n },\n get clientMetadata() {\n return {\n redirect_uris: [\"http://localhost/oauth/callback\"],\n grant_types: [\"authorization_code\", \"refresh_token\"] as string[],\n response_types: [\"code\"] as string[],\n token_endpoint_auth_method: \"none\" as const,\n client_name: \"Executor\",\n };\n },\n clientInformation: () => undefined,\n saveClientInformation: () => {},\n tokens: async (): Promise<OAuthTokens> => ({\n access_token: accessToken,\n token_type: tokenType,\n ...(refreshToken ? { refresh_token: refreshToken } : {}),\n }),\n saveTokens: async () => {},\n redirectToAuthorization: async () => {\n throw new Error(\"MCP OAuth re-authorization required\");\n },\n saveCodeVerifier: () => {},\n codeVerifier: () => {\n throw new Error(\"No active PKCE verifier\");\n },\n saveDiscoveryState: () => {},\n discoveryState: () => undefined,\n});\n\n// ---------------------------------------------------------------------------\n// Elicitation bridge\n// ---------------------------------------------------------------------------\n\nconst McpElicitParams = Schema.Union(\n Schema.Struct({\n mode: Schema.Literal(\"url\"),\n message: Schema.String,\n url: Schema.String,\n elicitationId: Schema.optional(Schema.String),\n id: Schema.optional(Schema.String),\n }),\n Schema.Struct({\n mode: Schema.optional(Schema.Literal(\"form\")),\n message: Schema.String,\n requestedSchema: Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n }),\n);\ntype McpElicitParams = typeof McpElicitParams.Type;\n\nconst decodeElicitParams = Schema.decodeUnknownSync(McpElicitParams);\n\nconst toElicitationRequest = (params: McpElicitParams): ElicitationRequest =>\n params.mode === \"url\"\n ? new UrlElicitation({\n message: params.message,\n url: params.url,\n elicitationId: params.elicitationId ?? params.id ?? \"\",\n })\n : new FormElicitation({\n message: params.message,\n requestedSchema: params.requestedSchema,\n });\n\nconst installElicitationHandler = (\n client: McpConnection[\"client\"],\n toolId: ToolId,\n args: unknown,\n handler: ElicitationHandler,\n): void => {\n client.setRequestHandler(ElicitRequestSchema, async (request: { params: unknown }) => {\n const params = decodeElicitParams(request.params);\n const response = await Effect.runPromise(\n handler({ toolId, args, request: toElicitationRequest(params) }),\n );\n return {\n action: response.action,\n ...(response.action === \"accept\" && response.content ? { content: response.content } : {}),\n };\n });\n};\n\n// ---------------------------------------------------------------------------\n// Resolve ConnectorInput from stored source data\n// ---------------------------------------------------------------------------\n\nconst resolveConnectorInput = (\n sourceData: McpStoredSourceData,\n secrets: Secrets,\n scopeId: ScopeId,\n): Effect.Effect<ConnectorInput, ToolInvocationError> => {\n if (sourceData.transport === \"stdio\") {\n return Effect.succeed({\n transport: \"stdio\" as const,\n command: sourceData.command,\n args: sourceData.args,\n env: sourceData.env,\n cwd: sourceData.cwd,\n });\n }\n\n return Effect.gen(function* () {\n const headers: Record<string, string> = { ...sourceData.headers };\n let authProvider: OAuthClientProvider | undefined;\n\n const auth = sourceData.auth;\n if (auth.kind === \"header\") {\n const secretValue = yield* secrets.resolve(auth.secretId as SecretId, scopeId).pipe(\n Effect.mapError(\n () =>\n new ToolInvocationError({\n toolId: \"\" as ToolId,\n message: `Failed to resolve secret \"${auth.secretId}\" for MCP auth`,\n cause: undefined,\n }),\n ),\n );\n headers[auth.headerName] = auth.prefix ? `${auth.prefix}${secretValue}` : secretValue;\n } else if (auth.kind === \"oauth2\") {\n const accessToken = yield* secrets\n .resolve(auth.accessTokenSecretId as SecretId, scopeId)\n .pipe(\n Effect.mapError(\n () =>\n new ToolInvocationError({\n toolId: \"\" as ToolId,\n message: \"Failed to resolve OAuth access token for MCP auth\",\n cause: undefined,\n }),\n ),\n );\n\n let refreshToken: string | undefined;\n if (auth.refreshTokenSecretId) {\n refreshToken = yield* secrets.resolve(auth.refreshTokenSecretId as SecretId, scopeId).pipe(\n Effect.option,\n Effect.map((o) => (o._tag === \"Some\" ? o.value : undefined)),\n );\n }\n\n authProvider = makeOAuthProvider(accessToken, auth.tokenType ?? \"Bearer\", refreshToken);\n }\n\n return {\n transport: \"remote\" as const,\n endpoint: sourceData.endpoint,\n remoteTransport: sourceData.remoteTransport,\n queryParams: sourceData.queryParams,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n authProvider,\n };\n });\n};\n\n// ---------------------------------------------------------------------------\n// Connection cache key\n// ---------------------------------------------------------------------------\n\nconst connectionCacheKey = (sourceData: McpStoredSourceData): string =>\n sourceData.transport === \"stdio\"\n ? `stdio:${sourceData.command}`\n : `remote:${sourceData.endpoint}`;\n\n// ---------------------------------------------------------------------------\n// Resolve elicitation handler from options\n// ---------------------------------------------------------------------------\n\nconst resolveElicitationHandler = (options: InvokeOptions): ElicitationHandler =>\n options.onElicitation === \"accept-all\"\n ? () => Effect.succeed(new ElicitationResponse({ action: \"accept\" }))\n : options.onElicitation;\n\n// ---------------------------------------------------------------------------\n// Use pattern — wrap MCP Client as an Effect service\n// ---------------------------------------------------------------------------\n\nconst useMcpConnection = (\n connection: McpConnection,\n toolId: ToolId,\n toolName: string,\n args: Record<string, unknown>,\n handler: ElicitationHandler,\n): Effect.Effect<unknown, ToolInvocationError> =>\n Effect.gen(function* () {\n installElicitationHandler(connection.client, toolId, args, handler);\n\n return yield* Effect.tryPromise({\n try: () => connection.client.callTool({ name: toolName, arguments: args }),\n catch: (cause) =>\n new ToolInvocationError({\n toolId,\n message: `MCP tool call failed for ${toolName}: ${\n cause instanceof Error ? cause.message : String(cause)\n }`,\n cause,\n }),\n });\n }).pipe(Effect.withSpan(`mcp.callTool.${toolName}`));\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport const makeMcpInvoker = (opts: {\n readonly bindingStore: McpBindingStore;\n readonly secrets: Secrets;\n readonly scopeId: ScopeId;\n readonly connectionCache: ScopedCache.ScopedCache<string, McpConnection, McpConnectionError>;\n /** Shared map between cache lookup and invoker — set connector before cache.get */\n readonly pendingConnectors: Map<string, Effect.Effect<McpConnection, McpConnectionError>>;\n}): ToolInvoker & { readonly closeConnections: () => Effect.Effect<void> } => {\n const { connectionCache, pendingConnectors } = opts;\n\n return {\n resolveAnnotations: () => Effect.succeed(new ToolAnnotations({ requiresApproval: false })),\n\n invoke: (toolId: ToolId, args: unknown, options: InvokeOptions) =>\n Effect.gen(function* () {\n const entry = yield* opts.bindingStore.get(toolId);\n if (!entry) {\n return yield* new ToolInvocationError({\n toolId,\n message: `No MCP binding found for tool \"${toolId}\"`,\n cause: undefined,\n });\n }\n\n const { binding, sourceData } = entry;\n const cacheKey = connectionCacheKey(sourceData);\n\n // Build the connector and register it for the cache lookup\n const connector = resolveConnectorInput(sourceData, opts.secrets, opts.scopeId).pipe(\n Effect.flatMap((ci) => createMcpConnector(ci)),\n Effect.mapError(\n (err) =>\n new McpConnectionError({\n transport: \"auto\",\n message: err instanceof Error ? err.message : String(err),\n }),\n ),\n );\n pendingConnectors.set(cacheKey, connector);\n\n const connection = yield* connectionCache.get(cacheKey).pipe(\n Effect.mapError(\n (err) =>\n new ToolInvocationError({\n toolId,\n message: `Failed connecting to MCP server: ${\n err instanceof Error ? err.message : String(err)\n }`,\n cause: err,\n }),\n ),\n );\n\n const elicitationHandler = resolveElicitationHandler(options);\n\n return yield* useMcpConnection(\n connection,\n toolId,\n binding.toolName,\n asRecord(args),\n elicitationHandler,\n ).pipe(\n // On failure, invalidate the cached connection and retry once\n Effect.catchAll(() =>\n Effect.gen(function* () {\n yield* connectionCache.invalidate(cacheKey);\n pendingConnectors.set(cacheKey, connector);\n\n const freshConnection = yield* connectionCache.get(cacheKey).pipe(\n Effect.mapError(\n (retryErr) =>\n new ToolInvocationError({\n toolId,\n message: `Failed reconnecting: ${\n retryErr instanceof Error ? retryErr.message : String(retryErr)\n }`,\n cause: retryErr,\n }),\n ),\n );\n\n return yield* useMcpConnection(\n freshConnection,\n toolId,\n binding.toolName,\n asRecord(args),\n elicitationHandler,\n );\n }),\n ),\n );\n }).pipe(\n Effect.scoped,\n Effect.map((callResult) => {\n const resultRecord = asRecord(callResult);\n const isError = resultRecord.isError === true;\n return new ToolInvocationResult({\n data: isError ? null : (callResult ?? null),\n error: isError ? callResult : null,\n });\n }),\n Effect.catchAll((err) => {\n if (\n typeof err === \"object\" &&\n err !== null &&\n \"_tag\" in err &&\n (err as { _tag: string })._tag === \"ToolInvocationError\"\n ) {\n return Effect.fail(err as ToolInvocationError);\n }\n return Effect.fail(\n new ToolInvocationError({\n toolId,\n message: `MCP invocation failed: ${err instanceof Error ? err.message : String(err)}`,\n cause: err,\n }),\n );\n }),\n ),\n\n closeConnections: () =>\n Effect.sync(() => {\n pendingConnectors.clear();\n }).pipe(Effect.flatMap(() => connectionCache.invalidateAll)),\n };\n};\n"],"mappings":"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","names":["Schema","Schema","Effect","Effect","Schema","Effect","Effect","Effect","Effect","Schema","Effect","Effect","Schema","Schema","Effect","auth","makeOAuthProvider","Effect","resolveConnectorInput","auth"]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Config-file wrapper for McpBindingStore.
|
|
3
|
-
*
|
|
4
|
-
* Decorates an underlying store so that `putSource` and `removeSource` also
|
|
5
|
-
* write to executor.jsonc.
|
|
6
|
-
*/
|
|
7
|
-
import { FileSystem } from "@effect/platform";
|
|
8
|
-
import type { Layer } from "effect";
|
|
9
|
-
import type { McpBindingStore } from "./binding-store";
|
|
10
|
-
export declare const withConfigFile: (inner: McpBindingStore, configPath: string, fsLayer: Layer.Layer<FileSystem.FileSystem>) => McpBindingStore;
|
package/dist/sdk/oauth.d.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { OAuthTokens } from "@modelcontextprotocol/sdk/shared/auth.js";
|
|
2
|
-
import { Effect } from "effect";
|
|
3
|
-
import { McpOAuthError } from "./errors";
|
|
4
|
-
type JsonObject = {
|
|
5
|
-
readonly [key: string]: unknown;
|
|
6
|
-
};
|
|
7
|
-
/** Discovery + client state persisted between start and exchange */
|
|
8
|
-
export interface McpOAuthDiscoveryState {
|
|
9
|
-
readonly resourceMetadataUrl: string | null;
|
|
10
|
-
readonly authorizationServerUrl: string | null;
|
|
11
|
-
readonly resourceMetadata: JsonObject | null;
|
|
12
|
-
readonly authorizationServerMetadata: JsonObject | null;
|
|
13
|
-
readonly clientInformation: JsonObject | null;
|
|
14
|
-
}
|
|
15
|
-
export interface McpOAuthStartResult extends McpOAuthDiscoveryState {
|
|
16
|
-
readonly authorizationUrl: string;
|
|
17
|
-
readonly codeVerifier: string;
|
|
18
|
-
}
|
|
19
|
-
export interface McpOAuthSession extends McpOAuthDiscoveryState {
|
|
20
|
-
readonly endpoint: string;
|
|
21
|
-
readonly redirectUrl: string;
|
|
22
|
-
readonly codeVerifier: string;
|
|
23
|
-
}
|
|
24
|
-
export interface McpOAuthExchangeResult extends McpOAuthDiscoveryState {
|
|
25
|
-
readonly tokens: OAuthTokens;
|
|
26
|
-
}
|
|
27
|
-
export declare const startMcpOAuthAuthorization: (input: {
|
|
28
|
-
endpoint: string;
|
|
29
|
-
redirectUrl: string;
|
|
30
|
-
state: string;
|
|
31
|
-
}) => Effect.Effect<McpOAuthStartResult, McpOAuthError>;
|
|
32
|
-
export declare const exchangeMcpOAuthCode: (input: {
|
|
33
|
-
session: McpOAuthSession;
|
|
34
|
-
code: string;
|
|
35
|
-
}) => Effect.Effect<McpOAuthExchangeResult, McpOAuthError>;
|
|
36
|
-
export {};
|