@mcp-b/global 1.0.13 → 1.0.14
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 +555 -326
- package/dist/index.d.ts +206 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.iife.js +6 -0
- package/dist/index.js +429 -21
- package/dist/index.js.map +1 -0
- package/package.json +27 -15
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["jsonSchemaToZod","convertJsonSchemaToZod","properties: Record<string, { type: string; description?: string; [key: string]: unknown }>","required: string[]","enumValues: unknown[] | undefined","items: unknown | undefined","propertySchema: { type: string; description?: string; [key: string]: unknown }","validatedTool: ValidatedToolDescriptor","McpServer","bridge: MCPBridge"],"sources":["../src/validation.ts","../src/global.ts","../src/index.ts"],"sourcesContent":["// validation.ts - JSON Schema <-> Zod conversion and validation utilities\n\nimport { jsonSchemaToZod as convertJsonSchemaToZod } from '@composio/json-schema-to-zod';\nimport { z } from 'zod';\nimport type { InputSchema } from './types.js';\n\n/**\n * Detect if a schema is a Zod schema object (Record<string, ZodType>)\n * or a JSON Schema object\n */\nexport function isZodSchema(schema: unknown): boolean {\n if (typeof schema !== 'object' || schema === null) {\n return false;\n }\n\n // JSON Schema always has a 'type' property at the root\n if ('type' in schema && typeof (schema as { type: unknown }).type === 'string') {\n return false; // This is JSON Schema\n }\n\n // Check if any property value is a Zod type instance\n const values = Object.values(schema);\n if (values.length === 0) {\n return false; // Empty object, treat as JSON Schema\n }\n\n // If any value is a ZodType, it's a Zod schema\n return values.some((val) => val instanceof z.ZodType);\n}\n\n/**\n * Convert JSON Schema to Zod validator\n * Uses @composio/json-schema-to-zod for conversion\n */\nexport function jsonSchemaToZod(jsonSchema: InputSchema): z.ZodType {\n try {\n // convertJsonSchemaToZod returns a Zod schema from JSON Schema\n const zodSchema = convertJsonSchemaToZod(jsonSchema as unknown as object);\n return zodSchema;\n } catch (error) {\n console.warn('[Web Model Context] Failed to convert JSON Schema to Zod:', error);\n // Fallback: accept anything with passthrough\n return z.object({}).passthrough();\n }\n}\n\n/**\n * Convert Zod schema object to JSON Schema\n * Based on react-webmcp implementation\n */\nexport function zodToJsonSchema(schema: Record<string, z.ZodTypeAny>): InputSchema {\n const properties: Record<string, { type: string; description?: string; [key: string]: unknown }> =\n {};\n const required: string[] = [];\n\n for (const [key, zodType] of Object.entries(schema)) {\n // Extract description if available\n const description = (zodType as { description?: string }).description || undefined;\n\n // Infer JSON Schema type from Zod type\n let type = 'string';\n let enumValues: unknown[] | undefined;\n let items: unknown | undefined;\n\n if (zodType instanceof z.ZodString) {\n type = 'string';\n } else if (zodType instanceof z.ZodNumber) {\n type = 'number';\n } else if (zodType instanceof z.ZodBoolean) {\n type = 'boolean';\n } else if (zodType instanceof z.ZodArray) {\n type = 'array';\n // Try to get array item type\n const elementType = (zodType as { element?: z.ZodTypeAny }).element;\n if (elementType instanceof z.ZodString) {\n items = { type: 'string' };\n } else if (elementType instanceof z.ZodNumber) {\n items = { type: 'number' };\n } else if (elementType instanceof z.ZodBoolean) {\n items = { type: 'boolean' };\n } else {\n items = { type: 'string' };\n }\n } else if (zodType instanceof z.ZodObject) {\n type = 'object';\n } else if (zodType instanceof z.ZodEnum) {\n type = 'string';\n // Extract enum values\n const enumDef = (zodType as { _def?: { values?: unknown[] } })._def;\n if (enumDef?.values) {\n enumValues = enumDef.values;\n }\n }\n\n const propertySchema: { type: string; description?: string; [key: string]: unknown } = { type };\n if (description) {\n propertySchema.description = description;\n }\n if (enumValues) {\n propertySchema.enum = enumValues;\n }\n if (items) {\n propertySchema.items = items;\n }\n\n properties[key] = propertySchema;\n\n // Check if field is required (not optional)\n if (!zodType.isOptional()) {\n required.push(key);\n }\n }\n\n return {\n type: 'object',\n properties,\n ...(required.length > 0 && { required }),\n };\n}\n\n/**\n * Normalize a schema to both JSON Schema and Zod formats\n * Detects which format is provided and converts to the other\n */\nexport function normalizeSchema(schema: InputSchema | Record<string, z.ZodTypeAny>): {\n jsonSchema: InputSchema;\n zodValidator: z.ZodType;\n} {\n const isZod = isZodSchema(schema);\n\n if (isZod) {\n // Input is Zod schema object → convert to JSON Schema and wrap in z.object()\n const jsonSchema = zodToJsonSchema(schema as Record<string, z.ZodTypeAny>);\n const zodValidator = z.object(schema as Record<string, z.ZodTypeAny>);\n return { jsonSchema, zodValidator };\n }\n\n // Input is JSON Schema → convert to Zod\n const jsonSchema = schema as InputSchema;\n const zodValidator = jsonSchemaToZod(jsonSchema);\n return { jsonSchema, zodValidator };\n}\n\n/**\n * Validate data with Zod schema and return formatted result\n */\nexport function validateWithZod(\n data: unknown,\n validator: z.ZodType\n): { success: true; data: unknown } | { success: false; error: string } {\n const result = validator.safeParse(data);\n\n if (!result.success) {\n // Format Zod errors into readable message\n const errors = result.error.errors\n .map((err) => ` - ${err.path.join('.') || 'root'}: ${err.message}`)\n .join('\\n');\n return {\n success: false,\n error: `Validation failed:\\n${errors}`,\n };\n }\n\n return {\n success: true,\n data: result.data,\n };\n}\n","// global.ts - Web Model Context API Implementation\n// Bridges the Web Model Context API (window.navigator.modelContext) to MCP SDK\n\nimport { TabServerTransport } from '@mcp-b/transports';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n Server as McpServer,\n} from '@mcp-b/webmcp-ts-sdk';\nimport type {\n InternalModelContext,\n MCPBridge,\n ModelContextInput,\n ToolCallEvent,\n ToolDescriptor,\n ToolResponse,\n ValidatedToolDescriptor,\n} from './types.js';\nimport { normalizeSchema, validateWithZod } from './validation.js';\n\n/**\n * Custom ToolCallEvent implementation\n */\nclass WebToolCallEvent extends Event implements ToolCallEvent {\n public name: string;\n public arguments: Record<string, unknown>;\n private _response: ToolResponse | null = null;\n private _responded = false;\n\n constructor(toolName: string, args: Record<string, unknown>) {\n super('toolcall', { cancelable: true });\n this.name = toolName;\n this.arguments = args;\n }\n\n respondWith(response: ToolResponse): void {\n if (this._responded) {\n throw new Error('Response already provided for this tool call');\n }\n this._response = response;\n this._responded = true;\n }\n\n getResponse(): ToolResponse | null {\n return this._response;\n }\n\n hasResponse(): boolean {\n return this._responded;\n }\n}\n\n/**\n * Time window (in ms) to detect rapid duplicate registrations\n * Registrations within this window are likely due to React Strict Mode\n */\nconst RAPID_DUPLICATE_WINDOW_MS = 50;\n\n/**\n * ModelContext implementation that bridges to MCP SDK\n * Implements the W3C Web Model Context API proposal with two-bucket tool management\n *\n * Two-Bucket System:\n * - Bucket A (provideContextTools): Tools registered via provideContext() - base/app-level tools\n * - Bucket B (dynamicTools): Tools registered via registerTool() - component-scoped tools\n *\n * Benefits:\n * - provideContext() only clears Bucket A, leaving Bucket B intact\n * - Components can manage their own tool lifecycle independently\n * - Final tool list = Bucket A + Bucket B (merged, with collision detection)\n */\nclass WebModelContext implements InternalModelContext {\n private bridge: MCPBridge;\n private eventTarget: EventTarget;\n\n // Bucket A: Tools from provideContext() - cleared when provideContext is called again\n private provideContextTools: Map<string, ValidatedToolDescriptor>;\n\n // Bucket B: Tools from registerTool() - persist across provideContext calls\n private dynamicTools: Map<string, ValidatedToolDescriptor>;\n\n // Track registration timestamps for rapid duplicate detection (React Strict Mode)\n private registrationTimestamps: Map<string, number>;\n\n // Store unregister functions for returning on rapid duplicates\n private unregisterFunctions: Map<string, () => void>;\n\n constructor(bridge: MCPBridge) {\n this.bridge = bridge;\n this.eventTarget = new EventTarget();\n this.provideContextTools = new Map();\n this.dynamicTools = new Map();\n this.registrationTimestamps = new Map();\n this.unregisterFunctions = new Map();\n }\n\n /**\n * Add event listener (compatible with ModelContext interface)\n */\n addEventListener(\n type: 'toolcall',\n listener: (event: ToolCallEvent) => void | Promise<void>,\n options?: boolean | AddEventListenerOptions\n ): void {\n this.eventTarget.addEventListener(type, listener as EventListener, options);\n }\n\n /**\n * Remove event listener\n */\n removeEventListener(\n type: 'toolcall',\n listener: (event: ToolCallEvent) => void | Promise<void>,\n options?: boolean | EventListenerOptions\n ): void {\n this.eventTarget.removeEventListener(type, listener as EventListener, options);\n }\n\n /**\n * Dispatch event\n */\n dispatchEvent(event: Event): boolean {\n return this.eventTarget.dispatchEvent(event);\n }\n\n /**\n * Provide context (tools) to AI models\n * Clears and replaces Bucket A (provideContext tools), leaving Bucket B (dynamic tools) intact\n */\n provideContext(context: ModelContextInput): void {\n console.log(`[Web Model Context] Registering ${context.tools.length} tools via provideContext`);\n\n // Clear only Bucket A (provideContext tools)\n this.provideContextTools.clear();\n\n // Process each tool: normalize schemas and create validated descriptors\n for (const tool of context.tools) {\n // Check for name collisions with Bucket B (dynamic tools)\n if (this.dynamicTools.has(tool.name)) {\n throw new Error(\n `[Web Model Context] Tool name collision: \"${tool.name}\" is already registered via registerTool(). ` +\n 'Please use a different name or unregister the dynamic tool first.'\n );\n }\n\n // Normalize input schema (convert to both JSON Schema and Zod)\n const { jsonSchema: inputJson, zodValidator: inputZod } = normalizeSchema(tool.inputSchema);\n\n // Normalize output schema if provided\n const normalizedOutput = tool.outputSchema ? normalizeSchema(tool.outputSchema) : null;\n\n // Create validated tool descriptor\n const validatedTool: ValidatedToolDescriptor = {\n name: tool.name,\n description: tool.description,\n inputSchema: inputJson,\n ...(normalizedOutput && { outputSchema: normalizedOutput.jsonSchema }),\n ...(tool.annotations && { annotations: tool.annotations }),\n execute: tool.execute,\n inputValidator: inputZod,\n ...(normalizedOutput && { outputValidator: normalizedOutput.zodValidator }),\n };\n\n // Add to Bucket A\n this.provideContextTools.set(tool.name, validatedTool);\n }\n\n // Update the merged tool list in bridge\n this.updateBridgeTools();\n\n // Notify that tools list changed\n if (this.bridge.server.notification) {\n this.bridge.server.notification({\n method: 'notifications/tools/list_changed',\n params: {},\n });\n }\n }\n\n /**\n * Register a single tool dynamically (Bucket B)\n * Returns an object with an unregister function to remove the tool\n * Tools registered via this method persist across provideContext() calls\n */\n registerTool(tool: ToolDescriptor<any, any>): { unregister: () => void } {\n console.log(`[Web Model Context] Registering tool dynamically: ${tool.name}`);\n\n // Check for rapid duplicate registration (React Strict Mode detection)\n const now = Date.now();\n const lastRegistration = this.registrationTimestamps.get(tool.name);\n\n if (lastRegistration && now - lastRegistration < RAPID_DUPLICATE_WINDOW_MS) {\n console.warn(\n `[Web Model Context] Tool \"${tool.name}\" registered multiple times within ${RAPID_DUPLICATE_WINDOW_MS}ms. ` +\n 'This is likely due to React Strict Mode double-mounting. Ignoring duplicate registration.'\n );\n\n // Return the existing unregister function\n const existingUnregister = this.unregisterFunctions.get(tool.name);\n if (existingUnregister) {\n return { unregister: existingUnregister };\n }\n }\n\n // Check for name collision with Bucket A (provideContext tools)\n if (this.provideContextTools.has(tool.name)) {\n throw new Error(\n `[Web Model Context] Tool name collision: \"${tool.name}\" is already registered via provideContext(). ` +\n 'Please use a different name or update your provideContext() call.'\n );\n }\n\n // Check for name collision within Bucket B (genuine duplicate, not rapid)\n if (this.dynamicTools.has(tool.name)) {\n throw new Error(\n `[Web Model Context] Tool name collision: \"${tool.name}\" is already registered via registerTool(). ` +\n 'Please unregister it first or use a different name.'\n );\n }\n\n // Normalize input schema (convert to both JSON Schema and Zod)\n const { jsonSchema: inputJson, zodValidator: inputZod } = normalizeSchema(tool.inputSchema);\n\n // Normalize output schema if provided\n const normalizedOutput = tool.outputSchema ? normalizeSchema(tool.outputSchema) : null;\n\n // Create validated tool descriptor\n const validatedTool: ValidatedToolDescriptor = {\n name: tool.name,\n description: tool.description,\n inputSchema: inputJson,\n ...(normalizedOutput && { outputSchema: normalizedOutput.jsonSchema }),\n ...(tool.annotations && { annotations: tool.annotations }),\n execute: tool.execute,\n inputValidator: inputZod,\n ...(normalizedOutput && { outputValidator: normalizedOutput.zodValidator }),\n };\n\n // Add to Bucket B (dynamic tools)\n this.dynamicTools.set(tool.name, validatedTool);\n\n // Store registration timestamp for rapid duplicate detection\n this.registrationTimestamps.set(tool.name, now);\n\n // Update the merged tool list in bridge\n this.updateBridgeTools();\n\n // Notify that tools list changed\n if (this.bridge.server.notification) {\n this.bridge.server.notification({\n method: 'notifications/tools/list_changed',\n params: {},\n });\n }\n\n // Create unregister function\n const unregisterFn = () => {\n console.log(`[Web Model Context] Unregistering tool: ${tool.name}`);\n\n // Check if this tool was registered via provideContext\n if (this.provideContextTools.has(tool.name)) {\n throw new Error(\n `[Web Model Context] Cannot unregister tool \"${tool.name}\": ` +\n 'This tool was registered via provideContext(). Use provideContext() to update the base tool set.'\n );\n }\n\n // Remove from Bucket B\n if (!this.dynamicTools.has(tool.name)) {\n console.warn(\n `[Web Model Context] Tool \"${tool.name}\" is not registered, ignoring unregister call`\n );\n return;\n }\n\n this.dynamicTools.delete(tool.name);\n\n // Clean up tracking data\n this.registrationTimestamps.delete(tool.name);\n this.unregisterFunctions.delete(tool.name);\n\n // Update the merged tool list in bridge\n this.updateBridgeTools();\n\n // Notify that tools list changed\n if (this.bridge.server.notification) {\n this.bridge.server.notification({\n method: 'notifications/tools/list_changed',\n params: {},\n });\n }\n };\n\n // Store unregister function for rapid duplicate detection\n this.unregisterFunctions.set(tool.name, unregisterFn);\n\n // Return unregister function\n return { unregister: unregisterFn };\n }\n\n /**\n * Update the bridge tools map with merged tools from both buckets\n * Final tool list = Bucket A (provideContext) + Bucket B (dynamic)\n */\n private updateBridgeTools(): void {\n // Clear the bridge tools map\n this.bridge.tools.clear();\n\n // Add tools from Bucket A (provideContext tools)\n for (const [name, tool] of this.provideContextTools) {\n this.bridge.tools.set(name, tool);\n }\n\n // Add tools from Bucket B (dynamic tools)\n for (const [name, tool] of this.dynamicTools) {\n this.bridge.tools.set(name, tool);\n }\n\n console.log(\n `[Web Model Context] Updated bridge with ${this.provideContextTools.size} base tools + ${this.dynamicTools.size} dynamic tools = ${this.bridge.tools.size} total`\n );\n }\n\n /**\n * Execute a tool with hybrid approach:\n * 1. Validate input arguments\n * 2. Dispatch toolcall event first\n * 3. If not prevented, call tool's execute function\n * 4. Validate output (permissive mode - warn only)\n */\n async executeTool(toolName: string, args: Record<string, unknown>): Promise<ToolResponse> {\n const tool = this.bridge.tools.get(toolName);\n if (!tool) {\n throw new Error(`Tool not found: ${toolName}`);\n }\n\n // 1. VALIDATE INPUT ARGUMENTS\n console.log(`[Web Model Context] Validating input for tool: ${toolName}`);\n const validation = validateWithZod(args, tool.inputValidator);\n if (!validation.success) {\n console.error(\n `[Web Model Context] Input validation failed for ${toolName}:`,\n validation.error\n );\n return {\n content: [\n {\n type: 'text',\n text: `Input validation error for tool \"${toolName}\":\\n${validation.error}`,\n },\n ],\n isError: true,\n };\n }\n\n // Use validated data for execution\n const validatedArgs = validation.data as Record<string, unknown>;\n\n // 2. Create toolcall event\n const event = new WebToolCallEvent(toolName, validatedArgs);\n\n // Dispatch event to listeners\n this.dispatchEvent(event);\n\n // If event was prevented and response provided, use that\n if (event.defaultPrevented && event.hasResponse()) {\n const response = event.getResponse();\n if (response) {\n console.log(`[Web Model Context] Tool ${toolName} handled by event listener`);\n return response;\n }\n }\n\n // 3. Execute the tool's execute function\n console.log(`[Web Model Context] Executing tool: ${toolName}`);\n try {\n const response = await tool.execute(validatedArgs);\n\n // 4. VALIDATE OUTPUT (permissive mode - warn only, don't block)\n if (tool.outputValidator && response.structuredContent) {\n const outputValidation = validateWithZod(response.structuredContent, tool.outputValidator);\n if (!outputValidation.success) {\n console.warn(\n `[Web Model Context] Output validation failed for ${toolName}:`,\n outputValidation.error\n );\n // Continue anyway - permissive mode\n }\n }\n\n return response;\n } catch (error) {\n console.error(`[Web Model Context] Error executing tool ${toolName}:`, error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n }\n\n /**\n * Get list of registered tools in MCP format\n * Includes full MCP spec: annotations, outputSchema, etc.\n */\n listTools() {\n return Array.from(this.bridge.tools.values()).map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n ...(tool.outputSchema && { outputSchema: tool.outputSchema }),\n ...(tool.annotations && { annotations: tool.annotations }),\n }));\n }\n}\n\n/**\n * Initialize the MCP bridge\n */\nfunction initializeMCPBridge(): MCPBridge {\n console.log('[Web Model Context] Initializing MCP bridge');\n\n const hostname = window.location.hostname || 'localhost';\n\n // Create MCP server\n const server = new McpServer(\n {\n name: hostname,\n version: '1.0.0',\n },\n {\n capabilities: {\n tools: {\n listChanged: true,\n },\n },\n }\n );\n\n // Create bridge object (modelContext is assigned after instantiation)\n const bridge: MCPBridge = {\n server,\n tools: new Map(),\n modelContext: undefined as unknown as InternalModelContext,\n isInitialized: true,\n };\n\n // Create modelContext and attach to bridge\n const modelContext = new WebModelContext(bridge);\n bridge.modelContext = modelContext;\n\n // Set up MCP server handlers\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n console.log('[MCP Bridge] Handling list_tools request');\n return {\n tools: bridge.modelContext.listTools(),\n };\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n console.log(`[MCP Bridge] Handling call_tool request: ${request.params.name}`);\n\n const toolName = request.params.name;\n const args = (request.params.arguments || {}) as Record<string, unknown>;\n\n try {\n const response = await bridge.modelContext.executeTool(toolName, args);\n // Return in MCP SDK format\n return {\n content: response.content,\n isError: response.isError,\n };\n } catch (error) {\n console.error(`[MCP Bridge] Error calling tool ${toolName}:`, error);\n throw error;\n }\n });\n\n // Connect transport\n const transport = new TabServerTransport({\n allowedOrigins: ['*'], // TODO: Make this configurable\n });\n\n server.connect(transport);\n\n console.log('[Web Model Context] MCP server connected');\n\n return bridge;\n}\n\n/**\n * Initialize the Web Model Context API (window.navigator.modelContext)\n */\nexport function initializeWebModelContext(): void {\n if (typeof window === 'undefined') {\n console.warn('[Web Model Context] Not in browser environment, skipping initialization');\n return;\n }\n\n if (window.navigator.modelContext) {\n console.warn(\n '[Web Model Context] window.navigator.modelContext already exists, skipping initialization'\n );\n return;\n }\n\n try {\n // Initialize MCP bridge\n const bridge = initializeMCPBridge();\n\n // Expose shared modelContext instance\n Object.defineProperty(window.navigator, 'modelContext', {\n value: bridge.modelContext,\n writable: false,\n configurable: false,\n });\n\n // Expose bridge for debugging\n Object.defineProperty(window, '__mcpBridge', {\n value: bridge,\n writable: false,\n configurable: true,\n });\n\n console.log('✅ [Web Model Context] window.navigator.modelContext initialized successfully');\n } catch (error) {\n console.error('[Web Model Context] Failed to initialize:', error);\n throw error;\n }\n}\n\n/**\n * Cleanup function (for testing/development)\n */\nexport function cleanupWebModelContext(): void {\n if (typeof window === 'undefined') return;\n\n if (window.__mcpBridge) {\n try {\n window.__mcpBridge.server.close();\n } catch (error) {\n console.warn('[Web Model Context] Error closing MCP server:', error);\n }\n }\n\n delete (window.navigator as unknown as { modelContext?: unknown }).modelContext;\n delete (window as unknown as { __mcpBridge?: unknown }).__mcpBridge;\n\n console.log('[Web Model Context] Cleaned up');\n}\n","// index.ts - Entry point for Web Model Context API polyfill\n\nimport { initializeWebModelContext } from './global.js';\n\n// Auto-initialize immediately when script loads in browser environments\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n try {\n initializeWebModelContext();\n } catch (error) {\n console.error('[Web Model Context] Auto-initialization failed:', error);\n }\n}\n\n// For manual initialization (when using as ES module)\nexport { cleanupWebModelContext, initializeWebModelContext } from './global.js';\nexport type * from './types.js';\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-b/global",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.14",
|
|
4
|
+
"description": "W3C Web Model Context API polyfill - implements window.navigator.modelContext bridging to Model Context Protocol",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
7
7
|
"model-context-protocol",
|
|
8
|
+
"web-model-context",
|
|
9
|
+
"navigator.modelContext",
|
|
10
|
+
"w3c",
|
|
8
11
|
"browser",
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
12
|
+
"polyfill",
|
|
13
|
+
"web-standard",
|
|
14
|
+
"ai-agents",
|
|
15
|
+
"tools"
|
|
13
16
|
],
|
|
14
17
|
"homepage": "https://github.com/MiguelsPizza/WebMCP#readme",
|
|
15
18
|
"bugs": {
|
|
@@ -25,23 +28,33 @@
|
|
|
25
28
|
"sideEffects": true,
|
|
26
29
|
"type": "module",
|
|
27
30
|
"exports": {
|
|
28
|
-
".":
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"import": "./dist/index.js",
|
|
34
|
+
"default": "./dist/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./iife": {
|
|
37
|
+
"script": "./dist/index.iife.js",
|
|
38
|
+
"default": "./dist/index.iife.js"
|
|
39
|
+
}
|
|
29
40
|
},
|
|
30
41
|
"main": "./dist/index.js",
|
|
31
42
|
"module": "./dist/index.js",
|
|
32
|
-
"browser": "./dist/index.js",
|
|
43
|
+
"browser": "./dist/index.iife.js",
|
|
44
|
+
"types": "./dist/index.d.ts",
|
|
33
45
|
"files": [
|
|
34
46
|
"dist"
|
|
35
47
|
],
|
|
36
48
|
"dependencies": {
|
|
37
|
-
"@
|
|
38
|
-
"
|
|
49
|
+
"@composio/json-schema-to-zod": "^0.1.17",
|
|
50
|
+
"zod": "^3.25.76",
|
|
51
|
+
"@mcp-b/transports": "1.0.3",
|
|
52
|
+
"@mcp-b/webmcp-ts-sdk": "1.0.1"
|
|
39
53
|
},
|
|
40
54
|
"devDependencies": {
|
|
41
55
|
"@types/node": "^22.15.21",
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"vite-plugin-monkey": "^6.0.1"
|
|
56
|
+
"tsdown": "^0.15.10",
|
|
57
|
+
"typescript": "^5.8.3"
|
|
45
58
|
},
|
|
46
59
|
"engines": {
|
|
47
60
|
"node": ">=18"
|
|
@@ -51,12 +64,11 @@
|
|
|
51
64
|
"registry": "https://registry.npmjs.org/"
|
|
52
65
|
},
|
|
53
66
|
"scripts": {
|
|
54
|
-
"build": "
|
|
67
|
+
"build": "tsdown",
|
|
55
68
|
"check": "biome check --write .",
|
|
56
69
|
"clean": "rm -rf dist .turbo",
|
|
57
70
|
"format": "biome format --write .",
|
|
58
71
|
"lint": "biome lint --write .",
|
|
59
|
-
"preview": "vite preview",
|
|
60
72
|
"publish:dry": "pnpm publish --access public --dry-run",
|
|
61
73
|
"publish:npm": "pnpm publish --access public",
|
|
62
74
|
"typecheck": "tsc --noEmit",
|