@execbox/core 0.5.0 → 0.7.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 +34 -15
- package/dist/{errors-DlbJQYs7.d.ts → errors-BIWv-QIC.d.ts} +2 -2
- package/dist/{errors-DlbJQYs7.d.ts.map → errors-BIWv-QIC.d.ts.map} +1 -1
- package/dist/{errors-wS8yjQhS.js → errors-DdWVEGU8.js} +1 -1
- package/dist/{errors-wS8yjQhS.js.map → errors-DdWVEGU8.js.map} +1 -1
- package/dist/{errors-B9ADBuDH.d.cts → errors-y4C-EIWT.d.cts} +2 -2
- package/dist/{errors-B9ADBuDH.d.cts.map → errors-y4C-EIWT.d.cts.map} +1 -1
- package/dist/{executor-B7q7K_27.d.ts → executor-BOTd9xNK.d.ts} +2 -2
- package/dist/{executor-B7q7K_27.d.ts.map → executor-BOTd9xNK.d.ts.map} +1 -1
- package/dist/{executor-BsE5nF-j.d.cts → executor-CtbrvTQ_.d.cts} +2 -2
- package/dist/{executor-BsE5nF-j.d.cts.map → executor-CtbrvTQ_.d.cts.map} +1 -1
- package/dist/index.cjs +2 -10
- package/dist/index.d.cts +4 -38
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +4 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/mcp/index.cjs +101 -34
- package/dist/mcp/index.cjs.map +1 -1
- package/dist/mcp/index.d.cts +24 -4
- package/dist/mcp/index.d.cts.map +1 -1
- package/dist/mcp/index.d.ts +24 -4
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +102 -35
- package/dist/mcp/index.js.map +1 -1
- package/dist/protocol/index.cjs +7 -3
- package/dist/protocol/index.cjs.map +1 -1
- package/dist/protocol/index.d.cts +4 -4
- package/dist/protocol/index.d.cts.map +1 -1
- package/dist/protocol/index.d.ts +4 -4
- package/dist/protocol/index.d.ts.map +1 -1
- package/dist/protocol/index.js +8 -4
- package/dist/protocol/index.js.map +1 -1
- package/dist/{resolveProvider-UqQxdF4j.js → resolveProvider-CMrXPuTx.js} +14 -3
- package/dist/resolveProvider-CMrXPuTx.js.map +1 -0
- package/dist/{resolveProvider-BZYSw8Qk.cjs → resolveProvider-DFAg6No5.cjs} +12 -43
- package/dist/resolveProvider-DFAg6No5.cjs.map +1 -0
- package/dist/{runner-CsrfDub-.cjs → runner-BEY9nWc7.cjs} +2 -1
- package/dist/runner-BEY9nWc7.cjs.map +1 -0
- package/dist/{runner-6GMM-5ur.js → runner-BWAVLBi6.js} +3 -2
- package/dist/runner-BWAVLBi6.js.map +1 -0
- package/dist/{runner-ClFrFnz9.d.ts → runner-Cy18Z0u0.d.cts} +26 -2
- package/dist/runner-Cy18Z0u0.d.cts.map +1 -0
- package/dist/{runner-DSgvu6Ad.d.cts → runner-DXLu0eJV.d.ts} +26 -2
- package/dist/runner-DXLu0eJV.d.ts.map +1 -0
- package/dist/runtime.cjs +2 -2
- package/dist/runtime.d.cts +4 -4
- package/dist/runtime.d.ts +4 -4
- package/dist/runtime.js +2 -2
- package/package.json +1 -1
- package/dist/resolveProvider-BZYSw8Qk.cjs.map +0 -1
- package/dist/resolveProvider-UqQxdF4j.js.map +0 -1
- package/dist/runner-6GMM-5ur.js.map +0 -1
- package/dist/runner-ClFrFnz9.d.ts.map +0 -1
- package/dist/runner-CsrfDub-.cjs.map +0 -1
- package/dist/runner-DSgvu6Ad.d.cts.map +0 -1
package/dist/mcp/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["renderDocComment","schemaToType","renderNamespaceDeclaration","InMemoryTransport","Client","closePromise: Promise<void> | undefined","provider: ToolProvider","resolveProvider","z","closePromise: Promise<void> | undefined","McpServer"],"sources":["../../src/mcp/mcpWrappedToolTypes.ts","../../src/mcp/createMcpToolProvider.ts","../../src/mcp/codeMcpServer.ts"],"sourcesContent":["import type { ResolvedToolProvider } from \"../types\";\nimport { schemaToType } from \"../typegen/jsonSchema\";\nimport {\n renderDocComment,\n renderNamespaceDeclaration,\n} from \"../typegen/render\";\n\nconst MCP_CALL_TOOL_RESULT_TYPE = [\n \"type McpCallToolResult = {\",\n \" content: Array<{\",\n \" type: string;\",\n \" text?: string;\",\n \" data?: string;\",\n \" mimeType?: string;\",\n \" resource?: unknown;\",\n \" uri?: string;\",\n \" name?: string;\",\n \" description?: string;\",\n \" }>;\",\n \" structuredContent?: unknown;\",\n \" isError?: boolean;\",\n \" _meta?: Record<string, unknown>;\",\n \"};\",\n].join(\"\\n\");\n\n/**\n * Generates the wrapped MCP tool namespace declarations exposed to guest code.\n */\nexport function generateMcpWrappedToolTypes(\n provider: ResolvedToolProvider,\n): string {\n const declarations = [MCP_CALL_TOOL_RESULT_TYPE];\n\n for (const [safeName, tool] of Object.entries(provider.tools)) {\n const comment = renderDocComment([\n ...(tool.description ? [tool.description, \"\"] : []),\n \"Wrapped MCP tool. Inspect structuredContent first, then fall back to content text items.\",\n ]);\n\n declarations.push(\n [\n comment,\n `function ${safeName}(input: ${schemaToType(tool.inputSchema)}): Promise<McpCallToolResult>;`,\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n );\n }\n\n return renderNamespaceDeclaration(provider.name, declarations);\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { InMemoryTransport } from \"@modelcontextprotocol/sdk/inMemory.js\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { Implementation } from \"@modelcontextprotocol/sdk/types.js\";\n\nimport { resolveProvider } from \"../provider/resolveProvider\";\nimport type { ResolvedToolProvider, ToolProvider } from \"../types\";\nimport { generateMcpWrappedToolTypes } from \"./mcpWrappedToolTypes\";\n\n/**\n * Caller-owned MCP client source used by the convenience wrapper API.\n */\nexport type McpToolClientSource = {\n client: Client;\n serverInfo?: Implementation;\n};\n\n/**\n * Local MCP server source that requires explicit lifecycle cleanup.\n */\nexport type McpToolServerSource = {\n server: McpServer;\n serverInfo?: Implementation;\n};\n\n/**\n * Source used to discover MCP tools for wrapping.\n */\nexport type McpToolSource = McpToolClientSource | McpToolServerSource;\n\nconst DEFAULT_MCP_TOOL_CLIENT_INFO = {\n name: \"mcp-tool-client\",\n version: \"0.0.0\",\n} satisfies Implementation;\n\n/**\n * Returns the upstream server identity when the source can provide one.\n */\nexport function getMcpToolSourceServerInfo(\n source: McpToolSource,\n): Implementation | undefined {\n if (source.serverInfo) {\n return source.serverInfo;\n }\n\n if (\"client\" in source) {\n return source.client.getServerVersion();\n }\n\n return undefined;\n}\n\n/**\n * Options for wrapping MCP tools into a code-execution provider.\n */\nexport interface CreateMcpToolProviderOptions {\n /** Namespace exposed to guest code for the wrapped tools. */\n namespace?: string;\n /** Implementation metadata exposed to local `{ server }` sources as the client identity. */\n clientInfo?: Implementation;\n}\n\n/**\n * Explicit handle for a wrapped MCP provider and any owned source connections.\n */\nexport interface McpToolProviderHandle {\n /** Resolved provider exposed to the executor or wrapper server. */\n provider: ResolvedToolProvider;\n /** Best-effort upstream server identity when available. */\n serverInfo?: Implementation;\n /** Releases any internal MCP client/server connection opened for the provider. */\n close: () => Promise<void>;\n}\n\ninterface OpenMcpToolClientResult {\n client: Client;\n close: () => Promise<void>;\n}\n\nasync function closeAll(closers: Array<() => Promise<void>>): Promise<void> {\n const results = await Promise.allSettled(closers.map((close) => close()));\n const rejected = results.find(\n (result): result is PromiseRejectedResult => result.status === \"rejected\",\n );\n\n if (rejected) {\n throw rejected.reason;\n }\n}\n\nasync function openMcpToolClient(\n source: McpToolSource,\n clientInfo: Implementation,\n): Promise<OpenMcpToolClientResult> {\n if (\"client\" in source) {\n return {\n client: source.client,\n close: async () => {},\n };\n }\n\n if (source.server.isConnected()) {\n throw new Error(\"{ server } sources must be unconnected local MCP servers\");\n }\n\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n const client = new Client(clientInfo);\n let closePromise: Promise<void> | undefined;\n let serverConnected = false;\n\n try {\n await source.server.connect(serverTransport);\n serverConnected = true;\n await client.connect(clientTransport);\n } catch (error) {\n await Promise.allSettled([\n Promise.resolve().then(() => client.close()),\n serverConnected\n ? Promise.resolve().then(() => source.server.close())\n : Promise.resolve(),\n ]);\n throw error;\n }\n\n return {\n client,\n close: async () => {\n closePromise ??= closeAll([\n () => client.close(),\n () => source.server.close(),\n ]);\n return closePromise;\n },\n };\n}\n\n/**\n * Opens an MCP tool source as a resolved execution provider with explicit cleanup.\n */\nexport async function openMcpToolProvider(\n source: McpToolSource,\n options: CreateMcpToolProviderOptions = {},\n): Promise<McpToolProviderHandle> {\n const connection = await openMcpToolClient(\n source,\n options.clientInfo ?? DEFAULT_MCP_TOOL_CLIENT_INFO,\n );\n\n try {\n const toolsResponse = await connection.client.listTools();\n const provider: ToolProvider = {\n name: options.namespace ?? \"mcp\",\n tools: {},\n };\n\n for (const tool of toolsResponse.tools) {\n provider.tools[tool.name] = {\n description: tool.description,\n execute: async (input, context) => {\n const argumentsObject =\n typeof input === \"object\" && input !== null\n ? (input as Record<string, unknown>)\n : undefined;\n\n return connection.client.callTool(\n {\n arguments: argumentsObject,\n name: tool.name,\n },\n undefined,\n { signal: context.signal },\n );\n },\n inputSchema: tool.inputSchema,\n };\n }\n\n const resolvedProvider = resolveProvider(provider);\n\n return {\n close: connection.close,\n provider: {\n ...resolvedProvider,\n types: generateMcpWrappedToolTypes(resolvedProvider),\n },\n serverInfo: getMcpToolSourceServerInfo(source),\n };\n } catch (error) {\n await connection.close().catch(() => {});\n throw error;\n }\n}\n\n/**\n * Wraps MCP tools from a caller-owned MCP client as a resolved execution provider.\n */\nexport async function createMcpToolProvider(\n source: McpToolClientSource,\n options: CreateMcpToolProviderOptions = {},\n): Promise<ResolvedToolProvider> {\n if (\"server\" in (source as unknown as McpToolSource)) {\n throw new Error(\n \"createMcpToolProvider() no longer accepts { server } sources. Use openMcpToolProvider() to receive a cleanup handle for owned local MCP server connections.\",\n );\n }\n\n const handle = await openMcpToolProvider(source, options);\n return handle.provider;\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { Implementation } from \"@modelcontextprotocol/sdk/types.js\";\nimport * as z from \"zod\";\n\nimport type { Executor } from \"../executor/executor\";\nimport type { ResolvedToolProvider } from \"../types\";\nimport {\n openMcpToolProvider,\n type CreateMcpToolProviderOptions,\n type McpToolSource,\n} from \"./createMcpToolProvider\";\n\n/**\n * Options for exposing wrapped MCP tool execution through an MCP server.\n */\nexport interface CodeMcpServerOptions extends CreateMcpToolProviderOptions {\n /** Executor used to run guest JavaScript against the wrapped provider. */\n executor: Executor;\n /** Implementation metadata exposed to downstream clients as the wrapper server identity. */\n serverInfo?: Implementation;\n /** Maximum number of text characters returned in text content blocks. */\n maxTextChars?: number;\n /** Wrapper tool layout to expose on the returned server. */\n mode?: \"both\" | \"single\" | \"split\";\n /** Optional custom names for the wrapper tools. */\n names?: {\n execute?: string;\n search?: string;\n single?: string;\n };\n}\n\nconst DEFAULT_MAX_TEXT_CHARS = 24_000;\nconst DEFAULT_MCP_CODE_WRAPPER_SERVER_INFO = {\n name: \"mcp-code-wrapper\",\n version: \"0.0.0\",\n} satisfies Implementation;\n\nfunction truncateText(text: string, maxTextChars: number): string {\n return text.length <= maxTextChars ? text : text.slice(0, maxTextChars);\n}\n\nfunction renderText(value: unknown, maxTextChars: number): string {\n return truncateText(JSON.stringify(value, null, 2), maxTextChars);\n}\n\nfunction searchTools(\n provider: ResolvedToolProvider,\n query: string | undefined,\n limit: number,\n): Record<string, unknown> {\n const normalizedQuery = query?.toLowerCase().trim();\n const matches = Object.entries(provider.tools)\n .map(([safeName, descriptor]) => ({\n description: descriptor.description,\n inputSchema: descriptor.inputSchema,\n originalName: descriptor.originalName,\n outputSchema: descriptor.outputSchema,\n safeName,\n }))\n .filter((tool) => {\n if (!normalizedQuery) {\n return true;\n }\n\n return [tool.originalName, tool.safeName, tool.description ?? \"\"].some(\n (field) => field.toLowerCase().includes(normalizedQuery),\n );\n })\n .slice(0, limit);\n\n return {\n namespace: provider.name,\n originalToSafeName: provider.originalToSafeName,\n safeToOriginalName: provider.safeToOriginalName,\n tools: matches,\n types: provider.types,\n };\n}\n\nfunction registerExecuteTool(\n server: McpServer,\n name: string,\n provider: ResolvedToolProvider,\n executor: Executor,\n maxTextChars: number,\n description: string,\n): void {\n // Cast required: McpServer.registerTool's generic signature doesn't support\n // the narrow input/output shape we need for the code-execution tool.\n const registerTool = server.registerTool.bind(server) as (\n toolName: string,\n config: {\n description: string;\n inputSchema: Record<string, z.ZodTypeAny>;\n },\n handler: (args: { code: string }) => Promise<{\n content: Array<{ text: string; type: \"text\" }>;\n isError: boolean;\n structuredContent: Record<string, unknown>;\n }>,\n ) => void;\n\n registerTool(\n name,\n {\n description,\n inputSchema: {\n code: z.string(),\n },\n },\n async (args: { code: string }) => {\n const execution = await executor.execute(args.code, [provider]);\n\n return {\n content: [{ text: renderText(execution, maxTextChars), type: \"text\" }],\n isError: !execution.ok,\n // ExecuteResult is JSON-safe; cast satisfies the SDK's generic record type.\n structuredContent: execution as Record<string, unknown>,\n };\n },\n );\n}\n\nfunction registerSearchTool(\n server: McpServer,\n name: string,\n provider: ResolvedToolProvider,\n maxTextChars: number,\n): void {\n // Cast required: same rationale as registerExecuteTool above.\n const registerTool = server.registerTool.bind(server) as (\n toolName: string,\n config: {\n description: string;\n inputSchema: Record<string, z.ZodTypeAny>;\n },\n handler: (args: { limit?: number; query?: string }) => Promise<{\n content: Array<{ text: string; type: \"text\" }>;\n structuredContent: Record<string, unknown>;\n }>,\n ) => void;\n\n registerTool(\n name,\n {\n description: `Search wrapped MCP tools exposed under the ${provider.name} namespace.`,\n inputSchema: {\n limit: z.number().int().optional(),\n query: z.string().optional(),\n },\n },\n async (args: { limit?: number; query?: string }) => {\n const structuredContent = searchTools(\n provider,\n args.query,\n args.limit ?? 20,\n );\n return {\n content: [\n { text: renderText(structuredContent, maxTextChars), type: \"text\" },\n ],\n structuredContent,\n };\n },\n );\n}\n\nfunction attachOwnedClose(\n server: McpServer,\n closeOwnedResources: () => Promise<void>,\n): McpServer {\n const originalClose = server.close.bind(server);\n let closePromise: Promise<void> | undefined;\n\n server.close = async () => {\n closePromise ??= (async () => {\n const results = await Promise.allSettled([\n originalClose(),\n closeOwnedResources(),\n ]);\n const rejected = results.find(\n (result): result is PromiseRejectedResult =>\n result.status === \"rejected\",\n );\n\n if (rejected) {\n throw rejected.reason;\n }\n })();\n\n return closePromise;\n };\n\n return server;\n}\n\n/**\n * Creates an MCP server that exposes code-execution tools for a wrapped MCP source.\n */\nexport async function codeMcpServer(\n source: McpToolSource,\n options: CodeMcpServerOptions,\n): Promise<McpServer> {\n const maxTextChars = options.maxTextChars ?? DEFAULT_MAX_TEXT_CHARS;\n const mode = options.mode ?? \"both\";\n const names = {\n execute: options.names?.execute ?? \"mcp_execute_code\",\n search: options.names?.search ?? \"mcp_search_tools\",\n single: options.names?.single ?? \"mcp_code\",\n };\n const handle = await openMcpToolProvider(source, {\n clientInfo: options.clientInfo,\n namespace: options.namespace ?? \"mcp\",\n });\n const provider = handle.provider;\n const server = new McpServer(\n options.serverInfo ??\n handle.serverInfo ??\n DEFAULT_MCP_CODE_WRAPPER_SERVER_INFO,\n );\n\n try {\n if (mode === \"both\" || mode === \"split\") {\n registerSearchTool(server, names.search, provider, maxTextChars);\n registerExecuteTool(\n server,\n names.execute,\n provider,\n options.executor,\n maxTextChars,\n `Execute JavaScript against the wrapped ${provider.name} MCP tool namespace.`,\n );\n }\n\n if (mode === \"both\" || mode === \"single\") {\n registerExecuteTool(\n server,\n names.single,\n provider,\n options.executor,\n maxTextChars,\n `Execute JavaScript against the wrapped ${provider.name} MCP tool namespace.\\n\\n${provider.types}`,\n );\n }\n\n return attachOwnedClose(server, handle.close);\n } catch (error) {\n await handle.close().catch(() => {});\n throw error;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["renderDocComment","schemaToType","renderNamespaceDeclaration","InMemoryTransport","Client","closePromise: Promise<void> | undefined","provider: ToolProvider","resolveProvider","z","closePromise: Promise<void> | undefined","McpServer"],"sources":["../../src/mcp/mcpWrappedToolTypes.ts","../../src/mcp/createMcpToolProvider.ts","../../src/mcp/codeMcpServer.ts"],"sourcesContent":["import type { ResolvedToolProvider } from \"../types\";\nimport { schemaToType } from \"../typegen/jsonSchema\";\nimport {\n renderDocComment,\n renderNamespaceDeclaration,\n} from \"../typegen/render\";\n\nconst MCP_CALL_TOOL_RESULT_TYPE = [\n \"type McpCallToolResult = {\",\n \" content: Array<{\",\n \" type: string;\",\n \" text?: string;\",\n \" data?: string;\",\n \" mimeType?: string;\",\n \" resource?: unknown;\",\n \" uri?: string;\",\n \" name?: string;\",\n \" description?: string;\",\n \" }>;\",\n \" structuredContent?: unknown;\",\n \" isError?: boolean;\",\n \" _meta?: Record<string, unknown>;\",\n \"};\",\n].join(\"\\n\");\n\n/**\n * Generates one wrapped MCP tool declaration exposed to guest code.\n */\nexport function generateMcpWrappedToolType(\n provider: ResolvedToolProvider,\n safeName: string,\n): string {\n const tool = provider.tools[safeName];\n\n if (!tool) {\n throw new Error(`Unknown wrapped MCP tool: ${safeName}`);\n }\n\n const comment = renderDocComment([\n ...(tool.description ? [tool.description, \"\"] : []),\n \"Wrapped MCP tool. Inspect structuredContent first, then fall back to content text items.\",\n ]);\n\n return [\n comment,\n `function ${safeName}(input: ${schemaToType(tool.inputSchema)}): Promise<McpCallToolResult>;`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\n/**\n * Generates the wrapped MCP tool namespace declarations exposed to guest code.\n */\nexport function generateMcpWrappedToolTypes(\n provider: ResolvedToolProvider,\n): string {\n const declarations = [\n MCP_CALL_TOOL_RESULT_TYPE,\n ...Object.keys(provider.tools).map((safeName) =>\n generateMcpWrappedToolType(provider, safeName),\n ),\n ];\n\n return renderNamespaceDeclaration(provider.name, declarations);\n}\n\n/**\n * Generates the wrapped MCP tool namespace declaration for one selected tool.\n */\nexport function generateMcpWrappedSingleToolTypes(\n provider: ResolvedToolProvider,\n safeName: string,\n): string {\n return renderNamespaceDeclaration(provider.name, [\n MCP_CALL_TOOL_RESULT_TYPE,\n generateMcpWrappedToolType(provider, safeName),\n ]);\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { InMemoryTransport } from \"@modelcontextprotocol/sdk/inMemory.js\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { Implementation } from \"@modelcontextprotocol/sdk/types.js\";\n\nimport { resolveProvider } from \"../provider/resolveProvider\";\nimport type {\n JsonSchema,\n ResolvedToolProvider,\n ToolAnnotations,\n ToolProvider,\n} from \"../types\";\nimport { generateMcpWrappedToolTypes } from \"./mcpWrappedToolTypes\";\n\n/**\n * Caller-owned MCP client source used by the convenience wrapper API.\n */\nexport type McpToolClientSource = {\n client: Client;\n serverInfo?: Implementation;\n};\n\n/**\n * Local MCP server source that requires explicit lifecycle cleanup.\n */\nexport type McpToolServerSource = {\n server: McpServer;\n serverInfo?: Implementation;\n};\n\n/**\n * Source used to discover MCP tools for wrapping.\n */\nexport type McpToolSource = McpToolClientSource | McpToolServerSource;\n\nconst DEFAULT_MCP_TOOL_CLIENT_INFO = {\n name: \"mcp-tool-client\",\n version: \"0.0.0\",\n} satisfies Implementation;\n\n/**\n * Returns the upstream server identity when the source can provide one.\n */\nexport function getMcpToolSourceServerInfo(\n source: McpToolSource,\n): Implementation | undefined {\n if (source.serverInfo) {\n return source.serverInfo;\n }\n\n if (\"client\" in source) {\n return source.client.getServerVersion();\n }\n\n return undefined;\n}\n\n/**\n * Options for wrapping MCP tools into a code-execution provider.\n */\nexport interface CreateMcpToolProviderOptions {\n /** Namespace exposed to guest code for the wrapped tools. */\n namespace?: string;\n /** Implementation metadata exposed to local `{ server }` sources as the client identity. */\n clientInfo?: Implementation;\n}\n\n/**\n * Full wrapped MCP tool metadata used by progressive discovery surfaces.\n */\nexport interface McpWrappedToolDefinition {\n /** Optional MCP-compatible behavior hints copied from the upstream tool. */\n annotations?: ToolAnnotations;\n /** Optional human-readable description copied from the upstream tool. */\n description?: string;\n /** Normalized input schema used for wrapped tool argument validation. */\n inputSchema?: JsonSchema;\n /** Original upstream MCP tool name. */\n originalName: string;\n /** Upstream output schema for the tool's `structuredContent`, when provided. */\n outputSchema?: JsonSchema;\n /** Sanitized tool name visible in guest code. */\n safeName: string;\n}\n\n/**\n * Explicit handle for a wrapped MCP provider and any owned source connections.\n */\nexport interface McpToolProviderHandle {\n /** Resolved provider exposed to the executor or wrapper server. */\n provider: ResolvedToolProvider;\n /** Best-effort upstream server identity when available. */\n serverInfo?: Implementation;\n /** Full wrapped MCP tool definitions keyed by safe guest-visible name. */\n toolDefinitions: Record<string, McpWrappedToolDefinition>;\n /** Releases any internal MCP client/server connection opened for the provider. */\n close: () => Promise<void>;\n}\n\ninterface OpenMcpToolClientResult {\n client: Client;\n close: () => Promise<void>;\n}\n\nasync function closeAll(closers: Array<() => Promise<void>>): Promise<void> {\n const results = await Promise.allSettled(closers.map((close) => close()));\n const rejected = results.find(\n (result): result is PromiseRejectedResult => result.status === \"rejected\",\n );\n\n if (rejected) {\n throw rejected.reason;\n }\n}\n\nfunction asJsonSchema(schema: unknown): JsonSchema | undefined {\n return typeof schema === \"object\" && schema !== null\n ? (schema as JsonSchema)\n : undefined;\n}\n\nasync function openMcpToolClient(\n source: McpToolSource,\n clientInfo: Implementation,\n): Promise<OpenMcpToolClientResult> {\n if (\"client\" in source) {\n return {\n client: source.client,\n close: async () => {},\n };\n }\n\n if (source.server.isConnected()) {\n throw new Error(\"{ server } sources must be unconnected local MCP servers\");\n }\n\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n const client = new Client(clientInfo);\n let closePromise: Promise<void> | undefined;\n let serverConnected = false;\n\n try {\n await source.server.connect(serverTransport);\n serverConnected = true;\n await client.connect(clientTransport);\n } catch (error) {\n await Promise.allSettled([\n Promise.resolve().then(() => client.close()),\n serverConnected\n ? Promise.resolve().then(() => source.server.close())\n : Promise.resolve(),\n ]);\n throw error;\n }\n\n return {\n client,\n close: async () => {\n closePromise ??= closeAll([\n () => client.close(),\n () => source.server.close(),\n ]);\n return closePromise;\n },\n };\n}\n\n/**\n * Opens an MCP tool source as a resolved execution provider with explicit cleanup.\n */\nexport async function openMcpToolProvider(\n source: McpToolSource,\n options: CreateMcpToolProviderOptions = {},\n): Promise<McpToolProviderHandle> {\n const connection = await openMcpToolClient(\n source,\n options.clientInfo ?? DEFAULT_MCP_TOOL_CLIENT_INFO,\n );\n\n try {\n const toolsResponse = await connection.client.listTools();\n const toolsByOriginalName = new Map(\n toolsResponse.tools.map((tool) => [tool.name, tool] as const),\n );\n const provider: ToolProvider = {\n name: options.namespace ?? \"mcp\",\n tools: {},\n };\n\n for (const tool of toolsResponse.tools) {\n provider.tools[tool.name] = {\n annotations: tool.annotations,\n description: tool.description,\n execute: async (input, context) => {\n const argumentsObject =\n typeof input === \"object\" && input !== null\n ? (input as Record<string, unknown>)\n : undefined;\n\n return connection.client.callTool(\n {\n arguments: argumentsObject,\n name: tool.name,\n },\n undefined,\n { signal: context.signal },\n );\n },\n inputSchema: tool.inputSchema,\n };\n }\n\n const resolvedProvider = resolveProvider(provider);\n const toolDefinitions = Object.fromEntries(\n Object.entries(resolvedProvider.tools).map(([safeName, descriptor]) => {\n const upstreamTool = toolsByOriginalName.get(descriptor.originalName);\n\n return [\n safeName,\n {\n annotations: descriptor.annotations,\n description: descriptor.description,\n inputSchema: descriptor.inputSchema,\n originalName: descriptor.originalName,\n outputSchema: asJsonSchema(upstreamTool?.outputSchema),\n safeName: descriptor.safeName,\n },\n ];\n }),\n );\n\n return {\n close: connection.close,\n provider: {\n ...resolvedProvider,\n types: generateMcpWrappedToolTypes(resolvedProvider),\n },\n serverInfo: getMcpToolSourceServerInfo(source),\n toolDefinitions,\n };\n } catch (error) {\n await connection.close().catch(() => {});\n throw error;\n }\n}\n\n/**\n * Wraps MCP tools from a caller-owned MCP client as a resolved execution provider.\n */\nexport async function createMcpToolProvider(\n source: McpToolClientSource,\n options: CreateMcpToolProviderOptions = {},\n): Promise<ResolvedToolProvider> {\n if (\"server\" in (source as unknown as McpToolSource)) {\n throw new Error(\n \"createMcpToolProvider() no longer accepts { server } sources. Use openMcpToolProvider() to receive a cleanup handle for owned local MCP server connections.\",\n );\n }\n\n const handle = await openMcpToolProvider(source, options);\n return handle.provider;\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { Implementation } from \"@modelcontextprotocol/sdk/types.js\";\nimport * as z from \"zod\";\n\nimport type { Executor } from \"../executor/executor\";\nimport type { ResolvedToolProvider, ToolAnnotations } from \"../types\";\nimport {\n openMcpToolProvider,\n type CreateMcpToolProviderOptions,\n type McpWrappedToolDefinition,\n type McpToolSource,\n} from \"./createMcpToolProvider\";\nimport { generateMcpWrappedSingleToolTypes } from \"./mcpWrappedToolTypes\";\n\n/**\n * Options for exposing wrapped MCP tool execution through an MCP server.\n */\nexport interface CodeMcpServerOptions extends CreateMcpToolProviderOptions {\n /** Executor used to run guest JavaScript against the wrapped provider. */\n executor: Executor;\n /** Implementation metadata exposed to downstream clients as the wrapper server identity. */\n serverInfo?: Implementation;\n /** Maximum number of text characters returned in text content blocks. */\n maxTextChars?: number;\n /** Wrapper tool layout to expose on the returned server. */\n mode?: \"both\" | \"progressive\" | \"single\";\n /** Optional custom names for the wrapper tools. */\n names?: {\n details?: string;\n execute?: string;\n search?: string;\n single?: string;\n };\n}\n\nconst DEFAULT_MAX_TEXT_CHARS = 24_000;\nconst CODE_EXECUTION_TOOL_ANNOTATIONS = {\n destructiveHint: true,\n idempotentHint: false,\n openWorldHint: true,\n readOnlyHint: false,\n} satisfies ToolAnnotations;\nconst READ_ONLY_TOOL_ANNOTATIONS = {\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n readOnlyHint: true,\n} satisfies ToolAnnotations;\nconst DEFAULT_MCP_CODE_WRAPPER_SERVER_INFO = {\n name: \"mcp-code-wrapper\",\n version: \"0.0.0\",\n} satisfies Implementation;\n\nfunction truncateText(text: string, maxTextChars: number): string {\n return text.length <= maxTextChars ? text : text.slice(0, maxTextChars);\n}\n\nfunction renderText(value: unknown, maxTextChars: number): string {\n return truncateText(JSON.stringify(value, null, 2), maxTextChars);\n}\n\nfunction searchTools(\n toolDefinitions: Record<string, McpWrappedToolDefinition>,\n namespace: string,\n query: string | undefined,\n limit: number,\n): Record<string, unknown> {\n const normalizedQuery = query?.toLowerCase().trim();\n const matches = Object.values(toolDefinitions)\n .filter((tool) => {\n if (!normalizedQuery) {\n return true;\n }\n\n return [tool.originalName, tool.safeName, tool.description ?? \"\"].some(\n (field) => field.toLowerCase().includes(normalizedQuery),\n );\n })\n .slice(0, limit)\n .map((tool) => ({\n annotations: tool.annotations,\n description: tool.description,\n originalName: tool.originalName,\n safeName: tool.safeName,\n }));\n\n return {\n namespace,\n tools: matches,\n };\n}\n\nfunction getToolDetails(\n provider: ResolvedToolProvider,\n toolDefinitions: Record<string, McpWrappedToolDefinition>,\n safeName: string,\n): Record<string, unknown> {\n const tool = toolDefinitions[safeName];\n\n if (!tool) {\n throw new Error(`Unknown wrapped MCP tool: ${safeName}`);\n }\n\n return {\n annotations: tool.annotations,\n description: tool.description,\n inputSchema: tool.inputSchema,\n originalName: tool.originalName,\n outputSchema: tool.outputSchema,\n safeName: tool.safeName,\n types: generateMcpWrappedSingleToolTypes(provider, safeName),\n };\n}\n\nfunction registerExecuteTool(\n server: McpServer,\n name: string,\n provider: ResolvedToolProvider,\n executor: Executor,\n maxTextChars: number,\n description: string,\n): void {\n // Cast required: McpServer.registerTool's generic signature doesn't support\n // the narrow input/output shape we need for the code-execution tool.\n const registerTool = server.registerTool.bind(server) as (\n toolName: string,\n config: {\n annotations: ToolAnnotations;\n description: string;\n inputSchema: Record<string, z.ZodTypeAny>;\n },\n handler: (args: { code: string }) => Promise<{\n content: Array<{ text: string; type: \"text\" }>;\n isError: boolean;\n structuredContent: Record<string, unknown>;\n }>,\n ) => void;\n\n registerTool(\n name,\n {\n annotations: CODE_EXECUTION_TOOL_ANNOTATIONS,\n description,\n inputSchema: {\n code: z.string(),\n },\n },\n async (args: { code: string }) => {\n const execution = await executor.execute(args.code, [provider]);\n\n return {\n content: [{ text: renderText(execution, maxTextChars), type: \"text\" }],\n isError: !execution.ok,\n // ExecuteResult is JSON-safe; cast satisfies the SDK's generic record type.\n structuredContent: execution as Record<string, unknown>,\n };\n },\n );\n}\n\nfunction registerSearchTool(\n server: McpServer,\n name: string,\n namespace: string,\n toolDefinitions: Record<string, McpWrappedToolDefinition>,\n maxTextChars: number,\n): void {\n // Cast required: same rationale as registerExecuteTool above.\n const registerTool = server.registerTool.bind(server) as (\n toolName: string,\n config: {\n annotations: ToolAnnotations;\n description: string;\n inputSchema: Record<string, z.ZodTypeAny>;\n },\n handler: (args: { limit?: number; query?: string }) => Promise<{\n content: Array<{ text: string; type: \"text\" }>;\n structuredContent: Record<string, unknown>;\n }>,\n ) => void;\n\n registerTool(\n name,\n {\n annotations: READ_ONLY_TOOL_ANNOTATIONS,\n description: `Search wrapped MCP tools exposed under the ${namespace} namespace. Returns concise catalog entries only; call the details tool for schemas.`,\n inputSchema: {\n limit: z.number().int().optional(),\n query: z.string().optional(),\n },\n },\n async (args: { limit?: number; query?: string }) => {\n const structuredContent = searchTools(\n toolDefinitions,\n namespace,\n args.query,\n args.limit ?? 20,\n );\n return {\n content: [\n { text: renderText(structuredContent, maxTextChars), type: \"text\" },\n ],\n structuredContent,\n };\n },\n );\n}\n\nfunction registerDetailsTool(\n server: McpServer,\n name: string,\n provider: ResolvedToolProvider,\n toolDefinitions: Record<string, McpWrappedToolDefinition>,\n maxTextChars: number,\n): void {\n // Cast required: same rationale as registerExecuteTool above.\n const registerTool = server.registerTool.bind(server) as (\n toolName: string,\n config: {\n annotations: ToolAnnotations;\n description: string;\n inputSchema: Record<string, z.ZodTypeAny>;\n },\n handler: (args: { safeName: string }) => Promise<{\n content: Array<{ text: string; type: \"text\" }>;\n structuredContent: Record<string, unknown>;\n }>,\n ) => void;\n\n registerTool(\n name,\n {\n annotations: READ_ONLY_TOOL_ANNOTATIONS,\n description: `Return the full schema and generated TypeScript declaration for one wrapped ${provider.name} MCP tool.`,\n inputSchema: {\n safeName: z.string(),\n },\n },\n async (args: { safeName: string }) => {\n const structuredContent = getToolDetails(\n provider,\n toolDefinitions,\n args.safeName,\n );\n return {\n content: [\n { text: renderText(structuredContent, maxTextChars), type: \"text\" },\n ],\n structuredContent,\n };\n },\n );\n}\n\nfunction attachOwnedClose(\n server: McpServer,\n closeOwnedResources: () => Promise<void>,\n): McpServer {\n const originalClose = server.close.bind(server);\n let closePromise: Promise<void> | undefined;\n\n server.close = async () => {\n closePromise ??= (async () => {\n const results = await Promise.allSettled([\n originalClose(),\n closeOwnedResources(),\n ]);\n const rejected = results.find(\n (result): result is PromiseRejectedResult =>\n result.status === \"rejected\",\n );\n\n if (rejected) {\n throw rejected.reason;\n }\n })();\n\n return closePromise;\n };\n\n return server;\n}\n\n/**\n * Creates an MCP server that exposes code-execution tools for a wrapped MCP source.\n */\nexport async function codeMcpServer(\n source: McpToolSource,\n options: CodeMcpServerOptions,\n): Promise<McpServer> {\n const maxTextChars = options.maxTextChars ?? DEFAULT_MAX_TEXT_CHARS;\n const mode = options.mode ?? \"progressive\";\n const names = {\n details: options.names?.details ?? \"mcp_get_tool_details\",\n execute: options.names?.execute ?? \"mcp_execute_code\",\n search: options.names?.search ?? \"mcp_search_tools\",\n single: options.names?.single ?? \"mcp_code\",\n };\n const handle = await openMcpToolProvider(source, {\n clientInfo: options.clientInfo,\n namespace: options.namespace ?? \"mcp\",\n });\n const provider = handle.provider;\n const server = new McpServer(\n options.serverInfo ??\n handle.serverInfo ??\n DEFAULT_MCP_CODE_WRAPPER_SERVER_INFO,\n );\n\n try {\n if (mode === \"both\" || mode === \"progressive\") {\n registerSearchTool(\n server,\n names.search,\n provider.name,\n handle.toolDefinitions,\n maxTextChars,\n );\n registerDetailsTool(\n server,\n names.details,\n provider,\n handle.toolDefinitions,\n maxTextChars,\n );\n registerExecuteTool(\n server,\n names.execute,\n provider,\n options.executor,\n maxTextChars,\n `Execute JavaScript against the wrapped ${provider.name} MCP tool namespace. Use the search and details tools before writing code.`,\n );\n }\n\n if (mode === \"both\" || mode === \"single\") {\n registerExecuteTool(\n server,\n names.single,\n provider,\n options.executor,\n maxTextChars,\n `Execute JavaScript against the wrapped ${provider.name} MCP tool namespace.\\n\\n${provider.types}`,\n );\n }\n\n return attachOwnedClose(server, handle.close);\n } catch (error) {\n await handle.close().catch(() => {});\n throw error;\n }\n}\n"],"mappings":"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"}
|
package/dist/mcp/index.d.cts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* @packageDocumentation
|
|
3
3
|
* Public TypeScript declarations for this package entrypoint.
|
|
4
4
|
*/
|
|
5
|
-
import { d as ExecuteResult, f as JsonSchema,
|
|
6
|
-
import { t as Executor } from "../executor-
|
|
5
|
+
import { _ as ToolExecutionContext, d as ExecuteResult, f as JsonSchema, h as ToolAnnotations, l as ExecuteError, m as ResolvedToolProvider, n as ExecutorRuntimeOptions, p as ResolvedToolDescriptor, t as ExecutionOptions, u as ExecuteErrorCode } from "../runner-Cy18Z0u0.cjs";
|
|
6
|
+
import { t as Executor } from "../executor-CtbrvTQ_.cjs";
|
|
7
7
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
8
|
import { Implementation } from "@modelcontextprotocol/sdk/types.js";
|
|
9
9
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
@@ -40,6 +40,23 @@ interface CreateMcpToolProviderOptions {
|
|
|
40
40
|
/** Implementation metadata exposed to local `{ server }` sources as the client identity. */
|
|
41
41
|
clientInfo?: Implementation;
|
|
42
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Full wrapped MCP tool metadata used by progressive discovery surfaces.
|
|
45
|
+
*/
|
|
46
|
+
interface McpWrappedToolDefinition {
|
|
47
|
+
/** Optional MCP-compatible behavior hints copied from the upstream tool. */
|
|
48
|
+
annotations?: ToolAnnotations;
|
|
49
|
+
/** Optional human-readable description copied from the upstream tool. */
|
|
50
|
+
description?: string;
|
|
51
|
+
/** Normalized input schema used for wrapped tool argument validation. */
|
|
52
|
+
inputSchema?: JsonSchema;
|
|
53
|
+
/** Original upstream MCP tool name. */
|
|
54
|
+
originalName: string;
|
|
55
|
+
/** Upstream output schema for the tool's `structuredContent`, when provided. */
|
|
56
|
+
outputSchema?: JsonSchema;
|
|
57
|
+
/** Sanitized tool name visible in guest code. */
|
|
58
|
+
safeName: string;
|
|
59
|
+
}
|
|
43
60
|
/**
|
|
44
61
|
* Explicit handle for a wrapped MCP provider and any owned source connections.
|
|
45
62
|
*/
|
|
@@ -48,6 +65,8 @@ interface McpToolProviderHandle {
|
|
|
48
65
|
provider: ResolvedToolProvider;
|
|
49
66
|
/** Best-effort upstream server identity when available. */
|
|
50
67
|
serverInfo?: Implementation;
|
|
68
|
+
/** Full wrapped MCP tool definitions keyed by safe guest-visible name. */
|
|
69
|
+
toolDefinitions: Record<string, McpWrappedToolDefinition>;
|
|
51
70
|
/** Releases any internal MCP client/server connection opened for the provider. */
|
|
52
71
|
close: () => Promise<void>;
|
|
53
72
|
}
|
|
@@ -72,9 +91,10 @@ interface CodeMcpServerOptions extends CreateMcpToolProviderOptions {
|
|
|
72
91
|
/** Maximum number of text characters returned in text content blocks. */
|
|
73
92
|
maxTextChars?: number;
|
|
74
93
|
/** Wrapper tool layout to expose on the returned server. */
|
|
75
|
-
mode?: "both" | "
|
|
94
|
+
mode?: "both" | "progressive" | "single";
|
|
76
95
|
/** Optional custom names for the wrapper tools. */
|
|
77
96
|
names?: {
|
|
97
|
+
details?: string;
|
|
78
98
|
execute?: string;
|
|
79
99
|
search?: string;
|
|
80
100
|
single?: string;
|
|
@@ -85,5 +105,5 @@ interface CodeMcpServerOptions extends CreateMcpToolProviderOptions {
|
|
|
85
105
|
*/
|
|
86
106
|
declare function codeMcpServer(source: McpToolSource, options: CodeMcpServerOptions): Promise<McpServer>;
|
|
87
107
|
//#endregion
|
|
88
|
-
export { type CodeMcpServerOptions, type CreateMcpToolProviderOptions, type ExecuteError, type ExecuteErrorCode, type ExecuteResult, type ExecutionOptions, type Executor, type ExecutorRuntimeOptions, type JsonSchema, type McpToolClientSource, type McpToolProviderHandle, type McpToolServerSource, type McpToolSource, type ResolvedToolDescriptor, type ResolvedToolProvider, type ToolExecutionContext, codeMcpServer, createMcpToolProvider, getMcpToolSourceServerInfo, openMcpToolProvider };
|
|
108
|
+
export { type CodeMcpServerOptions, type CreateMcpToolProviderOptions, type ExecuteError, type ExecuteErrorCode, type ExecuteResult, type ExecutionOptions, type Executor, type ExecutorRuntimeOptions, type JsonSchema, type McpToolClientSource, type McpToolProviderHandle, type McpToolServerSource, type McpToolSource, type McpWrappedToolDefinition, type ResolvedToolDescriptor, type ResolvedToolProvider, type ToolAnnotations, type ToolExecutionContext, codeMcpServer, createMcpToolProvider, getMcpToolSourceServerInfo, openMcpToolProvider };
|
|
89
109
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/mcp/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/mcp/createMcpToolProvider.ts","../../src/mcp/codeMcpServer.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/mcp/createMcpToolProvider.ts","../../src/mcp/codeMcpServer.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/mcp/index.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* @packageDocumentation
|
|
3
3
|
* Public TypeScript declarations for this package entrypoint.
|
|
4
4
|
*/
|
|
5
|
-
import { d as ExecuteResult, f as JsonSchema,
|
|
6
|
-
import { t as Executor } from "../executor-
|
|
5
|
+
import { _ as ToolExecutionContext, d as ExecuteResult, f as JsonSchema, h as ToolAnnotations, l as ExecuteError, m as ResolvedToolProvider, n as ExecutorRuntimeOptions, p as ResolvedToolDescriptor, t as ExecutionOptions, u as ExecuteErrorCode } from "../runner-DXLu0eJV.js";
|
|
6
|
+
import { t as Executor } from "../executor-BOTd9xNK.js";
|
|
7
7
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
8
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
9
9
|
import { Implementation } from "@modelcontextprotocol/sdk/types.js";
|
|
@@ -40,6 +40,23 @@ interface CreateMcpToolProviderOptions {
|
|
|
40
40
|
/** Implementation metadata exposed to local `{ server }` sources as the client identity. */
|
|
41
41
|
clientInfo?: Implementation;
|
|
42
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Full wrapped MCP tool metadata used by progressive discovery surfaces.
|
|
45
|
+
*/
|
|
46
|
+
interface McpWrappedToolDefinition {
|
|
47
|
+
/** Optional MCP-compatible behavior hints copied from the upstream tool. */
|
|
48
|
+
annotations?: ToolAnnotations;
|
|
49
|
+
/** Optional human-readable description copied from the upstream tool. */
|
|
50
|
+
description?: string;
|
|
51
|
+
/** Normalized input schema used for wrapped tool argument validation. */
|
|
52
|
+
inputSchema?: JsonSchema;
|
|
53
|
+
/** Original upstream MCP tool name. */
|
|
54
|
+
originalName: string;
|
|
55
|
+
/** Upstream output schema for the tool's `structuredContent`, when provided. */
|
|
56
|
+
outputSchema?: JsonSchema;
|
|
57
|
+
/** Sanitized tool name visible in guest code. */
|
|
58
|
+
safeName: string;
|
|
59
|
+
}
|
|
43
60
|
/**
|
|
44
61
|
* Explicit handle for a wrapped MCP provider and any owned source connections.
|
|
45
62
|
*/
|
|
@@ -48,6 +65,8 @@ interface McpToolProviderHandle {
|
|
|
48
65
|
provider: ResolvedToolProvider;
|
|
49
66
|
/** Best-effort upstream server identity when available. */
|
|
50
67
|
serverInfo?: Implementation;
|
|
68
|
+
/** Full wrapped MCP tool definitions keyed by safe guest-visible name. */
|
|
69
|
+
toolDefinitions: Record<string, McpWrappedToolDefinition>;
|
|
51
70
|
/** Releases any internal MCP client/server connection opened for the provider. */
|
|
52
71
|
close: () => Promise<void>;
|
|
53
72
|
}
|
|
@@ -72,9 +91,10 @@ interface CodeMcpServerOptions extends CreateMcpToolProviderOptions {
|
|
|
72
91
|
/** Maximum number of text characters returned in text content blocks. */
|
|
73
92
|
maxTextChars?: number;
|
|
74
93
|
/** Wrapper tool layout to expose on the returned server. */
|
|
75
|
-
mode?: "both" | "
|
|
94
|
+
mode?: "both" | "progressive" | "single";
|
|
76
95
|
/** Optional custom names for the wrapper tools. */
|
|
77
96
|
names?: {
|
|
97
|
+
details?: string;
|
|
78
98
|
execute?: string;
|
|
79
99
|
search?: string;
|
|
80
100
|
single?: string;
|
|
@@ -85,5 +105,5 @@ interface CodeMcpServerOptions extends CreateMcpToolProviderOptions {
|
|
|
85
105
|
*/
|
|
86
106
|
declare function codeMcpServer(source: McpToolSource, options: CodeMcpServerOptions): Promise<McpServer>;
|
|
87
107
|
//#endregion
|
|
88
|
-
export { type CodeMcpServerOptions, type CreateMcpToolProviderOptions, type ExecuteError, type ExecuteErrorCode, type ExecuteResult, type ExecutionOptions, type Executor, type ExecutorRuntimeOptions, type JsonSchema, type McpToolClientSource, type McpToolProviderHandle, type McpToolServerSource, type McpToolSource, type ResolvedToolDescriptor, type ResolvedToolProvider, type ToolExecutionContext, codeMcpServer, createMcpToolProvider, getMcpToolSourceServerInfo, openMcpToolProvider };
|
|
108
|
+
export { type CodeMcpServerOptions, type CreateMcpToolProviderOptions, type ExecuteError, type ExecuteErrorCode, type ExecuteResult, type ExecutionOptions, type Executor, type ExecutorRuntimeOptions, type JsonSchema, type McpToolClientSource, type McpToolProviderHandle, type McpToolServerSource, type McpToolSource, type McpWrappedToolDefinition, type ResolvedToolDescriptor, type ResolvedToolProvider, type ToolAnnotations, type ToolExecutionContext, codeMcpServer, createMcpToolProvider, getMcpToolSourceServerInfo, openMcpToolProvider };
|
|
89
109
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/mcp/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/mcp/createMcpToolProvider.ts","../../src/mcp/codeMcpServer.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/mcp/createMcpToolProvider.ts","../../src/mcp/codeMcpServer.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import "../
|
|
1
|
+
import "../errors-DdWVEGU8.js";
|
|
2
|
+
import { i as renderNamespaceDeclaration, n as schemaToType, r as renderDocComment, t as resolveProvider } from "../resolveProvider-CMrXPuTx.js";
|
|
3
3
|
import * as z from "zod";
|
|
4
4
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
5
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
@@ -24,16 +24,26 @@ const MCP_CALL_TOOL_RESULT_TYPE = [
|
|
|
24
24
|
"};"
|
|
25
25
|
].join("\n");
|
|
26
26
|
/**
|
|
27
|
+
* Generates one wrapped MCP tool declaration exposed to guest code.
|
|
28
|
+
*/
|
|
29
|
+
function generateMcpWrappedToolType(provider, safeName) {
|
|
30
|
+
const tool = provider.tools[safeName];
|
|
31
|
+
if (!tool) throw new Error(`Unknown wrapped MCP tool: ${safeName}`);
|
|
32
|
+
return [renderDocComment([...tool.description ? [tool.description, ""] : [], "Wrapped MCP tool. Inspect structuredContent first, then fall back to content text items."]), `function ${safeName}(input: ${schemaToType(tool.inputSchema)}): Promise<McpCallToolResult>;`].filter(Boolean).join("\n");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
27
35
|
* Generates the wrapped MCP tool namespace declarations exposed to guest code.
|
|
28
36
|
*/
|
|
29
37
|
function generateMcpWrappedToolTypes(provider) {
|
|
30
|
-
const declarations = [MCP_CALL_TOOL_RESULT_TYPE];
|
|
31
|
-
for (const [safeName, tool] of Object.entries(provider.tools)) {
|
|
32
|
-
const comment = renderDocComment([...tool.description ? [tool.description, ""] : [], "Wrapped MCP tool. Inspect structuredContent first, then fall back to content text items."]);
|
|
33
|
-
declarations.push([comment, `function ${safeName}(input: ${schemaToType(tool.inputSchema)}): Promise<McpCallToolResult>;`].filter(Boolean).join("\n"));
|
|
34
|
-
}
|
|
38
|
+
const declarations = [MCP_CALL_TOOL_RESULT_TYPE, ...Object.keys(provider.tools).map((safeName) => generateMcpWrappedToolType(provider, safeName))];
|
|
35
39
|
return renderNamespaceDeclaration(provider.name, declarations);
|
|
36
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Generates the wrapped MCP tool namespace declaration for one selected tool.
|
|
43
|
+
*/
|
|
44
|
+
function generateMcpWrappedSingleToolTypes(provider, safeName) {
|
|
45
|
+
return renderNamespaceDeclaration(provider.name, [MCP_CALL_TOOL_RESULT_TYPE, generateMcpWrappedToolType(provider, safeName)]);
|
|
46
|
+
}
|
|
37
47
|
|
|
38
48
|
//#endregion
|
|
39
49
|
//#region src/mcp/createMcpToolProvider.ts
|
|
@@ -52,6 +62,9 @@ async function closeAll(closers) {
|
|
|
52
62
|
const rejected = (await Promise.allSettled(closers.map((close) => close()))).find((result) => result.status === "rejected");
|
|
53
63
|
if (rejected) throw rejected.reason;
|
|
54
64
|
}
|
|
65
|
+
function asJsonSchema(schema) {
|
|
66
|
+
return typeof schema === "object" && schema !== null ? schema : void 0;
|
|
67
|
+
}
|
|
55
68
|
async function openMcpToolClient(source, clientInfo) {
|
|
56
69
|
if ("client" in source) return {
|
|
57
70
|
client: source.client,
|
|
@@ -85,11 +98,13 @@ async function openMcpToolProvider(source, options = {}) {
|
|
|
85
98
|
const connection = await openMcpToolClient(source, options.clientInfo ?? DEFAULT_MCP_TOOL_CLIENT_INFO);
|
|
86
99
|
try {
|
|
87
100
|
const toolsResponse = await connection.client.listTools();
|
|
101
|
+
const toolsByOriginalName = new Map(toolsResponse.tools.map((tool) => [tool.name, tool]));
|
|
88
102
|
const provider = {
|
|
89
103
|
name: options.namespace ?? "mcp",
|
|
90
104
|
tools: {}
|
|
91
105
|
};
|
|
92
106
|
for (const tool of toolsResponse.tools) provider.tools[tool.name] = {
|
|
107
|
+
annotations: tool.annotations,
|
|
93
108
|
description: tool.description,
|
|
94
109
|
execute: async (input, context) => {
|
|
95
110
|
const argumentsObject = typeof input === "object" && input !== null ? input : void 0;
|
|
@@ -101,13 +116,25 @@ async function openMcpToolProvider(source, options = {}) {
|
|
|
101
116
|
inputSchema: tool.inputSchema
|
|
102
117
|
};
|
|
103
118
|
const resolvedProvider = resolveProvider(provider);
|
|
119
|
+
const toolDefinitions = Object.fromEntries(Object.entries(resolvedProvider.tools).map(([safeName, descriptor]) => {
|
|
120
|
+
const upstreamTool = toolsByOriginalName.get(descriptor.originalName);
|
|
121
|
+
return [safeName, {
|
|
122
|
+
annotations: descriptor.annotations,
|
|
123
|
+
description: descriptor.description,
|
|
124
|
+
inputSchema: descriptor.inputSchema,
|
|
125
|
+
originalName: descriptor.originalName,
|
|
126
|
+
outputSchema: asJsonSchema(upstreamTool?.outputSchema),
|
|
127
|
+
safeName: descriptor.safeName
|
|
128
|
+
}];
|
|
129
|
+
}));
|
|
104
130
|
return {
|
|
105
131
|
close: connection.close,
|
|
106
132
|
provider: {
|
|
107
133
|
...resolvedProvider,
|
|
108
134
|
types: generateMcpWrappedToolTypes(resolvedProvider)
|
|
109
135
|
},
|
|
110
|
-
serverInfo: getMcpToolSourceServerInfo(source)
|
|
136
|
+
serverInfo: getMcpToolSourceServerInfo(source),
|
|
137
|
+
toolDefinitions
|
|
111
138
|
};
|
|
112
139
|
} catch (error) {
|
|
113
140
|
await connection.close().catch(() => {});
|
|
@@ -125,6 +152,18 @@ async function createMcpToolProvider(source, options = {}) {
|
|
|
125
152
|
//#endregion
|
|
126
153
|
//#region src/mcp/codeMcpServer.ts
|
|
127
154
|
const DEFAULT_MAX_TEXT_CHARS = 24e3;
|
|
155
|
+
const CODE_EXECUTION_TOOL_ANNOTATIONS = {
|
|
156
|
+
destructiveHint: true,
|
|
157
|
+
idempotentHint: false,
|
|
158
|
+
openWorldHint: true,
|
|
159
|
+
readOnlyHint: false
|
|
160
|
+
};
|
|
161
|
+
const READ_ONLY_TOOL_ANNOTATIONS = {
|
|
162
|
+
destructiveHint: false,
|
|
163
|
+
idempotentHint: true,
|
|
164
|
+
openWorldHint: false,
|
|
165
|
+
readOnlyHint: true
|
|
166
|
+
};
|
|
128
167
|
const DEFAULT_MCP_CODE_WRAPPER_SERVER_INFO = {
|
|
129
168
|
name: "mcp-code-wrapper",
|
|
130
169
|
version: "0.0.0"
|
|
@@ -135,32 +174,41 @@ function truncateText(text, maxTextChars) {
|
|
|
135
174
|
function renderText(value, maxTextChars) {
|
|
136
175
|
return truncateText(JSON.stringify(value, null, 2), maxTextChars);
|
|
137
176
|
}
|
|
138
|
-
function searchTools(
|
|
177
|
+
function searchTools(toolDefinitions, namespace, query, limit) {
|
|
139
178
|
const normalizedQuery = query?.toLowerCase().trim();
|
|
140
|
-
const matches = Object.entries(provider.tools).map(([safeName, descriptor]) => ({
|
|
141
|
-
description: descriptor.description,
|
|
142
|
-
inputSchema: descriptor.inputSchema,
|
|
143
|
-
originalName: descriptor.originalName,
|
|
144
|
-
outputSchema: descriptor.outputSchema,
|
|
145
|
-
safeName
|
|
146
|
-
})).filter((tool) => {
|
|
147
|
-
if (!normalizedQuery) return true;
|
|
148
|
-
return [
|
|
149
|
-
tool.originalName,
|
|
150
|
-
tool.safeName,
|
|
151
|
-
tool.description ?? ""
|
|
152
|
-
].some((field) => field.toLowerCase().includes(normalizedQuery));
|
|
153
|
-
}).slice(0, limit);
|
|
154
179
|
return {
|
|
155
|
-
namespace
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
180
|
+
namespace,
|
|
181
|
+
tools: Object.values(toolDefinitions).filter((tool) => {
|
|
182
|
+
if (!normalizedQuery) return true;
|
|
183
|
+
return [
|
|
184
|
+
tool.originalName,
|
|
185
|
+
tool.safeName,
|
|
186
|
+
tool.description ?? ""
|
|
187
|
+
].some((field) => field.toLowerCase().includes(normalizedQuery));
|
|
188
|
+
}).slice(0, limit).map((tool) => ({
|
|
189
|
+
annotations: tool.annotations,
|
|
190
|
+
description: tool.description,
|
|
191
|
+
originalName: tool.originalName,
|
|
192
|
+
safeName: tool.safeName
|
|
193
|
+
}))
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function getToolDetails(provider, toolDefinitions, safeName) {
|
|
197
|
+
const tool = toolDefinitions[safeName];
|
|
198
|
+
if (!tool) throw new Error(`Unknown wrapped MCP tool: ${safeName}`);
|
|
199
|
+
return {
|
|
200
|
+
annotations: tool.annotations,
|
|
201
|
+
description: tool.description,
|
|
202
|
+
inputSchema: tool.inputSchema,
|
|
203
|
+
originalName: tool.originalName,
|
|
204
|
+
outputSchema: tool.outputSchema,
|
|
205
|
+
safeName: tool.safeName,
|
|
206
|
+
types: generateMcpWrappedSingleToolTypes(provider, safeName)
|
|
160
207
|
};
|
|
161
208
|
}
|
|
162
209
|
function registerExecuteTool(server, name, provider, executor, maxTextChars, description) {
|
|
163
210
|
server.registerTool.bind(server)(name, {
|
|
211
|
+
annotations: CODE_EXECUTION_TOOL_ANNOTATIONS,
|
|
164
212
|
description,
|
|
165
213
|
inputSchema: { code: z.string() }
|
|
166
214
|
}, async (args) => {
|
|
@@ -175,15 +223,32 @@ function registerExecuteTool(server, name, provider, executor, maxTextChars, des
|
|
|
175
223
|
};
|
|
176
224
|
});
|
|
177
225
|
}
|
|
178
|
-
function registerSearchTool(server, name,
|
|
226
|
+
function registerSearchTool(server, name, namespace, toolDefinitions, maxTextChars) {
|
|
179
227
|
server.registerTool.bind(server)(name, {
|
|
180
|
-
|
|
228
|
+
annotations: READ_ONLY_TOOL_ANNOTATIONS,
|
|
229
|
+
description: `Search wrapped MCP tools exposed under the ${namespace} namespace. Returns concise catalog entries only; call the details tool for schemas.`,
|
|
181
230
|
inputSchema: {
|
|
182
231
|
limit: z.number().int().optional(),
|
|
183
232
|
query: z.string().optional()
|
|
184
233
|
}
|
|
185
234
|
}, async (args) => {
|
|
186
|
-
const structuredContent = searchTools(
|
|
235
|
+
const structuredContent = searchTools(toolDefinitions, namespace, args.query, args.limit ?? 20);
|
|
236
|
+
return {
|
|
237
|
+
content: [{
|
|
238
|
+
text: renderText(structuredContent, maxTextChars),
|
|
239
|
+
type: "text"
|
|
240
|
+
}],
|
|
241
|
+
structuredContent
|
|
242
|
+
};
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
function registerDetailsTool(server, name, provider, toolDefinitions, maxTextChars) {
|
|
246
|
+
server.registerTool.bind(server)(name, {
|
|
247
|
+
annotations: READ_ONLY_TOOL_ANNOTATIONS,
|
|
248
|
+
description: `Return the full schema and generated TypeScript declaration for one wrapped ${provider.name} MCP tool.`,
|
|
249
|
+
inputSchema: { safeName: z.string() }
|
|
250
|
+
}, async (args) => {
|
|
251
|
+
const structuredContent = getToolDetails(provider, toolDefinitions, args.safeName);
|
|
187
252
|
return {
|
|
188
253
|
content: [{
|
|
189
254
|
text: renderText(structuredContent, maxTextChars),
|
|
@@ -210,8 +275,9 @@ function attachOwnedClose(server, closeOwnedResources) {
|
|
|
210
275
|
*/
|
|
211
276
|
async function codeMcpServer(source, options) {
|
|
212
277
|
const maxTextChars = options.maxTextChars ?? DEFAULT_MAX_TEXT_CHARS;
|
|
213
|
-
const mode = options.mode ?? "
|
|
278
|
+
const mode = options.mode ?? "progressive";
|
|
214
279
|
const names = {
|
|
280
|
+
details: options.names?.details ?? "mcp_get_tool_details",
|
|
215
281
|
execute: options.names?.execute ?? "mcp_execute_code",
|
|
216
282
|
search: options.names?.search ?? "mcp_search_tools",
|
|
217
283
|
single: options.names?.single ?? "mcp_code"
|
|
@@ -223,9 +289,10 @@ async function codeMcpServer(source, options) {
|
|
|
223
289
|
const provider = handle.provider;
|
|
224
290
|
const server = new McpServer(options.serverInfo ?? handle.serverInfo ?? DEFAULT_MCP_CODE_WRAPPER_SERVER_INFO);
|
|
225
291
|
try {
|
|
226
|
-
if (mode === "both" || mode === "
|
|
227
|
-
registerSearchTool(server, names.search, provider, maxTextChars);
|
|
228
|
-
|
|
292
|
+
if (mode === "both" || mode === "progressive") {
|
|
293
|
+
registerSearchTool(server, names.search, provider.name, handle.toolDefinitions, maxTextChars);
|
|
294
|
+
registerDetailsTool(server, names.details, provider, handle.toolDefinitions, maxTextChars);
|
|
295
|
+
registerExecuteTool(server, names.execute, provider, options.executor, maxTextChars, `Execute JavaScript against the wrapped ${provider.name} MCP tool namespace. Use the search and details tools before writing code.`);
|
|
229
296
|
}
|
|
230
297
|
if (mode === "both" || mode === "single") registerExecuteTool(server, names.single, provider, options.executor, maxTextChars, `Execute JavaScript against the wrapped ${provider.name} MCP tool namespace.\n\n${provider.types}`);
|
|
231
298
|
return attachOwnedClose(server, handle.close);
|