@frontmcp/sdk 0.5.0 → 0.6.0
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 +3 -3
- package/package.json +8 -19
- package/src/adapter/adapter.instance.js +5 -0
- package/src/adapter/adapter.instance.js.map +1 -1
- package/src/auth/authorization/authorization.class.d.ts +1 -4
- package/src/auth/authorization/authorization.class.js +6 -13
- package/src/auth/authorization/authorization.class.js.map +1 -1
- package/src/auth/flows/session.verify.flow.d.ts +1 -0
- package/src/auth/flows/session.verify.flow.js +11 -1
- package/src/auth/flows/session.verify.flow.js.map +1 -1
- package/src/auth/flows/well-known.jwks.flow.js +2 -2
- package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
- package/src/auth/jwks/dev-key-persistence.d.ts +63 -0
- package/src/auth/jwks/dev-key-persistence.js +219 -0
- package/src/auth/jwks/dev-key-persistence.js.map +1 -0
- package/src/auth/jwks/index.d.ts +1 -0
- package/src/auth/jwks/index.js +1 -0
- package/src/auth/jwks/index.js.map +1 -1
- package/src/auth/jwks/jwks.service.d.ts +7 -4
- package/src/auth/jwks/jwks.service.js +81 -12
- package/src/auth/jwks/jwks.service.js.map +1 -1
- package/src/auth/jwks/jwks.types.d.ts +7 -0
- package/src/auth/jwks/jwks.types.js.map +1 -1
- package/src/auth/machine-id.d.ts +5 -0
- package/src/auth/machine-id.js +32 -0
- package/src/auth/machine-id.js.map +1 -0
- package/src/auth/session/index.d.ts +1 -0
- package/src/auth/session/index.js +3 -1
- package/src/auth/session/index.js.map +1 -1
- package/src/auth/session/record/session.base.js +5 -3
- package/src/auth/session/record/session.base.js.map +1 -1
- package/src/auth/session/record/session.stateless.d.ts +2 -2
- package/src/auth/session/record/session.stateless.js +5 -3
- package/src/auth/session/record/session.stateless.js.map +1 -1
- package/src/auth/session/redis-session.store.d.ts +64 -0
- package/src/auth/session/redis-session.store.js +204 -0
- package/src/auth/session/redis-session.store.js.map +1 -0
- package/src/auth/session/session.service.d.ts +0 -2
- package/src/auth/session/session.service.js +1 -7
- package/src/auth/session/session.service.js.map +1 -1
- package/src/auth/session/transport-session.manager.js +3 -5
- package/src/auth/session/transport-session.manager.js.map +1 -1
- package/src/auth/session/transport-session.types.d.ts +4 -0
- package/src/auth/session/transport-session.types.js +4 -3
- package/src/auth/session/transport-session.types.js.map +1 -1
- package/src/auth/session/utils/session-id.utils.d.ts +12 -1
- package/src/auth/session/utils/session-id.utils.js +48 -9
- package/src/auth/session/utils/session-id.utils.js.map +1 -1
- package/src/auth/ui/base-layout.d.ts +0 -8
- package/src/auth/ui/base-layout.js +1 -14
- package/src/auth/ui/base-layout.js.map +1 -1
- package/src/auth/ui/index.d.ts +3 -4
- package/src/auth/ui/index.js +10 -11
- package/src/auth/ui/index.js.map +1 -1
- package/src/auth/ui/{htmx-templates.d.ts → templates.d.ts} +5 -6
- package/src/auth/ui/{htmx-templates.js → templates.js} +8 -15
- package/src/auth/ui/templates.js.map +1 -0
- package/src/common/decorators/decorator-utils.js.map +1 -1
- package/src/common/decorators/front-mcp.decorator.js +28 -2
- package/src/common/decorators/front-mcp.decorator.js.map +1 -1
- package/src/common/index.d.ts +0 -1
- package/src/common/index.js +0 -1
- package/src/common/index.js.map +1 -1
- package/src/common/interfaces/adapter.interface.d.ts +6 -0
- package/src/common/interfaces/adapter.interface.js.map +1 -1
- package/src/common/interfaces/execution-context.interface.d.ts +52 -3
- package/src/common/interfaces/execution-context.interface.js +88 -3
- package/src/common/interfaces/execution-context.interface.js.map +1 -1
- package/src/common/interfaces/flow.interface.d.ts +13 -0
- package/src/common/interfaces/flow.interface.js +24 -0
- package/src/common/interfaces/flow.interface.js.map +1 -1
- package/src/common/interfaces/server.interface.d.ts +9 -0
- package/src/common/interfaces/server.interface.js.map +1 -1
- package/src/common/metadata/app.metadata.d.ts +108 -0
- package/src/common/metadata/front-mcp.metadata.d.ts +659 -2
- package/src/common/metadata/front-mcp.metadata.js +3 -1
- package/src/common/metadata/front-mcp.metadata.js.map +1 -1
- package/src/common/metadata/provider.metadata.d.ts +14 -0
- package/src/common/metadata/provider.metadata.js +18 -2
- package/src/common/metadata/provider.metadata.js.map +1 -1
- package/src/common/metadata/tool.metadata.d.ts +33 -1
- package/src/common/metadata/tool.metadata.js.map +1 -1
- package/src/common/migrate/auth-transport.migrate.d.ts +62 -0
- package/src/common/migrate/auth-transport.migrate.js +140 -0
- package/src/common/migrate/auth-transport.migrate.js.map +1 -0
- package/src/common/migrate/index.d.ts +1 -0
- package/src/common/migrate/index.js +6 -0
- package/src/common/migrate/index.js.map +1 -0
- package/src/common/schemas/http-output.schema.d.ts +10 -2
- package/src/common/schemas/index.d.ts +1 -0
- package/src/common/schemas/index.js +1 -0
- package/src/common/schemas/index.js.map +1 -1
- package/src/common/schemas/session-header.schema.d.ts +16 -0
- package/src/common/schemas/session-header.schema.js +42 -0
- package/src/common/schemas/session-header.schema.js.map +1 -0
- package/src/common/tokens/front-mcp.tokens.js +3 -1
- package/src/common/tokens/front-mcp.tokens.js.map +1 -1
- package/src/common/types/options/auth.options.d.ts +233 -3
- package/src/common/types/options/auth.options.js +29 -40
- package/src/common/types/options/auth.options.js.map +1 -1
- package/src/common/types/options/index.d.ts +2 -0
- package/src/common/types/options/index.js +2 -0
- package/src/common/types/options/index.js.map +1 -1
- package/src/common/types/options/redis.options.d.ts +22 -0
- package/src/common/types/options/redis.options.js +45 -0
- package/src/common/types/options/redis.options.js.map +1 -0
- package/src/common/types/options/transport.options.d.ts +84 -0
- package/src/common/types/options/transport.options.js +121 -0
- package/src/common/types/options/transport.options.js.map +1 -0
- package/src/completion/flows/complete.flow.d.ts +17 -2
- package/src/context/frontmcp-context-storage.d.ts +94 -0
- package/src/context/frontmcp-context-storage.js +183 -0
- package/src/context/frontmcp-context-storage.js.map +1 -0
- package/src/context/frontmcp-context.d.ts +269 -0
- package/src/context/frontmcp-context.js +360 -0
- package/src/context/frontmcp-context.js.map +1 -0
- package/src/context/frontmcp-context.provider.d.ts +43 -0
- package/src/context/frontmcp-context.provider.js +61 -0
- package/src/context/frontmcp-context.provider.js.map +1 -0
- package/src/context/index.d.ts +34 -0
- package/src/context/index.js +64 -0
- package/src/context/index.js.map +1 -0
- package/src/context/request-context-storage.d.ts +89 -0
- package/src/context/request-context-storage.js +183 -0
- package/src/context/request-context-storage.js.map +1 -0
- package/src/context/request-context.d.ts +184 -0
- package/src/context/request-context.js +209 -0
- package/src/context/request-context.js.map +1 -0
- package/src/context/request-context.provider.d.ts +37 -0
- package/src/context/request-context.provider.js +51 -0
- package/src/context/request-context.provider.js.map +1 -0
- package/src/context/session-key.provider.d.ts +45 -0
- package/src/context/session-key.provider.js +65 -0
- package/src/context/session-key.provider.js.map +1 -0
- package/src/context/trace-context.d.ts +43 -0
- package/src/context/trace-context.js +142 -0
- package/src/context/trace-context.js.map +1 -0
- package/src/errors/index.d.ts +1 -1
- package/src/errors/index.js +3 -1
- package/src/errors/index.js.map +1 -1
- package/src/errors/mcp.error.d.ts +7 -0
- package/src/errors/mcp.error.js +11 -1
- package/src/errors/mcp.error.js.map +1 -1
- package/src/flows/flow.instance.d.ts +16 -0
- package/src/flows/flow.instance.js +166 -80
- package/src/flows/flow.instance.js.map +1 -1
- package/src/flows/flow.registry.d.ts +5 -0
- package/src/flows/flow.registry.js +45 -3
- package/src/flows/flow.registry.js.map +1 -1
- package/src/front-mcp/front-mcp.d.ts +12 -0
- package/src/front-mcp/front-mcp.js +22 -3
- package/src/front-mcp/front-mcp.js.map +1 -1
- package/src/front-mcp/front-mcp.providers.d.ts +266 -1
- package/src/front-mcp/front-mcp.providers.js +2 -1
- package/src/front-mcp/front-mcp.providers.js.map +1 -1
- package/src/front-mcp/serverless-handler.d.ts +28 -0
- package/src/front-mcp/serverless-handler.js +61 -0
- package/src/front-mcp/serverless-handler.js.map +1 -0
- package/src/hooks/hooks.utils.d.ts +1 -1
- package/src/hooks/hooks.utils.js +10 -3
- package/src/hooks/hooks.utils.js.map +1 -1
- package/src/index.d.ts +8 -4
- package/src/index.js +20 -1
- package/src/index.js.map +1 -1
- package/src/logger/instances/instance.logger.js +0 -1
- package/src/logger/instances/instance.logger.js.map +1 -1
- package/src/logging/flows/set-level.flow.d.ts +17 -2
- package/src/notification/notification.service.js +5 -1
- package/src/notification/notification.service.js.map +1 -1
- package/src/prompt/flows/get-prompt.flow.d.ts +97 -2
- package/src/prompt/flows/prompts-list.flow.d.ts +12 -1
- package/src/provider/provider.registry.d.ts +97 -5
- package/src/provider/provider.registry.js +306 -9
- package/src/provider/provider.registry.js.map +1 -1
- package/src/provider/provider.types.d.ts +21 -3
- package/src/provider/provider.types.js.map +1 -1
- package/src/resource/flows/read-resource.flow.d.ts +22 -3
- package/src/resource/flows/resource-templates-list.flow.d.ts +20 -1
- package/src/resource/flows/resources-list.flow.d.ts +20 -1
- package/src/resource/flows/subscribe-resource.flow.d.ts +17 -2
- package/src/resource/flows/unsubscribe-resource.flow.d.ts +17 -2
- package/src/scope/flows/http.request.flow.js +43 -7
- package/src/scope/flows/http.request.flow.js.map +1 -1
- package/src/scope/scope.instance.js +12 -5
- package/src/scope/scope.instance.js.map +1 -1
- package/src/server/adapters/base.host.adapter.d.ts +9 -0
- package/src/server/adapters/base.host.adapter.js.map +1 -1
- package/src/server/adapters/express.host.adapter.d.ts +12 -0
- package/src/server/adapters/express.host.adapter.js +21 -1
- package/src/server/adapters/express.host.adapter.js.map +1 -1
- package/src/server/server.instance.d.ts +3 -0
- package/src/server/server.instance.js +14 -7
- package/src/server/server.instance.js.map +1 -1
- package/src/tool/flows/call-tool.flow.d.ts +118 -13
- package/src/tool/flows/call-tool.flow.js +240 -194
- package/src/tool/flows/call-tool.flow.js.map +1 -1
- package/src/tool/flows/tools-list.flow.d.ts +25 -11
- package/src/tool/flows/tools-list.flow.js +82 -31
- package/src/tool/flows/tools-list.flow.js.map +1 -1
- package/src/tool/tool.instance.d.ts +1 -4
- package/src/transport/adapters/transport.streamable-http.adapter.js +1 -0
- package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
- package/src/transport/flows/handle.sse.flow.js +9 -2
- package/src/transport/flows/handle.sse.flow.js.map +1 -1
- package/src/transport/flows/handle.streamable-http.flow.js +63 -6
- package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
- package/src/transport/mcp-handlers/complete-request.handler.d.ts +27 -1
- package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +52 -1
- package/src/transport/mcp-handlers/index.d.ts +413 -7
- package/src/transport/mcp-handlers/initialize-request.handler.js +12 -2
- package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +27 -1
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +32 -1
- package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +32 -1
- package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +30 -1
- package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +20 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +27 -1
- package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +20 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +20 -0
- package/src/transport/transport.registry.d.ts +68 -4
- package/src/transport/transport.registry.js +313 -11
- package/src/transport/transport.registry.js.map +1 -1
- package/src/auth/ui/htmx-templates.js.map +0 -1
- package/src/common/providers/session.provider.d.ts +0 -13
- package/src/common/providers/session.provider.js +0 -27
- package/src/common/providers/session.provider.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-tool.flow.js","sourceRoot":"","sources":["../../../../src/tool/flows/call-tool.flow.ts"],"names":[],"mappings":"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","sourcesContent":["// tools/flows/call-tool.flow.ts\nimport { randomUUID } from 'crypto';\nimport {\n Flow,\n FlowBase,\n FlowHooksOf,\n FlowPlan,\n FlowRunOptions,\n ToolContext,\n ToolEntry,\n isOrchestratedMode,\n} from '../../common';\nimport { z } from 'zod';\nimport { CallToolRequestSchema, CallToolResultSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport {\n InvalidMethodError,\n ToolNotFoundError,\n InvalidInputError,\n InvalidOutputError,\n ToolExecutionError,\n AuthorizationRequiredError,\n} from '../../errors';\nimport { hasUIConfig } from '../ui';\nimport { Scope } from '../../scope';\n\nconst inputSchema = z.object({\n request: CallToolRequestSchema,\n // z.any() used because ctx is the MCP SDK's ToolCallExtra type which varies by SDK version\n ctx: z.any(),\n});\n\nconst outputSchema = CallToolResultSchema;\n\nconst stateSchema = z.object({\n input: z.looseObject({\n name: z.string().min(1).max(64),\n arguments: z.looseObject({}).optional(),\n }),\n authInfo: z.any().optional() as z.ZodType<AuthInfo>,\n tool: z.instanceof(ToolEntry),\n toolContext: z.instanceof(ToolContext),\n // Store the raw executed output for plugins to see\n rawOutput: z.any().optional(),\n output: outputSchema,\n // Tool owner ID for hook filtering (set during parseInput)\n _toolOwnerId: z.string().optional(),\n});\n\nconst plan = {\n pre: [\n 'parseInput',\n 'findTool',\n 'checkToolAuthorization',\n 'createToolCallContext',\n 'acquireQuota',\n 'acquireSemaphore',\n ],\n execute: ['validateInput', 'execute', 'validateOutput'],\n finalize: ['releaseSemaphore', 'releaseQuota', 'finalize'],\n} as const satisfies FlowPlan<string>;\n\ndeclare global {\n interface ExtendFlows {\n 'tools:call-tool': FlowRunOptions<\n CallToolFlow,\n typeof plan,\n typeof inputSchema,\n typeof outputSchema,\n typeof stateSchema\n >;\n }\n}\n\nconst name = 'tools:call-tool' as const;\nconst { Stage } = FlowHooksOf<'tools:call-tool'>(name);\n\n/**\n * Safely stringify a value, handling circular references and other edge cases.\n * This prevents tool calls from failing due to serialization errors.\n */\nconst safeStringify = (value: unknown, space?: number): string => {\n const seen = new WeakSet<object>();\n try {\n return JSON.stringify(\n value,\n (_key, val) => {\n if (typeof val === 'object' && val !== null) {\n if (seen.has(val)) return '[Circular]';\n seen.add(val);\n }\n return val;\n },\n space,\n );\n } catch {\n return JSON.stringify({ error: 'Output could not be serialized' });\n }\n};\n\n@Flow({\n name,\n plan,\n inputSchema,\n outputSchema,\n access: 'authorized',\n})\nexport default class CallToolFlow extends FlowBase<typeof name> {\n logger = this.scopeLogger.child('CallToolFlow');\n\n @Stage('parseInput')\n async parseInput() {\n this.logger.verbose('parseInput:start');\n\n let method!: string;\n // NOTE: `any` is intentional - Zod parsing validates these values\n // Using unknown would require redundant type guards after schema validation\n let params: any;\n let ctx: any;\n try {\n const inputData = inputSchema.parse(this.rawInput);\n method = inputData.request.method;\n params = inputData.request.params;\n ctx = inputData.ctx;\n } catch (e) {\n throw new InvalidInputError('Invalid Input', e instanceof z.ZodError ? e.issues : undefined);\n }\n\n if (method !== 'tools/call') {\n this.logger.warn(`parseInput: invalid method \"${method}\"`);\n throw new InvalidMethodError(method, 'tools/call');\n }\n\n // Find the tool early to get its owner ID for hook filtering\n const { name } = params;\n const activeTools = this.scope.tools.getTools(true);\n const tool = activeTools.find((entry) => {\n return entry.fullName === name || entry.name === name;\n });\n\n // Store tool owner ID in state for hook filtering\n const toolOwnerId = tool?.owner?.id;\n\n this.state.set({ input: params, authInfo: ctx.authInfo, _toolOwnerId: toolOwnerId });\n this.logger.verbose('parseInput:done');\n }\n\n @Stage('findTool')\n async findTool() {\n this.logger.verbose('findTool:start');\n // TODO: add support for session based tools\n const activeTools = this.scope.tools.getTools(true);\n this.logger.info(`findTool: discovered ${activeTools.length} active tool(s) (including hidden)`);\n\n const { name } = this.state.required.input;\n const tool = activeTools.find((entry) => {\n return entry.fullName === name || entry.name === name;\n });\n\n if (!tool) {\n this.logger.warn(`findTool: tool \"${name}\" not found`);\n throw new ToolNotFoundError(name);\n }\n\n this.logger = this.logger.child(`CallToolFlow(${name})`);\n this.state.set('tool', tool);\n this.logger.info(`findTool: tool \"${name}\" found`);\n this.logger.verbose('findTool:done');\n }\n\n /**\n * Check if the tool's parent app is authorized.\n * For progressive authorization, tools from unauthorized apps\n * return an AuthorizationRequiredError with an auth_url.\n */\n @Stage('checkToolAuthorization')\n async checkToolAuthorization() {\n this.logger.verbose('checkToolAuthorization:start');\n const { tool, authInfo } = this.state;\n\n // Get authorization from authInfo.extra if available\n const authorization = authInfo?.extra?.['authorization'] as\n | {\n authorizedAppIds?: string[];\n authorizedApps?: Record<string, unknown>;\n }\n | undefined;\n\n // No auth context = public mode, skip authorization check\n if (!authorization) {\n this.logger.verbose('checkToolAuthorization:skip (no auth context)');\n return;\n }\n\n // Get app ID from tool owner (uses existing lineage system)\n const appId = tool?.owner?.id;\n if (!appId) {\n // Tool has no owner = global tool, skip app-level authorization check\n this.logger.verbose('checkToolAuthorization:skip (no owner)');\n return;\n }\n\n // Check if app is authorized using existing session structure\n const isAppAuthorized =\n authorization.authorizedAppIds?.includes(appId) || appId in (authorization.authorizedApps || {});\n\n if (!isAppAuthorized) {\n // Get incremental auth configuration from scope's auth options\n const apps = this.scope.apps.getApps();\n const app = apps.find((a) => a.metadata.id === appId);\n const authOptions = this.scope.auth?.options;\n\n // Determine skippedAppBehavior:\n // 1. Only applies in orchestrated mode with incrementalAuth configured\n // 2. Default to 'anonymous' if not configured (allow anonymous fallback)\n let skippedBehavior: 'anonymous' | 'require-auth' = 'anonymous';\n\n if (authOptions && isOrchestratedMode(authOptions)) {\n // Orchestrated mode - check incrementalAuth config\n const incrementalConfig = authOptions.incrementalAuth;\n if (incrementalConfig) {\n // If incremental auth is disabled, always require auth\n if (incrementalConfig.enabled === false) {\n skippedBehavior = 'require-auth';\n } else {\n skippedBehavior = incrementalConfig.skippedAppBehavior || 'anonymous';\n }\n }\n // If incrementalAuth not configured, default is enabled with 'anonymous' behavior\n }\n // For public/transparent modes, default 'anonymous' behavior applies\n\n if (skippedBehavior === 'anonymous' && app?.metadata?.auth?.mode === 'public') {\n // App supports anonymous - continue with anonymous access\n this.logger.verbose(`checkToolAuthorization: using anonymous for ${appId}`);\n return;\n }\n\n // Require explicit authorization - build auth URL\n const authUrl = this.buildProgressiveAuthUrl(appId, tool?.fullName || '');\n\n this.logger.info(`checkToolAuthorization: authorization required for app \"${appId}\"`);\n throw new AuthorizationRequiredError({\n appId,\n toolId: tool?.fullName || tool?.name || 'unknown',\n authUrl,\n message: `Authorization required for ${appId}. Please authorize to use ${tool?.fullName || tool?.name}.`,\n });\n }\n\n this.logger.verbose('checkToolAuthorization:done');\n }\n\n /**\n * Build the URL for progressive/incremental authorization\n */\n private buildProgressiveAuthUrl(appId: string, toolId: string): string {\n const baseUrl = this.scope.fullPath || '';\n return `${baseUrl}/oauth/authorize?app=${encodeURIComponent(appId)}&tool=${encodeURIComponent(toolId)}`;\n }\n\n @Stage('createToolCallContext')\n async createToolCallContext() {\n this.logger.verbose('createToolCallContext:start');\n const { ctx } = this.input;\n const { tool, input } = this.state.required;\n\n try {\n const context = tool.create(input.arguments, ctx);\n const toolHooks = this.scope.hooks.getClsHooks(tool.record.provide).map((hook) => {\n hook.run = async () => {\n return context[hook.metadata.method]();\n };\n return hook;\n });\n\n this.appendContextHooks(toolHooks);\n context.mark('createToolCallContext');\n this.state.set('toolContext', context);\n this.logger.verbose('createToolCallContext:done');\n } catch (error) {\n this.logger.error('createToolCallContext: failed to create context', error);\n throw new ToolExecutionError(tool.metadata.name, error instanceof Error ? error : undefined);\n }\n }\n\n @Stage('acquireQuota')\n async acquireQuota() {\n this.logger.verbose('acquireQuota:start');\n // used for rate limiting\n this.state.toolContext?.mark('acquireQuota');\n this.logger.verbose('acquireQuota:done');\n }\n\n @Stage('acquireSemaphore')\n async acquireSemaphore() {\n this.logger.verbose('acquireSemaphore:start');\n // used for concurrency control\n this.state.toolContext?.mark('acquireSemaphore');\n this.logger.verbose('acquireSemaphore:done');\n }\n\n @Stage('validateInput')\n async validateInput() {\n this.logger.verbose('validateInput:start');\n const { tool, input } = this.state.required;\n const { toolContext } = this.state;\n if (!toolContext) {\n return;\n }\n toolContext.mark('validateInput');\n\n try {\n toolContext.input = tool.parseInput(input);\n this.logger.verbose('validateInput:done');\n } catch (err) {\n if (err instanceof z.ZodError) {\n throw new InvalidInputError('Invalid tool input', err.issues);\n }\n\n this.logger.error('validateInput: failed to parse input', err);\n throw new InvalidInputError('Unknown error occurred when trying to parse input');\n }\n }\n\n @Stage('execute')\n async execute() {\n this.logger.verbose('execute:start');\n const toolContext = this.state.toolContext;\n if (!toolContext) {\n return;\n }\n toolContext.mark('execute');\n\n try {\n toolContext.output = await toolContext.execute(toolContext.input);\n this.logger.verbose('execute:done');\n } catch (error) {\n this.logger.error('execute: tool execution failed', error);\n throw new ToolExecutionError(\n this.state.tool?.metadata.name || 'unknown',\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n @Stage('validateOutput')\n async validateOutput() {\n this.logger.verbose('validateOutput:start');\n const { toolContext } = this.state;\n if (!toolContext) {\n return;\n }\n toolContext.mark('validateOutput');\n\n // Store the RAW output for plugins (cache, PII, etc.) to inspect\n this.state.set('rawOutput', toolContext.output);\n\n this.logger.verbose('validateOutput:done');\n }\n\n @Stage('releaseSemaphore')\n async releaseSemaphore() {\n this.logger.verbose('releaseSemaphore:start');\n // release concurrency control\n this.state.toolContext?.mark('releaseSemaphore');\n this.logger.verbose('releaseSemaphore:done');\n }\n\n @Stage('releaseQuota')\n async releaseQuota() {\n this.logger.verbose('releaseQuota:start');\n // release rate limiting\n this.state.toolContext?.mark('releaseQuota');\n this.logger.verbose('releaseQuota:done');\n }\n\n @Stage('finalize')\n async finalize() {\n this.logger.verbose('finalize:start');\n const { tool, rawOutput, input } = this.state;\n\n if (!tool) {\n this.logger.error('finalize: tool not found in state');\n throw new ToolExecutionError('unknown', new Error('Tool not found in state'));\n }\n\n if (rawOutput === undefined) {\n this.logger.error('finalize: tool output not found in state');\n throw new ToolExecutionError(tool.metadata.name, new Error('Tool output not found'));\n }\n\n // Parse and construct the MCP-compliant output using safeParseOutput\n const parseResult = tool.safeParseOutput(rawOutput);\n\n if (!parseResult.success) {\n // add support for request id in error messages\n this.logger.error('finalize: output validation failed', {\n tool: tool.metadata.name,\n errors: parseResult.error,\n });\n\n // Use InvalidOutputError, which hides internal details in production\n throw new InvalidOutputError();\n }\n\n const result = parseResult.data;\n\n // If tool has UI config, render and add to _meta\n if (hasUIConfig(tool.metadata)) {\n try {\n // Cast scope to Scope to access toolUI and notifications\n const scope = this.scope as Scope;\n\n // Get session info for platform detection from authInfo (already in state from parseInput)\n const { authInfo } = this.state;\n const sessionId = authInfo?.sessionId;\n const requestId: string = randomUUID();\n\n // Get platform type: first check sessionIdPayload (detected from user-agent),\n // then fall back to notification service (detected from MCP clientInfo),\n // finally default to 'openai'\n const platformType =\n authInfo?.sessionIdPayload?.platformType ??\n (sessionId ? scope.notifications.getPlatformType(sessionId) : undefined) ??\n 'openai';\n\n // Get the serving mode (default to 'inline' for backward compatibility)\n const servingMode = tool.metadata.ui.servingMode ?? 'inline';\n\n if (servingMode === 'static') {\n // For static mode: return ONLY structured data\n // The static widget was already registered at server startup and advertised in tools/list\n // Widget reads tool output from platform context (e.g., window.openai.toolOutput)\n // NO UI _meta fields needed - the client uses the outputTemplate URI from tools/list\n\n // Return structured data as JSON text content\n result.content = [\n {\n type: 'text',\n text: safeStringify(rawOutput),\n },\n ];\n\n // Do NOT add any UI _meta fields - widget reads from platform context\n // The outputTemplate URI (ui://widget/{toolName}.html) was already provided in tools/list\n\n this.logger.verbose('finalize: UI using static mode (structured data only)', {\n tool: tool.metadata.name,\n platform: platformType,\n outputKeys:\n rawOutput && typeof rawOutput === 'object' && !Array.isArray(rawOutput) ? Object.keys(rawOutput) : [],\n });\n } else if (servingMode === 'hybrid') {\n // For hybrid mode: return structured data + transpiled component code\n // The hybrid shell (React runtime + renderer) was pre-compiled at server startup\n // and advertised via outputTemplate URI in tools/list.\n // The shell dynamically imports the component code from _meta['ui/component']\n // and renders it with toolOutput data from the platform context.\n\n // Build the component payload with transpiled code\n const componentPayload = scope.toolUI.buildHybridComponentPayload({\n toolName: tool.metadata.name,\n template: tool.metadata.ui.template,\n uiConfig: tool.metadata.ui,\n });\n\n // Return structured data as JSON text content\n result.content = [\n {\n type: 'text',\n text: safeStringify(rawOutput),\n },\n ];\n\n // Add component payload to _meta for the hybrid shell's dynamic renderer\n if (componentPayload) {\n result._meta = {\n ...result._meta,\n 'ui/component': componentPayload,\n 'ui/type': componentPayload.type,\n };\n }\n\n this.logger.verbose('finalize: UI using hybrid mode (structured data + component)', {\n tool: tool.metadata.name,\n platform: platformType,\n hasComponent: !!componentPayload,\n componentType: componentPayload?.type,\n componentHash: componentPayload?.hash,\n outputKeys:\n rawOutput && typeof rawOutput === 'object' && !Array.isArray(rawOutput) ? Object.keys(rawOutput) : [],\n });\n } else {\n // For inline mode (default): render HTML with data embedded in each response\n // Use async version to support React component templates via SSR\n const uiResult = await scope.toolUI.renderAndRegisterAsync({\n toolName: tool.metadata.name,\n requestId,\n input:\n input?.arguments && typeof input.arguments === 'object' && !Array.isArray(input.arguments)\n ? (input.arguments as Record<string, unknown>)\n : {},\n output: rawOutput,\n structuredContent: result.structuredContent,\n uiConfig: tool.metadata.ui,\n platformType,\n });\n\n // Merge UI metadata into result._meta\n result._meta = {\n ...result._meta,\n ...uiResult.meta,\n };\n\n // For platforms that support widgets (OpenAI, ext-apps), clear content since widget displays data\n // For Claude and other platforms, keep the text content as they don't support _meta UI fields\n const supportsWidgets = platformType === 'openai' || platformType === 'ext-apps';\n\n if (supportsWidgets) {\n // Clear content - widget will display from _meta['ui/html']\n result.content = [];\n } else {\n // For Claude and other platforms without widget support:\n // Return JSON data + HTML template as artifact hint\n const htmlContent = uiResult?.meta?.['ui/html'];\n\n if (htmlContent) {\n // Include HTML template as artifact hint for Claude\n // Claude can use this to create an HTML artifact for visual display\n result.content = [\n {\n type: 'text',\n text: `## Data\\n\\`\\`\\`json\\n${safeStringify(\n rawOutput,\n 2,\n )}\\n\\`\\`\\`\\n\\n## Visual Template (for artifact rendering)\\n\\`\\`\\`html\\n${htmlContent}\\n\\`\\`\\``,\n },\n ];\n } else {\n // Fallback: JSON only\n result.content = [\n {\n type: 'text',\n text: safeStringify(rawOutput, 2),\n },\n ];\n }\n }\n\n this.logger.verbose('finalize: UI metadata added (inline mode)', {\n tool: tool.metadata.name,\n platform: platformType,\n supportsWidgets,\n contentCleared: supportsWidgets,\n htmlHintIncluded: !supportsWidgets && !!uiResult?.meta?.['ui/html'],\n });\n }\n } catch (error) {\n // UI rendering failure should not fail the tool call\n // Log with full context to help debugging\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n const uiConfig = tool.metadata.ui;\n\n this.logger.error('finalize: UI rendering failed', {\n tool: tool.metadata.name,\n error: errorMessage,\n stack: errorStack,\n templateType: uiConfig?.template\n ? typeof uiConfig.template === 'function'\n ? 'react-component'\n : typeof uiConfig.template === 'string'\n ? uiConfig.template.endsWith('.tsx') || uiConfig.template.endsWith('.jsx')\n ? 'react-file'\n : 'html-file'\n : 'unknown'\n : 'none',\n hasStructuredContent: result.structuredContent !== undefined,\n structuredContentKeys:\n result.structuredContent &&\n typeof result.structuredContent === 'object' &&\n result.structuredContent !== null &&\n !Array.isArray(result.structuredContent)\n ? Object.keys(result.structuredContent)\n : [],\n });\n\n // In debug mode, also log to console for immediate visibility\n if (process.env['DEBUG'] || process.env['NODE_ENV'] === 'development') {\n console.error('[FrontMCP] UI Rendering Error:', {\n tool: tool.metadata.name,\n error: errorMessage,\n stack: errorStack,\n });\n }\n }\n }\n\n // Log the final result being sent\n this.logger.info('finalize: sending response', {\n tool: tool.metadata.name,\n hasContent: Array.isArray(result.content) && result.content.length > 0,\n contentLength: Array.isArray(result.content) ? result.content.length : 0,\n hasStructuredContent: result.structuredContent !== undefined,\n hasMeta: result._meta !== undefined,\n metaKeys: result._meta ? Object.keys(result._meta) : [],\n isError: result.isError,\n });\n\n // Respond with the properly formatted MCP result\n this.respond(result);\n this.logger.verbose('finalize:done');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"call-tool.flow.js","sourceRoot":"","sources":["../../../../src/tool/flows/call-tool.flow.ts"],"names":[],"mappings":"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","sourcesContent":["// tools/flows/call-tool.flow.ts\nimport { randomUUID } from 'crypto';\nimport {\n Flow,\n FlowBase,\n FlowHooksOf,\n FlowPlan,\n FlowRunOptions,\n ToolContext,\n ToolEntry,\n isOrchestratedMode,\n} from '../../common';\nimport { z } from 'zod';\nimport { CallToolRequestSchema, CallToolResultSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport {\n InvalidMethodError,\n ToolNotFoundError,\n InvalidInputError,\n InvalidOutputError,\n ToolExecutionError,\n AuthorizationRequiredError,\n} from '../../errors';\nimport { hasUIConfig } from '../ui';\nimport { Scope } from '../../scope';\nimport { resolveServingMode, buildToolResponseContent, type ToolResponseContent } from '@frontmcp/ui/adapters';\nimport { isUIRenderFailure } from '@frontmcp/ui/registry';\nimport { safeStringify } from '@frontmcp/ui/utils';\n\nconst inputSchema = z.object({\n request: CallToolRequestSchema,\n // z.any() used because ctx is the MCP SDK's ToolCallExtra type which varies by SDK version\n ctx: z.any(),\n});\n\nconst outputSchema = CallToolResultSchema;\n\nconst stateSchema = z.object({\n input: z.looseObject({\n name: z.string().min(1).max(64),\n arguments: z.looseObject({}).optional(),\n }),\n authInfo: z.any().optional() as z.ZodType<AuthInfo>,\n tool: z.instanceof(ToolEntry),\n toolContext: z.instanceof(ToolContext),\n // Store the raw executed output for plugins to see\n rawOutput: z.any().optional(),\n output: outputSchema,\n // Tool owner ID for hook filtering (set during parseInput)\n _toolOwnerId: z.string().optional(),\n // UI result from applyUI stage (if UI config exists)\n uiResult: z.any().optional() as z.ZodType<ToolResponseContent | undefined>,\n // UI metadata from rendering (merged into _meta)\n uiMeta: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst plan = {\n pre: [\n 'parseInput',\n 'findTool',\n 'checkToolAuthorization',\n 'createToolCallContext',\n 'acquireQuota',\n 'acquireSemaphore',\n ],\n execute: ['validateInput', 'execute', 'validateOutput'],\n finalize: ['releaseSemaphore', 'releaseQuota', 'applyUI', 'finalize'],\n} as const satisfies FlowPlan<string>;\n\ndeclare global {\n interface ExtendFlows {\n 'tools:call-tool': FlowRunOptions<\n CallToolFlow,\n typeof plan,\n typeof inputSchema,\n typeof outputSchema,\n typeof stateSchema\n >;\n }\n}\n\nconst name = 'tools:call-tool' as const;\nconst { Stage } = FlowHooksOf<'tools:call-tool'>(name);\n\n@Flow({\n name,\n plan,\n inputSchema,\n outputSchema,\n access: 'authorized',\n})\nexport default class CallToolFlow extends FlowBase<typeof name> {\n logger = this.scopeLogger.child('CallToolFlow');\n\n @Stage('parseInput')\n async parseInput() {\n this.logger.verbose('parseInput:start');\n\n let method!: string;\n // NOTE: `any` is intentional - Zod parsing validates these values\n // Using unknown would require redundant type guards after schema validation\n let params: any;\n let ctx: any;\n try {\n const inputData = inputSchema.parse(this.rawInput);\n method = inputData.request.method;\n params = inputData.request.params;\n ctx = inputData.ctx;\n } catch (e) {\n throw new InvalidInputError('Invalid Input', e instanceof z.ZodError ? e.issues : undefined);\n }\n\n if (method !== 'tools/call') {\n this.logger.warn(`parseInput: invalid method \"${method}\"`);\n throw new InvalidMethodError(method, 'tools/call');\n }\n\n // Find the tool early to get its owner ID for hook filtering\n const { name } = params;\n const activeTools = this.scope.tools.getTools(true);\n const tool = activeTools.find((entry) => {\n return entry.fullName === name || entry.name === name;\n });\n\n // Store tool owner ID in state for hook filtering\n const toolOwnerId = tool?.owner?.id;\n\n this.state.set({ input: params, authInfo: ctx.authInfo, _toolOwnerId: toolOwnerId });\n this.logger.verbose('parseInput:done');\n }\n\n @Stage('findTool')\n async findTool() {\n this.logger.verbose('findTool:start');\n // TODO: add support for session based tools\n const activeTools = this.scope.tools.getTools(true);\n this.logger.info(`findTool: discovered ${activeTools.length} active tool(s) (including hidden)`);\n\n const { name } = this.state.required.input;\n const tool = activeTools.find((entry) => {\n return entry.fullName === name || entry.name === name;\n });\n\n if (!tool) {\n this.logger.warn(`findTool: tool \"${name}\" not found`);\n throw new ToolNotFoundError(name);\n }\n\n this.logger = this.logger.child(`CallToolFlow(${name})`);\n this.state.set('tool', tool);\n this.logger.info(`findTool: tool \"${name}\" found`);\n this.logger.verbose('findTool:done');\n }\n\n /**\n * Check if the tool's parent app is authorized.\n * For progressive authorization, tools from unauthorized apps\n * return an AuthorizationRequiredError with an auth_url.\n */\n @Stage('checkToolAuthorization')\n async checkToolAuthorization() {\n this.logger.verbose('checkToolAuthorization:start');\n const { tool, authInfo } = this.state;\n\n // Get authorization from authInfo.extra if available\n const authorization = authInfo?.extra?.['authorization'] as\n | {\n authorizedAppIds?: string[];\n authorizedApps?: Record<string, unknown>;\n }\n | undefined;\n\n // No auth context = public mode, skip authorization check\n if (!authorization) {\n this.logger.verbose('checkToolAuthorization:skip (no auth context)');\n return;\n }\n\n // Get app ID from tool owner (uses existing lineage system)\n const appId = tool?.owner?.id;\n if (!appId) {\n // Tool has no owner = global tool, skip app-level authorization check\n this.logger.verbose('checkToolAuthorization:skip (no owner)');\n return;\n }\n\n // Check if app is authorized using existing session structure\n const isAppAuthorized =\n authorization.authorizedAppIds?.includes(appId) || appId in (authorization.authorizedApps || {});\n\n if (!isAppAuthorized) {\n // Get incremental auth configuration from scope's auth options\n const apps = this.scope.apps.getApps();\n const app = apps.find((a) => a.metadata.id === appId);\n const authOptions = this.scope.auth?.options;\n\n // Determine skippedAppBehavior:\n // 1. Only applies in orchestrated mode with incrementalAuth configured\n // 2. Default to 'anonymous' if not configured (allow anonymous fallback)\n let skippedBehavior: 'anonymous' | 'require-auth' = 'anonymous';\n\n if (authOptions && isOrchestratedMode(authOptions)) {\n // Orchestrated mode - check incrementalAuth config\n const incrementalConfig = authOptions.incrementalAuth;\n if (incrementalConfig) {\n // If incremental auth is disabled, always require auth\n if (incrementalConfig.enabled === false) {\n skippedBehavior = 'require-auth';\n } else {\n skippedBehavior = incrementalConfig.skippedAppBehavior || 'anonymous';\n }\n }\n // If incrementalAuth not configured, default is enabled with 'anonymous' behavior\n }\n // For public/transparent modes, default 'anonymous' behavior applies\n\n if (skippedBehavior === 'anonymous' && app?.metadata?.auth?.mode === 'public') {\n // App supports anonymous - continue with anonymous access\n this.logger.verbose(`checkToolAuthorization: using anonymous for ${appId}`);\n return;\n }\n\n // Require explicit authorization - build auth URL\n const authUrl = this.buildProgressiveAuthUrl(appId, tool?.fullName || '');\n\n this.logger.info(`checkToolAuthorization: authorization required for app \"${appId}\"`);\n throw new AuthorizationRequiredError({\n appId,\n toolId: tool?.fullName || tool?.name || 'unknown',\n authUrl,\n message: `Authorization required for ${appId}. Please authorize to use ${tool?.fullName || tool?.name}.`,\n });\n }\n\n this.logger.verbose('checkToolAuthorization:done');\n }\n\n /**\n * Build the URL for progressive/incremental authorization\n */\n private buildProgressiveAuthUrl(appId: string, toolId: string): string {\n const baseUrl = this.scope.fullPath || '';\n return `${baseUrl}/oauth/authorize?app=${encodeURIComponent(appId)}&tool=${encodeURIComponent(toolId)}`;\n }\n\n @Stage('createToolCallContext')\n async createToolCallContext() {\n this.logger.verbose('createToolCallContext:start');\n const { ctx } = this.input;\n const { tool, input } = this.state.required;\n\n try {\n const context = tool.create(input.arguments, ctx);\n const toolHooks = this.scope.hooks.getClsHooks(tool.record.provide).map((hook) => {\n hook.run = async () => {\n return context[hook.metadata.method]();\n };\n return hook;\n });\n\n this.appendContextHooks(toolHooks);\n context.mark('createToolCallContext');\n this.state.set('toolContext', context);\n this.logger.verbose('createToolCallContext:done');\n } catch (error) {\n this.logger.error('createToolCallContext: failed to create context', error);\n throw new ToolExecutionError(tool.metadata.name, error instanceof Error ? error : undefined);\n }\n }\n\n @Stage('acquireQuota')\n async acquireQuota() {\n this.logger.verbose('acquireQuota:start');\n // used for rate limiting\n this.state.toolContext?.mark('acquireQuota');\n this.logger.verbose('acquireQuota:done');\n }\n\n @Stage('acquireSemaphore')\n async acquireSemaphore() {\n this.logger.verbose('acquireSemaphore:start');\n // used for concurrency control\n this.state.toolContext?.mark('acquireSemaphore');\n this.logger.verbose('acquireSemaphore:done');\n }\n\n @Stage('validateInput')\n async validateInput() {\n this.logger.verbose('validateInput:start');\n const { tool, input } = this.state.required;\n const { toolContext } = this.state;\n if (!toolContext) {\n return;\n }\n toolContext.mark('validateInput');\n\n try {\n toolContext.input = tool.parseInput(input);\n this.logger.verbose('validateInput:done');\n } catch (err) {\n if (err instanceof z.ZodError) {\n throw new InvalidInputError('Invalid tool input', err.issues);\n }\n\n this.logger.error('validateInput: failed to parse input', err);\n throw new InvalidInputError('Unknown error occurred when trying to parse input');\n }\n }\n\n @Stage('execute')\n async execute() {\n this.logger.verbose('execute:start');\n const toolContext = this.state.toolContext;\n if (!toolContext) {\n return;\n }\n toolContext.mark('execute');\n\n try {\n toolContext.output = await toolContext.execute(toolContext.input);\n this.logger.verbose('execute:done');\n } catch (error) {\n this.logger.error('execute: tool execution failed', error);\n throw new ToolExecutionError(\n this.state.tool?.metadata.name || 'unknown',\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n @Stage('validateOutput')\n async validateOutput() {\n this.logger.verbose('validateOutput:start');\n const { toolContext } = this.state;\n if (!toolContext) {\n return;\n }\n toolContext.mark('validateOutput');\n\n // Store the RAW output for plugins (cache, PII, etc.) to inspect\n this.state.set('rawOutput', toolContext.output);\n\n this.logger.verbose('validateOutput:done');\n }\n\n @Stage('releaseSemaphore')\n async releaseSemaphore() {\n this.logger.verbose('releaseSemaphore:start');\n // release concurrency control\n this.state.toolContext?.mark('releaseSemaphore');\n this.logger.verbose('releaseSemaphore:done');\n }\n\n @Stage('releaseQuota')\n async releaseQuota() {\n this.logger.verbose('releaseQuota:start');\n // release rate limiting\n this.state.toolContext?.mark('releaseQuota');\n this.logger.verbose('releaseQuota:done');\n }\n\n /**\n * Apply UI rendering to the tool response.\n * This stage handles all UI-related logic including platform detection,\n * serving mode resolution, and content formatting.\n */\n @Stage('applyUI')\n async applyUI() {\n this.logger.verbose('applyUI:start');\n const { tool, rawOutput, input } = this.state;\n\n // Skip if no tool or no UI config\n if (!tool || !hasUIConfig(tool.metadata)) {\n this.logger.verbose('applyUI:skip (no UI config)');\n return;\n }\n\n try {\n // Cast scope to Scope to access toolUI and notifications\n const scope = this.scope as Scope;\n\n // Get session info for platform detection from authInfo (already in state from parseInput)\n const { authInfo } = this.state;\n const sessionId = authInfo?.sessionId;\n const requestId: string = randomUUID();\n\n // Get platform type: first check sessionIdPayload (detected from user-agent),\n // then fall back to notification service (detected from MCP clientInfo),\n // finally default to 'unknown' (conservative: skip UI for unknown clients)\n const platformType =\n authInfo?.sessionIdPayload?.platformType ??\n (sessionId ? scope.notifications.getPlatformType(sessionId) : undefined) ??\n 'unknown';\n\n // Resolve the effective serving mode based on configuration and client capabilities\n // Default is 'auto' which selects the best mode for the platform\n const configuredMode = tool.metadata.ui.servingMode ?? 'auto';\n const resolvedMode = resolveServingMode({\n configuredMode,\n platformType,\n });\n\n // If client doesn't support UI (e.g., Gemini, unknown, or forced mode not available)\n // skip UI rendering entirely\n if (!resolvedMode.supportsUI || resolvedMode.effectiveMode === null) {\n this.logger.verbose('applyUI: Skipping UI (client does not support it)', {\n tool: tool.metadata.name,\n platform: platformType,\n configuredMode,\n reason: resolvedMode.reason,\n });\n return;\n }\n\n const servingMode = resolvedMode.effectiveMode;\n const useStructuredContent = resolvedMode.useStructuredContent;\n let htmlContent: string | undefined;\n let uiMeta: Record<string, unknown> = {};\n\n if (servingMode === 'static') {\n // For static mode: no additional rendering needed\n // Widget was already registered at server startup\n this.logger.verbose('applyUI: UI using static mode (structured data only)', {\n tool: tool.metadata.name,\n platform: platformType,\n });\n } else if (servingMode === 'hybrid') {\n // For hybrid mode: build the component payload\n const componentPayload = scope.toolUI.buildHybridComponentPayload({\n toolName: tool.metadata.name,\n template: tool.metadata.ui.template,\n uiConfig: tool.metadata.ui,\n });\n\n if (componentPayload) {\n uiMeta = {\n 'ui/component': componentPayload,\n 'ui/type': componentPayload.type,\n };\n }\n\n this.logger.verbose('applyUI: UI using hybrid mode (structured data + component)', {\n tool: tool.metadata.name,\n platform: platformType,\n hasComponent: !!componentPayload,\n componentType: componentPayload?.type,\n componentHash: componentPayload?.hash,\n });\n } else {\n // For inline mode (default): render HTML with data embedded\n const uiRenderResult = await scope.toolUI.renderAndRegisterAsync({\n toolName: tool.metadata.name,\n requestId,\n input:\n input?.arguments && typeof input.arguments === 'object' && !Array.isArray(input.arguments)\n ? (input.arguments as Record<string, unknown>)\n : {},\n output: rawOutput,\n structuredContent: undefined,\n uiConfig: tool.metadata.ui,\n platformType,\n });\n\n // Handle graceful degradation: rendering failed in production\n if (isUIRenderFailure(uiRenderResult)) {\n this.logger.warn('applyUI: UI rendering failed (graceful degradation)', {\n tool: tool.metadata.name,\n reason: uiRenderResult.reason,\n platform: platformType,\n });\n // Proceed without UI - tool result will not have ui/html metadata\n htmlContent = undefined;\n uiMeta = {};\n } else {\n // Extract HTML from platform-specific meta key\n const htmlKey =\n platformType === 'openai' ? 'openai/html' : platformType === 'ext-apps' ? 'ui/html' : 'frontmcp/html';\n htmlContent = uiRenderResult?.meta?.[htmlKey] as string | undefined;\n // Fallback to ui/html for compatibility\n if (!htmlContent) {\n htmlContent = uiRenderResult?.meta?.['ui/html'] as string | undefined;\n }\n uiMeta = uiRenderResult.meta || {};\n }\n }\n\n // Build the response content using the extracted utility\n const uiResult = buildToolResponseContent({\n rawOutput,\n htmlContent,\n servingMode,\n useStructuredContent,\n platformType,\n });\n\n // Store UI result and metadata in state for finalize stage\n this.state.set('uiResult', uiResult);\n this.state.set('uiMeta', uiMeta);\n\n this.logger.verbose('applyUI: UI processed', {\n tool: tool.metadata.name,\n platform: platformType,\n servingMode,\n useStructuredContent,\n format: uiResult.format,\n contentCleared: uiResult.contentCleared,\n });\n } catch (error) {\n // UI rendering failure should not fail the tool call\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n const uiConfig = tool.metadata.ui;\n\n this.logger.error('applyUI: UI rendering failed', {\n tool: tool.metadata.name,\n error: errorMessage,\n stack: errorStack,\n templateType: uiConfig?.template\n ? typeof uiConfig.template === 'function'\n ? 'react-component'\n : typeof uiConfig.template === 'string'\n ? uiConfig.template.endsWith('.tsx') || uiConfig.template.endsWith('.jsx')\n ? 'react-file'\n : 'html-file'\n : 'unknown'\n : 'none',\n });\n\n // In debug mode, also log to console for immediate visibility\n if (process.env['DEBUG'] || process.env['NODE_ENV'] === 'development') {\n console.error('[FrontMCP] UI Rendering Error:', {\n tool: tool.metadata.name,\n error: errorMessage,\n stack: errorStack,\n });\n }\n }\n\n this.logger.verbose('applyUI:done');\n }\n\n /**\n * Finalize the tool response.\n * Validates output, applies UI result from applyUI stage, and sends the response.\n *\n * Note: This stage runs even when execute fails (as part of cleanup).\n * If rawOutput is undefined, it means an error occurred during execution\n * and the error will be propagated by the flow framework - we should not\n * throw a new error here.\n */\n @Stage('finalize')\n async finalize() {\n this.logger.verbose('finalize:start');\n const { tool, rawOutput, uiResult, uiMeta } = this.state;\n\n if (!tool) {\n // No tool found - this is an early failure, just skip finalization\n this.logger.verbose('finalize: skipping (no tool in state)');\n return;\n }\n\n if (rawOutput === undefined) {\n // No output means execute stage failed - skip finalization\n // The original error will be propagated by the flow framework\n this.logger.verbose('finalize: skipping (no output - execute stage likely failed)');\n return;\n }\n\n // Parse and construct the MCP-compliant output using safeParseOutput\n const parseResult = tool.safeParseOutput(rawOutput);\n\n if (!parseResult.success) {\n this.logger.error('finalize: output validation failed', {\n tool: tool.metadata.name,\n errors: parseResult.error,\n });\n throw new InvalidOutputError();\n }\n\n const result = parseResult.data;\n\n // Apply UI result if available (from applyUI stage)\n if (uiResult) {\n result.content = uiResult.content;\n // Set structuredContent from UI result (contains raw tool output)\n // Cast to Record<string, unknown> since MCP protocol expects object type\n if (uiResult.structuredContent !== undefined && uiResult.structuredContent !== null) {\n result.structuredContent = uiResult.structuredContent as Record<string, unknown>;\n }\n if (uiMeta) {\n result._meta = { ...result._meta, ...uiMeta };\n }\n }\n\n // Log the final result being sent\n this.logger.info('finalize: sending response', {\n tool: tool.metadata.name,\n hasContent: Array.isArray(result.content) && result.content.length > 0,\n contentLength: Array.isArray(result.content) ? result.content.length : 0,\n hasStructuredContent: result.structuredContent !== undefined,\n hasMeta: result._meta !== undefined,\n metaKeys: result._meta ? Object.keys(result._meta) : [],\n isError: result.isError,\n });\n\n // Debug: Write full response to file if DEBUG_TOOL_RESPONSE is set\n if (process.env['DEBUG_TOOL_RESPONSE']) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const fs = require('fs').promises;\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const os = require('os');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const path = require('path');\n const debugOutput = {\n timestamp: new Date().toISOString(),\n tool: tool.metadata.name,\n rawOutput,\n uiResult,\n uiMeta,\n finalResult: result,\n };\n // Use os.tmpdir() for cross-platform compatibility (works on Windows, macOS, Linux)\n const tempDir = os.tmpdir();\n const defaultPath = path.join(tempDir, 'tool-response-debug.json');\n let outputPath = process.env['DEBUG_TOOL_RESPONSE_PATH'] || defaultPath;\n\n // Path traversal protection: ensure custom path is within allowed directories\n if (process.env['DEBUG_TOOL_RESPONSE_PATH']) {\n const resolvedPath = path.resolve(outputPath);\n const resolvedTempDir = path.resolve(tempDir);\n const cwd = path.resolve(process.cwd());\n\n // Only allow paths within temp directory or current working directory\n const isInTempDir = resolvedPath.startsWith(resolvedTempDir + path.sep) || resolvedPath === resolvedTempDir;\n const isInCwd = resolvedPath.startsWith(cwd + path.sep) || resolvedPath === cwd;\n\n if (!isInTempDir && !isInCwd) {\n console.error(\n `[DEBUG] DEBUG_TOOL_RESPONSE_PATH must be within temp directory (${tempDir}) or current working directory (${cwd}). ` +\n `Falling back to default path.`,\n );\n outputPath = defaultPath;\n }\n }\n\n // Use async write to avoid blocking the event loop (fire-and-forget)\n fs.writeFile(outputPath, JSON.stringify(debugOutput, null, 2))\n .then(() => console.log(`[DEBUG] Tool response written to: ${outputPath}`))\n .catch((err: Error) => console.error(`[DEBUG] Failed to write tool response: ${err.message}`));\n }\n\n // Respond with the properly formatted MCP result\n this.respond(result);\n this.logger.verbose('finalize:done');\n }\n}\n"]}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { FlowBase, FlowRunOptions, ToolEntry } from '../../common';
|
|
2
2
|
import 'reflect-metadata';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
+
import type { AIPlatformType } from '@frontmcp/ui/adapters';
|
|
5
|
+
import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
|
|
4
6
|
declare const inputSchema: z.ZodObject<{
|
|
5
7
|
request: z.ZodObject<{
|
|
6
8
|
params: z.ZodOptional<z.ZodObject<{
|
|
9
|
+
task: z.ZodOptional<z.ZodObject<{
|
|
10
|
+
ttl: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodNull]>>;
|
|
11
|
+
pollInterval: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
}, z.core.$loose>>;
|
|
7
13
|
_meta: z.ZodOptional<z.ZodObject<{
|
|
8
14
|
progressToken: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
15
|
+
"io.modelcontextprotocol/related-task": z.ZodOptional<z.ZodObject<{
|
|
16
|
+
taskId: z.ZodString;
|
|
17
|
+
}, z.core.$loose>>;
|
|
9
18
|
}, z.core.$loose>>;
|
|
10
19
|
cursor: z.ZodOptional<z.ZodString>;
|
|
11
20
|
}, z.core.$loose>>;
|
|
@@ -14,7 +23,11 @@ declare const inputSchema: z.ZodObject<{
|
|
|
14
23
|
ctx: z.ZodUnknown;
|
|
15
24
|
}, z.core.$strip>;
|
|
16
25
|
declare const outputSchema: z.ZodObject<{
|
|
17
|
-
_meta: z.ZodOptional<z.
|
|
26
|
+
_meta: z.ZodOptional<z.ZodObject<{
|
|
27
|
+
"io.modelcontextprotocol/related-task": z.ZodOptional<z.ZodObject<{
|
|
28
|
+
taskId: z.ZodString;
|
|
29
|
+
}, z.core.$loose>>;
|
|
30
|
+
}, z.core.$loose>>;
|
|
18
31
|
nextCursor: z.ZodOptional<z.ZodString>;
|
|
19
32
|
tools: z.ZodArray<z.ZodObject<{
|
|
20
33
|
description: z.ZodOptional<z.ZodString>;
|
|
@@ -35,6 +48,13 @@ declare const outputSchema: z.ZodObject<{
|
|
|
35
48
|
idempotentHint: z.ZodOptional<z.ZodBoolean>;
|
|
36
49
|
openWorldHint: z.ZodOptional<z.ZodBoolean>;
|
|
37
50
|
}, z.core.$strip>>;
|
|
51
|
+
execution: z.ZodOptional<z.ZodObject<{
|
|
52
|
+
taskSupport: z.ZodOptional<z.ZodEnum<{
|
|
53
|
+
optional: "optional";
|
|
54
|
+
required: "required";
|
|
55
|
+
forbidden: "forbidden";
|
|
56
|
+
}>>;
|
|
57
|
+
}, z.core.$strip>>;
|
|
38
58
|
_meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
39
59
|
icons: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
40
60
|
src: z.ZodString;
|
|
@@ -47,21 +67,15 @@ declare const outputSchema: z.ZodObject<{
|
|
|
47
67
|
}, z.core.$loose>;
|
|
48
68
|
declare const stateSchema: z.ZodObject<{
|
|
49
69
|
cursor: z.ZodOptional<z.ZodString>;
|
|
70
|
+
authInfo: z.ZodType<AuthInfo>;
|
|
71
|
+
platformType: z.ZodType<AIPlatformType | undefined>;
|
|
50
72
|
tools: z.ZodArray<z.ZodObject<{
|
|
51
73
|
appName: z.ZodString;
|
|
52
|
-
tool: z.ZodCustom<ToolEntry<
|
|
53
|
-
[k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
|
|
54
|
-
}>, import("../../common").ToolOutputType, unknown, unknown>, ToolEntry<Readonly<{
|
|
55
|
-
[k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
|
|
56
|
-
}>, import("../../common").ToolOutputType, unknown, unknown>>;
|
|
74
|
+
tool: z.ZodCustom<ToolEntry<import("../../common").ToolInputType, import("../../common").ToolOutputType, unknown, unknown>, ToolEntry<import("../../common").ToolInputType, import("../../common").ToolOutputType, unknown, unknown>>;
|
|
57
75
|
}, z.core.$strip>>;
|
|
58
76
|
resolvedTools: z.ZodArray<z.ZodObject<{
|
|
59
77
|
appName: z.ZodString;
|
|
60
|
-
tool: z.ZodCustom<ToolEntry<
|
|
61
|
-
[k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
|
|
62
|
-
}>, import("../../common").ToolOutputType, unknown, unknown>, ToolEntry<Readonly<{
|
|
63
|
-
[k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
|
|
64
|
-
}>, import("../../common").ToolOutputType, unknown, unknown>>;
|
|
78
|
+
tool: z.ZodCustom<ToolEntry<import("../../common").ToolInputType, import("../../common").ToolOutputType, unknown, unknown>, ToolEntry<import("../../common").ToolInputType, import("../../common").ToolOutputType, unknown, unknown>>;
|
|
65
79
|
finalName: z.ZodString;
|
|
66
80
|
}, z.core.$strip>>;
|
|
67
81
|
}, z.core.$strip>;
|
|
@@ -18,6 +18,9 @@ const inputSchema = zod_1.z.object({
|
|
|
18
18
|
const outputSchema = types_js_1.ListToolsResultSchema;
|
|
19
19
|
const stateSchema = zod_1.z.object({
|
|
20
20
|
cursor: zod_1.z.string().optional(),
|
|
21
|
+
// z.any() used because AuthInfo is an external type from @modelcontextprotocol/sdk that varies by SDK version
|
|
22
|
+
authInfo: zod_1.z.any().optional(),
|
|
23
|
+
platformType: zod_1.z.string().optional(),
|
|
21
24
|
tools: zod_1.z.array(zod_1.z.object({
|
|
22
25
|
appName: zod_1.z.string(),
|
|
23
26
|
tool: zod_1.z.instanceof(common_1.ToolEntry),
|
|
@@ -46,10 +49,12 @@ let ToolsListFlow = class ToolsListFlow extends common_1.FlowBase {
|
|
|
46
49
|
this.logger.verbose('parseInput:start');
|
|
47
50
|
let method;
|
|
48
51
|
let params;
|
|
52
|
+
let ctx;
|
|
49
53
|
try {
|
|
50
54
|
const inputData = inputSchema.parse(this.rawInput);
|
|
51
55
|
method = inputData.request.method;
|
|
52
56
|
params = inputData.request.params;
|
|
57
|
+
ctx = inputData.ctx;
|
|
53
58
|
}
|
|
54
59
|
catch (e) {
|
|
55
60
|
throw new errors_1.InvalidInputError('Invalid request format', e instanceof zod_1.z.ZodError ? e.issues : undefined);
|
|
@@ -58,10 +63,22 @@ let ToolsListFlow = class ToolsListFlow extends common_1.FlowBase {
|
|
|
58
63
|
this.logger.warn(`parseInput: invalid method "${method}"`);
|
|
59
64
|
throw new errors_1.InvalidMethodError(method, 'tools/list');
|
|
60
65
|
}
|
|
66
|
+
// Extract authInfo and detect platform type
|
|
67
|
+
const authInfo = ctx?.authInfo;
|
|
68
|
+
const sessionId = authInfo?.sessionId;
|
|
69
|
+
// Cast scope to access notifications service for platform detection
|
|
70
|
+
const scope = this.scope;
|
|
71
|
+
// Get platform type: first check sessionIdPayload (detected from user-agent),
|
|
72
|
+
// then fall back to notification service (detected from MCP clientInfo),
|
|
73
|
+
// finally default to 'unknown'
|
|
74
|
+
const platformType = authInfo?.sessionIdPayload?.platformType ??
|
|
75
|
+
(sessionId ? scope.notifications?.getPlatformType(sessionId) : undefined) ??
|
|
76
|
+
'unknown';
|
|
77
|
+
this.logger.verbose(`parseInput: detected platform=${platformType}`);
|
|
61
78
|
const cursor = params?.cursor;
|
|
62
79
|
if (cursor)
|
|
63
80
|
this.logger.verbose(`parseInput: cursor=${cursor}`);
|
|
64
|
-
this.state.set(
|
|
81
|
+
this.state.set({ cursor, authInfo, platformType });
|
|
65
82
|
this.logger.verbose('parseInput:done');
|
|
66
83
|
}
|
|
67
84
|
async findTools() {
|
|
@@ -122,6 +139,10 @@ let ToolsListFlow = class ToolsListFlow extends common_1.FlowBase {
|
|
|
122
139
|
this.logger.verbose('parseTools:start');
|
|
123
140
|
try {
|
|
124
141
|
const resolved = this.state.required.resolvedTools;
|
|
142
|
+
const platformType = this.state.platformType ?? 'unknown';
|
|
143
|
+
// Only OpenAI ChatGPT uses openai/* meta keys
|
|
144
|
+
// ext-apps (SEP-1865) uses ui/* keys per the MCP Apps specification
|
|
145
|
+
const isOpenAIPlatform = platformType === 'openai';
|
|
125
146
|
const tools = resolved.map(({ finalName, tool }) => {
|
|
126
147
|
// Get the input schema - prefer rawInputSchema (JSON Schema), then convert from tool.inputSchema
|
|
127
148
|
let inputSchema;
|
|
@@ -153,10 +174,8 @@ let ToolsListFlow = class ToolsListFlow extends common_1.FlowBase {
|
|
|
153
174
|
annotations: tool.metadata.annotations,
|
|
154
175
|
inputSchema,
|
|
155
176
|
};
|
|
156
|
-
// Add
|
|
157
|
-
//
|
|
158
|
-
// NOTE: Use static URI (like pizzaz example: ui://widget/tool-name.html), NOT template with {requestId}
|
|
159
|
-
// OpenAI tries to fetch the outputTemplate URI directly at discovery time
|
|
177
|
+
// Add _meta for tools with UI configuration
|
|
178
|
+
// OpenAI platforms use openai/* keys, other platforms use frontmcp/* keys
|
|
160
179
|
if ((0, ui_1.hasUIConfig)(tool.metadata)) {
|
|
161
180
|
const uiConfig = tool.metadata.ui;
|
|
162
181
|
if (!uiConfig) {
|
|
@@ -192,34 +211,66 @@ let ToolsListFlow = class ToolsListFlow extends common_1.FlowBase {
|
|
|
192
211
|
}
|
|
193
212
|
// Use centralized type guard from @frontmcp/ui/types
|
|
194
213
|
const uiType = manifest?.uiType ?? ((0, types_1.isUIType)(detectedType) ? detectedType : 'auto');
|
|
195
|
-
//
|
|
196
|
-
// -
|
|
197
|
-
// -
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
meta['
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
// Note: ui/manifestUri is only set when a manifest exists in the registry
|
|
214
|
+
// Build meta keys based on platform type:
|
|
215
|
+
// - OpenAI: openai/* keys only (ChatGPT proprietary format)
|
|
216
|
+
// - ext-apps: ui/* keys only per SEP-1865 MCP Apps specification
|
|
217
|
+
// - Other platforms: frontmcp/* keys + ui/* for compatibility
|
|
218
|
+
const meta = {};
|
|
219
|
+
const isExtApps = platformType === 'ext-apps';
|
|
220
|
+
const widgetUri = `ui://widget/${encodeURIComponent(finalName)}.html`;
|
|
221
|
+
if (isOpenAIPlatform) {
|
|
222
|
+
// OpenAI-specific meta keys for ChatGPT widget discovery
|
|
223
|
+
// ChatGPT only understands openai/* keys - don't mix with ui/* keys
|
|
224
|
+
meta['openai/outputTemplate'] = widgetUri;
|
|
225
|
+
meta['openai/resultCanProduceWidget'] = true;
|
|
226
|
+
meta['openai/widgetAccessible'] = uiConfig.widgetAccessible ?? false;
|
|
227
|
+
// Add invocation status if configured
|
|
228
|
+
if (uiConfig.invocationStatus?.invoking) {
|
|
229
|
+
meta['openai/toolInvocation/invoking'] = uiConfig.invocationStatus.invoking;
|
|
230
|
+
}
|
|
231
|
+
if (uiConfig.invocationStatus?.invoked) {
|
|
232
|
+
meta['openai/toolInvocation/invoked'] = uiConfig.invocationStatus.invoked;
|
|
233
|
+
}
|
|
216
234
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
meta['
|
|
235
|
+
else if (isExtApps) {
|
|
236
|
+
// SEP-1865 MCP Apps specification uses ui/* keys only
|
|
237
|
+
meta['ui/resourceUri'] = widgetUri;
|
|
238
|
+
meta['ui/mimeType'] = 'text/html+mcp';
|
|
239
|
+
// Add manifest info for ext-apps (uses ui/* namespace)
|
|
240
|
+
meta['ui/cdn'] = (0, build_1.buildCDNInfoForUIType)(uiType);
|
|
241
|
+
if (manifest) {
|
|
242
|
+
meta['ui/type'] = manifest.uiType;
|
|
243
|
+
meta['ui/manifestUri'] = `ui://widget/${encodeURIComponent(finalName)}/manifest.json`;
|
|
244
|
+
meta['ui/displayMode'] = manifest.displayMode;
|
|
245
|
+
meta['ui/bundlingMode'] = manifest.bundlingMode;
|
|
246
|
+
}
|
|
247
|
+
else if (uiConfig.template) {
|
|
248
|
+
meta['ui/type'] = uiType;
|
|
249
|
+
}
|
|
220
250
|
}
|
|
221
|
-
|
|
222
|
-
meta
|
|
251
|
+
else {
|
|
252
|
+
// FrontMCP meta keys for other platforms (Claude, Cursor, etc.)
|
|
253
|
+
meta['frontmcp/outputTemplate'] = widgetUri;
|
|
254
|
+
meta['frontmcp/resultCanProduceWidget'] = true;
|
|
255
|
+
meta['frontmcp/widgetAccessible'] = uiConfig.widgetAccessible ?? false;
|
|
256
|
+
// Add invocation status if configured
|
|
257
|
+
if (uiConfig.invocationStatus?.invoking) {
|
|
258
|
+
meta['frontmcp/toolInvocation/invoking'] = uiConfig.invocationStatus.invoking;
|
|
259
|
+
}
|
|
260
|
+
if (uiConfig.invocationStatus?.invoked) {
|
|
261
|
+
meta['frontmcp/toolInvocation/invoked'] = uiConfig.invocationStatus.invoked;
|
|
262
|
+
}
|
|
263
|
+
// Add ui/* keys for compatibility with generic MCP clients
|
|
264
|
+
meta['ui/cdn'] = (0, build_1.buildCDNInfoForUIType)(uiType);
|
|
265
|
+
if (manifest) {
|
|
266
|
+
meta['ui/type'] = manifest.uiType;
|
|
267
|
+
meta['ui/manifestUri'] = `ui://widget/${encodeURIComponent(finalName)}/manifest.json`;
|
|
268
|
+
meta['ui/displayMode'] = manifest.displayMode;
|
|
269
|
+
meta['ui/bundlingMode'] = manifest.bundlingMode;
|
|
270
|
+
}
|
|
271
|
+
else if (uiConfig.template) {
|
|
272
|
+
meta['ui/type'] = uiType;
|
|
273
|
+
}
|
|
223
274
|
}
|
|
224
275
|
item._meta = meta;
|
|
225
276
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools-list.flow.js","sourceRoot":"","sources":["../../../../src/tool/flows/tools-list.flow.ts"],"names":[],"mappings":"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","sourcesContent":["// tools/flows/list-tools.flow.ts\nimport { Flow, FlowBase, FlowControl, FlowHooksOf, FlowPlan, FlowRunOptions, ToolEntry } from '../../common';\nimport 'reflect-metadata';\nimport { z } from 'zod';\nimport { toJSONSchema } from 'zod/v4';\nimport { ListToolsRequestSchema, ListToolsResultSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { InvalidMethodError, InvalidInputError } from '../../errors';\nimport { hasUIConfig } from '../ui';\nimport { buildCDNInfoForUIType, type UIType } from '@frontmcp/ui/build';\nimport { isUIType } from '@frontmcp/ui/types';\nimport type { Scope } from '../../scope/scope.instance';\n\nconst inputSchema = z.object({\n request: ListToolsRequestSchema,\n ctx: z.unknown(),\n});\n\nconst outputSchema = ListToolsResultSchema;\n\nconst stateSchema = z.object({\n cursor: z.string().optional(),\n tools: z.array(\n z.object({\n appName: z.string(),\n tool: z.instanceof(ToolEntry),\n }),\n ),\n resolvedTools: z.array(\n z.object({\n appName: z.string(),\n tool: z.instanceof(ToolEntry),\n finalName: z.string(),\n }),\n ),\n});\n\ntype ResponseToolItem = z.infer<typeof outputSchema>['tools'][number];\n\n// TODO: add support for pagination\n// TODO: add support for session based tools\nconst plan = {\n pre: ['parseInput'],\n execute: ['findTools', 'resolveConflicts'],\n post: ['parseTools'],\n} as const satisfies FlowPlan<string>;\n\ndeclare global {\n interface ExtendFlows {\n 'tools:list-tools': FlowRunOptions<\n ToolsListFlow,\n typeof plan,\n typeof inputSchema,\n typeof outputSchema,\n typeof stateSchema\n >;\n }\n}\n\nconst name = 'tools:list-tools' as const;\nconst { Stage } = FlowHooksOf('tools:list-tools');\n\n@Flow({\n name,\n plan,\n inputSchema,\n outputSchema,\n access: 'authorized',\n})\nexport default class ToolsListFlow extends FlowBase<typeof name> {\n logger = this.scopeLogger.child('ToolsListFlow');\n\n private sample<T>(arr: T[], n = 5): T[] {\n return arr.slice(0, n);\n }\n\n @Stage('parseInput')\n async parseInput() {\n this.logger.verbose('parseInput:start');\n\n let method!: string;\n let params: any;\n try {\n const inputData = inputSchema.parse(this.rawInput);\n method = inputData.request.method;\n params = inputData.request.params;\n } catch (e) {\n throw new InvalidInputError('Invalid request format', e instanceof z.ZodError ? e.issues : undefined);\n }\n\n if (method !== 'tools/list') {\n this.logger.warn(`parseInput: invalid method \"${method}\"`);\n throw new InvalidMethodError(method, 'tools/list');\n }\n\n const cursor = params?.cursor;\n if (cursor) this.logger.verbose(`parseInput: cursor=${cursor}`);\n this.state.set('cursor', cursor);\n this.logger.verbose('parseInput:done');\n }\n\n @Stage('findTools')\n async findTools() {\n this.logger.info('findTools:start');\n\n try {\n const apps = this.scope.apps.getApps();\n this.logger.info(`findTools: discovered ${apps.length} app(s)`);\n\n const tools: Array<{ appName: string; tool: ToolEntry }> = [];\n\n const scopeTools = this.scope.tools.getTools();\n this.logger.verbose(`findTools: scope tools=${scopeTools.length}`);\n\n for (const tool of scopeTools) {\n tools.push({ appName: tool.owner.id, tool });\n }\n\n this.logger.info(`findTools: total tools collected=${tools.length}`);\n if (tools.length === 0) {\n this.logger.warn('findTools: no tools found across apps');\n }\n\n this.state.set('tools', tools);\n this.logger.verbose('findTools:done');\n } catch (error) {\n this.logger.error('findTools: failed to collect tools', error);\n throw error;\n }\n }\n\n @Stage('resolveConflicts')\n async resolveConflicts() {\n this.logger.verbose('resolveConflicts:start');\n\n try {\n const found = this.state.required.tools;\n\n const counts = new Map<string, number>();\n for (const { tool } of found) {\n const baseName = tool.metadata.id ?? tool.metadata.name;\n counts.set(baseName, (counts.get(baseName) ?? 0) + 1);\n }\n\n const conflicts = new Set<string>([...counts.entries()].filter(([, n]) => n > 1).map(([k]) => k));\n\n if (conflicts.size > 0) {\n const preview = this.sample(Array.from(conflicts)).join(', ');\n const extra = conflicts.size > 5 ? `, +${conflicts.size - 5} more` : '';\n this.logger.warn(`resolveConflicts: ${conflicts.size} name conflict(s) detected: ${preview}${extra}`);\n } else {\n this.logger.info('resolveConflicts: no name conflicts detected');\n }\n\n const resolved = found.map(({ appName, tool }) => {\n const baseName = tool.metadata.id ?? tool.metadata.name;\n const finalName = conflicts.has(baseName) ? `${appName}:${baseName}` : baseName;\n return { appName, tool, finalName };\n });\n\n this.state.set('resolvedTools', resolved);\n this.logger.verbose('resolveConflicts:done');\n } catch (error) {\n this.logger.error('resolveConflicts: failed to resolve conflicts', error);\n throw error;\n }\n }\n\n @Stage('parseTools')\n async parseTools() {\n this.logger.verbose('parseTools:start');\n\n try {\n const resolved = this.state.required.resolvedTools;\n\n const tools: ResponseToolItem[] = resolved.map(({ finalName, tool }) => {\n // Get the input schema - prefer rawInputSchema (JSON Schema), then convert from tool.inputSchema\n let inputSchema: any;\n if (tool.rawInputSchema) {\n // Already converted to JSON Schema\n inputSchema = tool.rawInputSchema;\n } else if (tool.inputSchema && Object.keys(tool.inputSchema).length > 0) {\n // tool.inputSchema is a ZodRawShape (extracted .shape from ZodObject in ToolInstance constructor)\n // Convert to JSON Schema\n try {\n // as any used here to prevent hard ts-check on tool input that is redundant\n // and just slow down the build process. types here are unnecessary.\n inputSchema = toJSONSchema(z.object(tool.inputSchema));\n } catch (e) {\n this.logger.warn(`Failed to convert inputSchema for tool ${finalName}:`, e);\n inputSchema = { type: 'object', properties: {} };\n }\n } else {\n // No schema defined - use empty object schema\n inputSchema = { type: 'object', properties: {} };\n }\n\n const item: ResponseToolItem = {\n name: finalName,\n title: tool.metadata.name,\n description: tool.metadata.description,\n annotations: tool.metadata.annotations,\n inputSchema,\n };\n\n // Add OpenAI _meta for tools with UI configuration\n // This is CRITICAL for ChatGPT to discover widget-producing tools at listing time\n // NOTE: Use static URI (like pizzaz example: ui://widget/tool-name.html), NOT template with {requestId}\n // OpenAI tries to fetch the outputTemplate URI directly at discovery time\n if (hasUIConfig(tool.metadata)) {\n const uiConfig = tool.metadata.ui;\n if (!uiConfig) {\n // This should never happen if hasUIConfig returned true\n return item;\n }\n\n // Get manifest info from registry (if available)\n // Type guard: verify scope has toolUI with required methods before accessing\n const isValidScope = (obj: unknown): obj is Scope => {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n 'toolUI' in obj &&\n typeof (obj as { toolUI?: unknown }).toolUI === 'object' &&\n (obj as { toolUI?: unknown }).toolUI !== null &&\n typeof (obj as { toolUI: { getManifest?: unknown } }).toolUI.getManifest === 'function' &&\n typeof (obj as { toolUI: { detectUIType?: unknown } }).toolUI.detectUIType === 'function'\n );\n };\n\n if (!isValidScope(this.scope)) {\n this.logger.warn(`parseTools: toolUI not available in scope for ${finalName}`);\n return item;\n }\n const scope = this.scope;\n\n // Get manifest and detect UI type with error handling\n let manifest;\n let detectedType: string;\n try {\n manifest = scope.toolUI.getManifest(finalName);\n detectedType = scope.toolUI.detectUIType(uiConfig.template);\n } catch (error) {\n this.logger.warn(`parseTools: failed to access toolUI for ${finalName}`, error);\n return item;\n }\n\n // Use centralized type guard from @frontmcp/ui/types\n const uiType: UIType = manifest?.uiType ?? (isUIType(detectedType) ? detectedType : 'auto');\n\n // Always include outputTemplate for all UI tools\n // - static mode: Full widget with React runtime and bridge\n // - inline mode: Lean shell (just HTML + theme), actual widget comes in tool response\n const meta: Record<string, unknown> = {\n 'openai/outputTemplate': `ui://widget/${encodeURIComponent(finalName)}.html`,\n 'openai/resultCanProduceWidget': true,\n 'openai/widgetAccessible': uiConfig.widgetAccessible ?? false,\n // CDN info for client-side resource loading\n 'ui/cdn': buildCDNInfoForUIType(uiType),\n };\n\n // Add manifest information for client-side renderer selection\n if (manifest) {\n meta['ui/type'] = manifest.uiType;\n meta['ui/manifestUri'] = `ui://widget/${encodeURIComponent(finalName)}/manifest.json`;\n meta['ui/displayMode'] = manifest.displayMode;\n meta['ui/bundlingMode'] = manifest.bundlingMode;\n } else if (uiConfig.template) {\n // Fallback to detecting UI type from template\n meta['ui/type'] = uiType;\n // Note: ui/manifestUri is only set when a manifest exists in the registry\n }\n\n // Add invocation status if configured\n if (uiConfig.invocationStatus?.invoking) {\n meta['openai/toolInvocation/invoking'] = uiConfig.invocationStatus.invoking;\n }\n if (uiConfig.invocationStatus?.invoked) {\n meta['openai/toolInvocation/invoked'] = uiConfig.invocationStatus.invoked;\n }\n\n item._meta = meta;\n }\n\n return item;\n });\n\n const preview = this.sample(tools.map((t) => t.name)).join(', ');\n const extra = tools.length > 5 ? `, +${tools.length - 5} more` : '';\n this.logger.info(`parseTools: prepared ${tools.length} tool descriptor(s): ${preview}${extra}`);\n\n this.respond({ tools });\n this.logger.info('parseTools: response sent');\n this.logger.verbose('parseTools:done');\n } catch (error) {\n if (error instanceof FlowControl) throw error;\n this.logger.error('parseTools: failed to parse tools', error);\n throw error;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tools-list.flow.js","sourceRoot":"","sources":["../../../../src/tool/flows/tools-list.flow.ts"],"names":[],"mappings":"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","sourcesContent":["// tools/flows/list-tools.flow.ts\nimport { Flow, FlowBase, FlowControl, FlowHooksOf, FlowPlan, FlowRunOptions, ToolEntry } from '../../common';\nimport 'reflect-metadata';\nimport { z } from 'zod';\nimport { toJSONSchema } from 'zod/v4';\nimport { ListToolsRequestSchema, ListToolsResultSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { InvalidMethodError, InvalidInputError } from '../../errors';\nimport { hasUIConfig } from '../ui';\nimport { buildCDNInfoForUIType, type UIType } from '@frontmcp/ui/build';\nimport { isUIType } from '@frontmcp/ui/types';\nimport type { AIPlatformType } from '@frontmcp/ui/adapters';\nimport type { Scope } from '../../scope/scope.instance';\nimport type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\n\nconst inputSchema = z.object({\n request: ListToolsRequestSchema,\n ctx: z.unknown(),\n});\n\nconst outputSchema = ListToolsResultSchema;\n\nconst stateSchema = z.object({\n cursor: z.string().optional(),\n // z.any() used because AuthInfo is an external type from @modelcontextprotocol/sdk that varies by SDK version\n authInfo: z.any().optional() as z.ZodType<AuthInfo>,\n platformType: z.string().optional() as z.ZodType<AIPlatformType | undefined>,\n tools: z.array(\n z.object({\n appName: z.string(),\n tool: z.instanceof(ToolEntry),\n }),\n ),\n resolvedTools: z.array(\n z.object({\n appName: z.string(),\n tool: z.instanceof(ToolEntry),\n finalName: z.string(),\n }),\n ),\n});\n\ntype ResponseToolItem = z.infer<typeof outputSchema>['tools'][number];\n\n// TODO: add support for pagination\n// TODO: add support for session based tools\nconst plan = {\n pre: ['parseInput'],\n execute: ['findTools', 'resolveConflicts'],\n post: ['parseTools'],\n} as const satisfies FlowPlan<string>;\n\ndeclare global {\n interface ExtendFlows {\n 'tools:list-tools': FlowRunOptions<\n ToolsListFlow,\n typeof plan,\n typeof inputSchema,\n typeof outputSchema,\n typeof stateSchema\n >;\n }\n}\n\nconst name = 'tools:list-tools' as const;\nconst { Stage } = FlowHooksOf('tools:list-tools');\n\n@Flow({\n name,\n plan,\n inputSchema,\n outputSchema,\n access: 'authorized',\n})\nexport default class ToolsListFlow extends FlowBase<typeof name> {\n logger = this.scopeLogger.child('ToolsListFlow');\n\n private sample<T>(arr: T[], n = 5): T[] {\n return arr.slice(0, n);\n }\n\n @Stage('parseInput')\n async parseInput() {\n this.logger.verbose('parseInput:start');\n\n let method!: string;\n let params: any;\n let ctx: { authInfo?: AuthInfo } | undefined;\n try {\n const inputData = inputSchema.parse(this.rawInput);\n method = inputData.request.method;\n params = inputData.request.params;\n ctx = inputData.ctx as { authInfo?: AuthInfo } | undefined;\n } catch (e) {\n throw new InvalidInputError('Invalid request format', e instanceof z.ZodError ? e.issues : undefined);\n }\n\n if (method !== 'tools/list') {\n this.logger.warn(`parseInput: invalid method \"${method}\"`);\n throw new InvalidMethodError(method, 'tools/list');\n }\n\n // Extract authInfo and detect platform type\n const authInfo = ctx?.authInfo;\n const sessionId = authInfo?.sessionId;\n\n // Cast scope to access notifications service for platform detection\n const scope = this.scope as Scope;\n\n // Get platform type: first check sessionIdPayload (detected from user-agent),\n // then fall back to notification service (detected from MCP clientInfo),\n // finally default to 'unknown'\n const platformType: AIPlatformType =\n authInfo?.sessionIdPayload?.platformType ??\n (sessionId ? scope.notifications?.getPlatformType(sessionId) : undefined) ??\n 'unknown';\n\n this.logger.verbose(`parseInput: detected platform=${platformType}`);\n\n const cursor = params?.cursor;\n if (cursor) this.logger.verbose(`parseInput: cursor=${cursor}`);\n this.state.set({ cursor, authInfo, platformType });\n this.logger.verbose('parseInput:done');\n }\n\n @Stage('findTools')\n async findTools() {\n this.logger.info('findTools:start');\n\n try {\n const apps = this.scope.apps.getApps();\n this.logger.info(`findTools: discovered ${apps.length} app(s)`);\n\n const tools: Array<{ appName: string; tool: ToolEntry }> = [];\n\n const scopeTools = this.scope.tools.getTools();\n this.logger.verbose(`findTools: scope tools=${scopeTools.length}`);\n\n for (const tool of scopeTools) {\n tools.push({ appName: tool.owner.id, tool });\n }\n\n this.logger.info(`findTools: total tools collected=${tools.length}`);\n if (tools.length === 0) {\n this.logger.warn('findTools: no tools found across apps');\n }\n\n this.state.set('tools', tools);\n this.logger.verbose('findTools:done');\n } catch (error) {\n this.logger.error('findTools: failed to collect tools', error);\n throw error;\n }\n }\n\n @Stage('resolveConflicts')\n async resolveConflicts() {\n this.logger.verbose('resolveConflicts:start');\n\n try {\n const found = this.state.required.tools;\n\n const counts = new Map<string, number>();\n for (const { tool } of found) {\n const baseName = tool.metadata.id ?? tool.metadata.name;\n counts.set(baseName, (counts.get(baseName) ?? 0) + 1);\n }\n\n const conflicts = new Set<string>([...counts.entries()].filter(([, n]) => n > 1).map(([k]) => k));\n\n if (conflicts.size > 0) {\n const preview = this.sample(Array.from(conflicts)).join(', ');\n const extra = conflicts.size > 5 ? `, +${conflicts.size - 5} more` : '';\n this.logger.warn(`resolveConflicts: ${conflicts.size} name conflict(s) detected: ${preview}${extra}`);\n } else {\n this.logger.info('resolveConflicts: no name conflicts detected');\n }\n\n const resolved = found.map(({ appName, tool }) => {\n const baseName = tool.metadata.id ?? tool.metadata.name;\n const finalName = conflicts.has(baseName) ? `${appName}:${baseName}` : baseName;\n return { appName, tool, finalName };\n });\n\n this.state.set('resolvedTools', resolved);\n this.logger.verbose('resolveConflicts:done');\n } catch (error) {\n this.logger.error('resolveConflicts: failed to resolve conflicts', error);\n throw error;\n }\n }\n\n @Stage('parseTools')\n async parseTools() {\n this.logger.verbose('parseTools:start');\n\n try {\n const resolved = this.state.required.resolvedTools;\n const platformType = this.state.platformType ?? 'unknown';\n\n // Only OpenAI ChatGPT uses openai/* meta keys\n // ext-apps (SEP-1865) uses ui/* keys per the MCP Apps specification\n const isOpenAIPlatform = platformType === 'openai';\n\n const tools: ResponseToolItem[] = resolved.map(({ finalName, tool }) => {\n // Get the input schema - prefer rawInputSchema (JSON Schema), then convert from tool.inputSchema\n let inputSchema: any;\n if (tool.rawInputSchema) {\n // Already converted to JSON Schema\n inputSchema = tool.rawInputSchema;\n } else if (tool.inputSchema && Object.keys(tool.inputSchema).length > 0) {\n // tool.inputSchema is a ZodRawShape (extracted .shape from ZodObject in ToolInstance constructor)\n // Convert to JSON Schema\n try {\n // as any used here to prevent hard ts-check on tool input that is redundant\n // and just slow down the build process. types here are unnecessary.\n inputSchema = toJSONSchema(z.object(tool.inputSchema));\n } catch (e) {\n this.logger.warn(`Failed to convert inputSchema for tool ${finalName}:`, e);\n inputSchema = { type: 'object', properties: {} };\n }\n } else {\n // No schema defined - use empty object schema\n inputSchema = { type: 'object', properties: {} };\n }\n\n const item: ResponseToolItem = {\n name: finalName,\n title: tool.metadata.name,\n description: tool.metadata.description,\n annotations: tool.metadata.annotations,\n inputSchema,\n };\n\n // Add _meta for tools with UI configuration\n // OpenAI platforms use openai/* keys, other platforms use frontmcp/* keys\n if (hasUIConfig(tool.metadata)) {\n const uiConfig = tool.metadata.ui;\n if (!uiConfig) {\n // This should never happen if hasUIConfig returned true\n return item;\n }\n\n // Get manifest info from registry (if available)\n // Type guard: verify scope has toolUI with required methods before accessing\n const isValidScope = (obj: unknown): obj is Scope => {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n 'toolUI' in obj &&\n typeof (obj as { toolUI?: unknown }).toolUI === 'object' &&\n (obj as { toolUI?: unknown }).toolUI !== null &&\n typeof (obj as { toolUI: { getManifest?: unknown } }).toolUI.getManifest === 'function' &&\n typeof (obj as { toolUI: { detectUIType?: unknown } }).toolUI.detectUIType === 'function'\n );\n };\n\n if (!isValidScope(this.scope)) {\n this.logger.warn(`parseTools: toolUI not available in scope for ${finalName}`);\n return item;\n }\n const scope = this.scope;\n\n // Get manifest and detect UI type with error handling\n let manifest;\n let detectedType: string;\n try {\n manifest = scope.toolUI.getManifest(finalName);\n detectedType = scope.toolUI.detectUIType(uiConfig.template);\n } catch (error) {\n this.logger.warn(`parseTools: failed to access toolUI for ${finalName}`, error);\n return item;\n }\n\n // Use centralized type guard from @frontmcp/ui/types\n const uiType: UIType = manifest?.uiType ?? (isUIType(detectedType) ? detectedType : 'auto');\n\n // Build meta keys based on platform type:\n // - OpenAI: openai/* keys only (ChatGPT proprietary format)\n // - ext-apps: ui/* keys only per SEP-1865 MCP Apps specification\n // - Other platforms: frontmcp/* keys + ui/* for compatibility\n const meta: Record<string, unknown> = {};\n const isExtApps = platformType === 'ext-apps';\n const widgetUri = `ui://widget/${encodeURIComponent(finalName)}.html`;\n\n if (isOpenAIPlatform) {\n // OpenAI-specific meta keys for ChatGPT widget discovery\n // ChatGPT only understands openai/* keys - don't mix with ui/* keys\n meta['openai/outputTemplate'] = widgetUri;\n meta['openai/resultCanProduceWidget'] = true;\n meta['openai/widgetAccessible'] = uiConfig.widgetAccessible ?? false;\n\n // Add invocation status if configured\n if (uiConfig.invocationStatus?.invoking) {\n meta['openai/toolInvocation/invoking'] = uiConfig.invocationStatus.invoking;\n }\n if (uiConfig.invocationStatus?.invoked) {\n meta['openai/toolInvocation/invoked'] = uiConfig.invocationStatus.invoked;\n }\n } else if (isExtApps) {\n // SEP-1865 MCP Apps specification uses ui/* keys only\n meta['ui/resourceUri'] = widgetUri;\n meta['ui/mimeType'] = 'text/html+mcp';\n\n // Add manifest info for ext-apps (uses ui/* namespace)\n meta['ui/cdn'] = buildCDNInfoForUIType(uiType);\n if (manifest) {\n meta['ui/type'] = manifest.uiType;\n meta['ui/manifestUri'] = `ui://widget/${encodeURIComponent(finalName)}/manifest.json`;\n meta['ui/displayMode'] = manifest.displayMode;\n meta['ui/bundlingMode'] = manifest.bundlingMode;\n } else if (uiConfig.template) {\n meta['ui/type'] = uiType;\n }\n } else {\n // FrontMCP meta keys for other platforms (Claude, Cursor, etc.)\n meta['frontmcp/outputTemplate'] = widgetUri;\n meta['frontmcp/resultCanProduceWidget'] = true;\n meta['frontmcp/widgetAccessible'] = uiConfig.widgetAccessible ?? false;\n\n // Add invocation status if configured\n if (uiConfig.invocationStatus?.invoking) {\n meta['frontmcp/toolInvocation/invoking'] = uiConfig.invocationStatus.invoking;\n }\n if (uiConfig.invocationStatus?.invoked) {\n meta['frontmcp/toolInvocation/invoked'] = uiConfig.invocationStatus.invoked;\n }\n\n // Add ui/* keys for compatibility with generic MCP clients\n meta['ui/cdn'] = buildCDNInfoForUIType(uiType);\n if (manifest) {\n meta['ui/type'] = manifest.uiType;\n meta['ui/manifestUri'] = `ui://widget/${encodeURIComponent(finalName)}/manifest.json`;\n meta['ui/displayMode'] = manifest.displayMode;\n meta['ui/bundlingMode'] = manifest.bundlingMode;\n } else if (uiConfig.template) {\n meta['ui/type'] = uiType;\n }\n }\n\n item._meta = meta;\n }\n\n return item;\n });\n\n const preview = this.sample(tools.map((t) => t.name)).join(', ');\n const extra = tools.length > 5 ? `, +${tools.length - 5} more` : '';\n this.logger.info(`parseTools: prepared ${tools.length} tool descriptor(s): ${preview}${extra}`);\n\n this.respond({ tools });\n this.logger.info('parseTools: response sent');\n this.logger.verbose('parseTools:done');\n } catch (error) {\n if (error instanceof FlowControl) throw error;\n this.logger.error('parseTools: failed to parse tools', error);\n throw error;\n }\n }\n}\n"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { EntryOwnerRef, ToolCallArgs, ToolCallExtra, ToolContext, ToolEntry, ToolInputType, ToolOutputType, ToolRecord, ParsedToolResult, ToolInputOf, ToolOutputOf, SafeTransformResult } from '../common';
|
|
2
2
|
import ProviderRegistry from '../provider/provider.registry';
|
|
3
|
-
import { z } from 'zod';
|
|
4
3
|
import HookRegistry from '../hooks/hook.registry';
|
|
5
4
|
import { Scope } from '../scope';
|
|
6
5
|
import type { CallToolRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
@@ -14,9 +13,7 @@ export declare class ToolInstance<InSchema extends ToolInputType = ToolInputType
|
|
|
14
13
|
readonly hooks: HookRegistry;
|
|
15
14
|
constructor(record: ToolRecord, providers: ProviderRegistry, owner: EntryOwnerRef);
|
|
16
15
|
protected initialize(): Promise<void>;
|
|
17
|
-
getMetadata(): import("../common").ToolMetadata<
|
|
18
|
-
[k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
|
|
19
|
-
}>, ToolOutputType>;
|
|
16
|
+
getMetadata(): import("../common").ToolMetadata<ToolInputType, ToolOutputType>;
|
|
20
17
|
getOutputSchema(): OutSchema | undefined;
|
|
21
18
|
create(input: ToolCallArgs, ctx: ToolCallExtra): ToolContext<InSchema, OutSchema, In, Out>;
|
|
22
19
|
parseInput(input: CallToolRequest['params']): CallToolRequest['params']['arguments'];
|
|
@@ -55,6 +55,7 @@ class TransportStreamableHttpAdapter extends transport_local_adapter_1.LocalTran
|
|
|
55
55
|
}
|
|
56
56
|
return originalWrite.call(this, chunk, encodingOrCb, cb);
|
|
57
57
|
};
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
58
59
|
const adapter = this;
|
|
59
60
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
61
|
res.end = function (chunk, encodingOrCb, cb) {
|