@papicandela/mcx-cli 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/commands/run.ts","../src/commands/serve.ts","../../core/dist/index.js","../src/commands/list.ts","../src/commands/gen.ts"],"sourcesContent":["import { Command } from \"commander\";\r\nimport pc from \"picocolors\";\r\nimport * as path from \"path\";\r\nimport { initCommand } from \"./commands/init.js\";\r\nimport { runCommand } from \"./commands/run.js\";\r\nimport { serveCommand } from \"./commands/serve.js\";\r\nimport { listCommand } from \"./commands/list.js\";\r\nimport { genCommand } from \"./commands/gen.js\";\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name(\"mcx\")\r\n .description(\"MCX - Modular Code Execution framework for AI agents\")\r\n .version(\"0.1.0\");\r\n\r\nprogram\r\n .command(\"init\")\r\n .description(\"Initialize a new MCX project in the current directory\")\r\n .action(async () => {\r\n try {\r\n await initCommand();\r\n } catch (error) {\r\n console.error(pc.red(\"Init failed:\"), error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command(\"run <target>\")\r\n .description(\"Run a script file or skill\")\r\n .argument(\"[args...]\", \"Arguments to pass to the skill (key=value format)\")\r\n .action(async (target: string, args: string[]) => {\r\n try {\r\n await runCommand(target, args);\r\n } catch (error) {\r\n console.error(pc.red(\"Run failed:\"), error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command(\"serve\")\r\n .description(\"Start the MCP server for Claude Code integration\")\r\n .option(\"-t, --transport <type>\", \"Transport type: stdio (default) or http\", \"stdio\")\r\n .option(\"-p, --port <number>\", \"HTTP port (only for http transport)\", \"3100\")\r\n .option(\"-c, --cwd <path>\", \"Working directory for config and adapters\")\r\n .action(async (options: { transport: string; port: string; cwd?: string }) => {\r\n try {\r\n await serveCommand({\r\n transport: options.transport as \"stdio\" | \"http\",\r\n port: parseInt(options.port, 10),\r\n cwd: options.cwd,\r\n });\r\n } catch (error) {\r\n console.error(pc.red(\"Serve failed:\"), error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command(\"list\")\r\n .alias(\"ls\")\r\n .description(\"List available skills and adapters\")\r\n .action(async () => {\r\n try {\r\n await listCommand();\r\n } catch (error) {\r\n console.error(pc.red(\"List failed:\"), error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command(\"gen\")\r\n .alias(\"generate-adapter\")\r\n .description(\"Generate adapter from OpenAPI specs in Markdown files\")\r\n .argument(\"<source>\", \"Source directory or file with markdown docs\")\r\n .option(\"-o, --output <path>\", \"Output file path (default: stdout)\")\r\n .option(\"-n, --name <name>\", \"Adapter name (default: directory name)\")\r\n .option(\"-b, --base-url <url>\", \"Base URL for the API\")\r\n .option(\"-m, --methods <list>\", \"Methods to include: get,post,put,delete (default: all)\")\r\n .option(\"--read-only\", \"Only generate GET methods\")\r\n .option(\"-a, --auth <type>\", \"Auth type: basic, bearer, apikey, none (default: basic)\")\r\n .action(async (source: string, options: { output?: string; name?: string; baseUrl?: string; methods?: string; readOnly?: boolean; auth?: string }) => {\r\n try {\r\n // Default name from source directory\r\n const name = options.name || path.basename(source).replace(/[^a-zA-Z0-9]/g, '_');\r\n await genCommand({\r\n source,\r\n output: options.output || `./adapters/${name}.ts`,\r\n name,\r\n baseUrl: options.baseUrl,\r\n });\r\n } catch (error) {\r\n console.error(pc.red(\"Gen failed:\"), error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram.parse();\r\n","import { mkdir, writeFile, access } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport pc from \"picocolors\";\r\n\r\nconst CONFIG_TEMPLATE = `import { defineConfig } from \"@mcx/core\";\r\n\r\nexport default defineConfig({\r\n // Sandbox configuration\r\n sandbox: {\r\n timeout: 30000,\r\n maxMemory: 256,\r\n },\r\n\r\n // Available adapters\r\n adapters: {\r\n // Add your adapters here\r\n // example: \"./adapters/example.ts\",\r\n },\r\n\r\n // Skill directories\r\n skills: [\"./skills\"],\r\n});\r\n`;\r\n\r\nconst EXAMPLE_SKILL = `import { defineSkill } from \"@mcx/core\";\r\n\r\nexport default defineSkill({\r\n name: \"hello\",\r\n description: \"A simple hello world skill\",\r\n\r\n inputs: {\r\n name: {\r\n type: \"string\",\r\n description: \"Name to greet\",\r\n default: \"World\",\r\n },\r\n },\r\n\r\n async run({ inputs }) {\r\n return \\`Hello, \\${inputs.name}!\\`;\r\n },\r\n});\r\n`;\r\n\r\nconst EXAMPLE_ADAPTER = `import { defineAdapter } from \"@mcx/core\";\r\n\r\nexport default defineAdapter({\r\n name: \"example\",\r\n description: \"An example adapter\",\r\n\r\n tools: {\r\n greet: {\r\n description: \"Greet someone\",\r\n parameters: {\r\n name: { type: \"string\", description: \"Name to greet\" },\r\n },\r\n async execute({ name }) {\r\n return \\`Hello, \\${name}!\\`;\r\n },\r\n },\r\n },\r\n});\r\n`;\r\n\r\nasync function exists(path: string): Promise<boolean> {\r\n try {\r\n await access(path);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport async function initCommand(): Promise<void> {\r\n const cwd = process.cwd();\r\n\r\n console.log(pc.cyan(\"Initializing MCX project...\\n\"));\r\n\r\n // Create mcx.config.ts\r\n const configPath = join(cwd, \"mcx.config.ts\");\r\n if (await exists(configPath)) {\r\n console.log(pc.yellow(\" mcx.config.ts already exists, skipping\"));\r\n } else {\r\n await writeFile(configPath, CONFIG_TEMPLATE);\r\n console.log(pc.green(\" Created mcx.config.ts\"));\r\n }\r\n\r\n // Create skills directory\r\n const skillsDir = join(cwd, \"skills\");\r\n if (await exists(skillsDir)) {\r\n console.log(pc.yellow(\" skills/ already exists, skipping\"));\r\n } else {\r\n await mkdir(skillsDir, { recursive: true });\r\n await writeFile(join(skillsDir, \"hello.ts\"), EXAMPLE_SKILL);\r\n console.log(pc.green(\" Created skills/ with example skill\"));\r\n }\r\n\r\n // Create adapters directory\r\n const adaptersDir = join(cwd, \"adapters\");\r\n if (await exists(adaptersDir)) {\r\n console.log(pc.yellow(\" adapters/ already exists, skipping\"));\r\n } else {\r\n await mkdir(adaptersDir, { recursive: true });\r\n await writeFile(join(adaptersDir, \"example.ts\"), EXAMPLE_ADAPTER);\r\n console.log(pc.green(\" Created adapters/ with example adapter\"));\r\n }\r\n\r\n console.log(pc.cyan(\"\\nMCX project initialized!\"));\r\n console.log(pc.dim(\"\\nNext steps:\"));\r\n console.log(pc.dim(\" 1. Edit mcx.config.ts to configure your project\"));\r\n console.log(pc.dim(\" 2. Add skills in the skills/ directory\"));\r\n console.log(pc.dim(\" 3. Run 'mcx serve' to start the MCP server\"));\r\n}\r\n","import { readFile, access } from \"node:fs/promises\";\r\nimport { join, extname, resolve } from \"node:path\";\r\nimport pc from \"picocolors\";\r\n\r\nasync function exists(path: string): Promise<boolean> {\r\n try {\r\n await access(path);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function loadConfig(): Promise<Record<string, unknown> | null> {\r\n const cwd = process.cwd();\r\n const configPath = join(cwd, \"mcx.config.ts\");\r\n\r\n if (!(await exists(configPath))) {\r\n return null;\r\n }\r\n\r\n try {\r\n // Dynamic import for the config\r\n const configModule = await import(`file://${configPath}`);\r\n return configModule.default || configModule;\r\n } catch (error) {\r\n console.error(pc.red(\"Failed to load mcx.config.ts:\"), error);\r\n return null;\r\n }\r\n}\r\n\r\nasync function runScript(scriptPath: string): Promise<void> {\r\n const absolutePath = resolve(process.cwd(), scriptPath);\r\n\r\n if (!(await exists(absolutePath))) {\r\n console.error(pc.red(`Script not found: ${scriptPath}`));\r\n process.exit(1);\r\n }\r\n\r\n console.log(pc.cyan(`Running script: ${scriptPath}\\n`));\r\n\r\n try {\r\n // Dynamic import and execute\r\n const scriptModule = await import(`file://${absolutePath}`);\r\n\r\n if (typeof scriptModule.default === \"function\") {\r\n const result = await scriptModule.default();\r\n if (result !== undefined) {\r\n console.log(pc.green(\"\\nResult:\"), result);\r\n }\r\n } else if (typeof scriptModule.run === \"function\") {\r\n const result = await scriptModule.run();\r\n if (result !== undefined) {\r\n console.log(pc.green(\"\\nResult:\"), result);\r\n }\r\n } else {\r\n console.log(pc.yellow(\"Script loaded but no default export or run function found\"));\r\n }\r\n } catch (error) {\r\n console.error(pc.red(\"Script execution failed:\"), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function runSkill(skillName: string, args: string[]): Promise<void> {\r\n const cwd = process.cwd();\r\n const skillsDir = join(cwd, \"skills\");\r\n\r\n // Try to find the skill file\r\n const possiblePaths = [\r\n join(skillsDir, `${skillName}.ts`),\r\n join(skillsDir, `${skillName}.js`),\r\n join(skillsDir, skillName, \"index.ts\"),\r\n join(skillsDir, skillName, \"index.js\"),\r\n ];\r\n\r\n let skillPath: string | null = null;\r\n for (const path of possiblePaths) {\r\n if (await exists(path)) {\r\n skillPath = path;\r\n break;\r\n }\r\n }\r\n\r\n if (!skillPath) {\r\n console.error(pc.red(`Skill not found: ${skillName}`));\r\n console.log(pc.dim(`Searched in: ${skillsDir}`));\r\n process.exit(1);\r\n }\r\n\r\n console.log(pc.cyan(`Running skill: ${skillName}\\n`));\r\n\r\n try {\r\n const skillModule = await import(`file://${skillPath}`);\r\n const skill = skillModule.default || skillModule;\r\n\r\n if (!skill || typeof skill.run !== \"function\") {\r\n console.error(pc.red(\"Invalid skill: missing run function\"));\r\n process.exit(1);\r\n }\r\n\r\n // Parse args into inputs\r\n const inputs: Record<string, string> = {};\r\n for (const arg of args) {\r\n const [key, value] = arg.split(\"=\");\r\n if (key && value !== undefined) {\r\n inputs[key] = value;\r\n }\r\n }\r\n\r\n const result = await skill.run({ inputs });\r\n if (result !== undefined) {\r\n console.log(pc.green(\"\\nResult:\"), result);\r\n }\r\n } catch (error) {\r\n console.error(pc.red(\"Skill execution failed:\"), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport async function runCommand(target: string, args: string[]): Promise<void> {\r\n const ext = extname(target);\r\n\r\n // If it looks like a file path, run as script\r\n if (ext === \".ts\" || ext === \".js\" || target.includes(\"/\") || target.includes(\"\\\\\")) {\r\n await runScript(target);\r\n } else {\r\n // Otherwise, treat as skill name\r\n await runSkill(target, args);\r\n }\r\n}\r\n","import { readdir, access, readFile } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\r\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\r\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\r\nimport { z } from \"zod\";\r\nimport pc from \"picocolors\";\r\nimport { IsolatedVMSandbox } from \"@mcx/core\";\r\nimport { createJiti } from \"jiti\";\r\nimport express from \"express\";\r\n\r\n/**\r\n * Load environment variables from .env file in cwd\r\n */\r\nasync function loadEnvFile(): Promise<void> {\r\n const envPath = join(process.cwd(), \".env\");\r\n try {\r\n const content = await readFile(envPath, \"utf-8\");\r\n for (const line of content.split(\"\\n\")) {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\r\n const eqIndex = trimmed.indexOf(\"=\");\r\n if (eqIndex > 0) {\r\n const key = trimmed.substring(0, eqIndex).trim();\r\n const value = trimmed.substring(eqIndex + 1).trim();\r\n if (!process.env[key]) {\r\n process.env[key] = value;\r\n }\r\n }\r\n }\r\n } catch {\r\n // .env file doesn't exist - that's fine\r\n }\r\n}\r\n\r\nconst jiti = createJiti(import.meta.url);\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\ninterface Skill {\r\n name: string;\r\n description?: string;\r\n inputs?: Record<string, { type: string; description?: string; default?: unknown }>;\r\n run: (ctx: { inputs: Record<string, unknown> }) => Promise<unknown>;\r\n}\r\n\r\ninterface AdapterMethod {\r\n description: string;\r\n execute: (params: unknown) => Promise<unknown>;\r\n}\r\n\r\ninterface Adapter {\r\n name: string;\r\n description?: string;\r\n tools: Record<string, AdapterMethod>;\r\n}\r\n\r\ninterface MCXConfig {\r\n adapters?: Adapter[];\r\n sandbox?: {\r\n timeout?: number;\r\n memoryLimit?: number;\r\n };\r\n env?: Record<string, string | undefined>;\r\n}\r\n\r\n// ============================================================================\r\n// Zod Schemas for Tool Inputs\r\n// ============================================================================\r\n\r\nconst ExecuteInputSchema = z.object({\r\n code: z.string()\r\n .min(1, \"Code cannot be empty\")\r\n .describe(\"JavaScript/TypeScript code to execute in the sandbox\"),\r\n}).strict();\r\n\r\nconst RunSkillInputSchema = z.object({\r\n skill: z.string()\r\n .min(1, \"Skill name is required\")\r\n .describe(\"The name of the skill to run\"),\r\n inputs: z.record(z.unknown())\r\n .optional()\r\n .default({})\r\n .describe(\"Input parameters for the skill\"),\r\n}).strict();\r\n\r\nconst ListInputSchema = z.object({}).strict();\r\n\r\ntype ExecuteInput = z.infer<typeof ExecuteInputSchema>;\r\ntype RunSkillInput = z.infer<typeof RunSkillInputSchema>;\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Summarize large results to avoid flooding context.\r\n * Per Anthropic's code execution article: filter/transform in execution env,\r\n * only return what the model needs to see.\r\n */\r\nconst MAX_ARRAY_ITEMS = 5;\r\nconst MAX_RESULT_CHARS = 2000;\r\n\r\ninterface SummarizedResult {\r\n value: unknown;\r\n truncated: boolean;\r\n originalSize?: string;\r\n}\r\n\r\nfunction summarizeResult(value: unknown): SummarizedResult {\r\n if (value === undefined || value === null) {\r\n return { value, truncated: false };\r\n }\r\n\r\n // Handle arrays - truncate to MAX_ARRAY_ITEMS\r\n if (Array.isArray(value)) {\r\n if (value.length > MAX_ARRAY_ITEMS) {\r\n const truncated = value.slice(0, MAX_ARRAY_ITEMS).map(item => summarizeObject(item));\r\n return {\r\n value: truncated,\r\n truncated: true,\r\n originalSize: `${value.length} items, showing first ${MAX_ARRAY_ITEMS}`,\r\n };\r\n }\r\n return { value: value.map(item => summarizeObject(item)), truncated: false };\r\n }\r\n\r\n // Handle objects - summarize nested data\r\n if (typeof value === \"object\") {\r\n return { value: summarizeObject(value), truncated: false };\r\n }\r\n\r\n // Primitives pass through\r\n return { value, truncated: false };\r\n}\r\n\r\nfunction summarizeObject(obj: unknown): unknown {\r\n if (obj === null || obj === undefined) return obj;\r\n if (typeof obj !== \"object\") return obj;\r\n if (Array.isArray(obj)) {\r\n if (obj.length > MAX_ARRAY_ITEMS) {\r\n return [...obj.slice(0, 3).map(summarizeObject), `... +${obj.length - 3} more`];\r\n }\r\n return obj.map(summarizeObject);\r\n }\r\n\r\n // For objects, keep only top-level keys and summarize nested arrays\r\n const result: Record<string, unknown> = {};\r\n for (const [key, val] of Object.entries(obj as Record<string, unknown>)) {\r\n if (Array.isArray(val) && val.length > 3) {\r\n result[key] = [`(${val.length} items)`];\r\n } else if (typeof val === \"object\" && val !== null) {\r\n // Keep first-level objects but summarize deeply nested ones\r\n const nested = val as Record<string, unknown>;\r\n const keys = Object.keys(nested);\r\n if (keys.length > 5) {\r\n result[key] = { _summary: `{${keys.slice(0, 3).join(\", \")}, ... +${keys.length - 3} keys}` };\r\n } else {\r\n result[key] = summarizeObject(val);\r\n }\r\n } else {\r\n result[key] = val;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nasync function exists(path: string): Promise<boolean> {\r\n try {\r\n await access(path);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function loadConfig(): Promise<MCXConfig | null> {\r\n const cwd = process.cwd();\r\n const configPath = join(cwd, \"mcx.config.ts\");\r\n\r\n if (!(await exists(configPath))) {\r\n return null;\r\n }\r\n\r\n try {\r\n console.error(pc.dim(`Loading config from: ${configPath}`));\r\n const configModule = await jiti.import(configPath);\r\n const config = (configModule as { default?: MCXConfig }).default || configModule as MCXConfig;\r\n const adapterCount = config?.adapters?.length || 0;\r\n console.error(pc.dim(`Config loaded: ${adapterCount} adapters`));\r\n\r\n // Debug to file\r\n const fs = await import(\"node:fs\");\r\n fs.appendFileSync(\"D:/Claude/mcx-debug.log\", `Config path: ${configPath}\\nAdapters: ${adapterCount}\\n`);\r\n\r\n return config;\r\n } catch (error) {\r\n // Debug error to file\r\n const fs = await import(\"node:fs\");\r\n fs.appendFileSync(\"D:/Claude/mcx-debug.log\", `Config error: ${error}\\n`);\r\n console.error(pc.yellow(\"Warning: Failed to load mcx.config.ts:\"), error);\r\n return null;\r\n }\r\n}\r\n\r\nasync function loadSkills(): Promise<Map<string, Skill>> {\r\n const skills = new Map<string, Skill>();\r\n const cwd = process.cwd();\r\n const skillsDir = join(cwd, \"skills\");\r\n\r\n if (!(await exists(skillsDir))) {\r\n return skills;\r\n }\r\n\r\n try {\r\n const entries = await readdir(skillsDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n let skillPath: string | null = null;\r\n\r\n if (entry.isFile() && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".js\"))) {\r\n skillPath = join(skillsDir, entry.name);\r\n } else if (entry.isDirectory()) {\r\n const indexTs = join(skillsDir, entry.name, \"index.ts\");\r\n const indexJs = join(skillsDir, entry.name, \"index.js\");\r\n if (await exists(indexTs)) {\r\n skillPath = indexTs;\r\n } else if (await exists(indexJs)) {\r\n skillPath = indexJs;\r\n }\r\n }\r\n\r\n if (skillPath) {\r\n try {\r\n const skillModule = await jiti.import(skillPath) as { default?: Skill } | Skill;\r\n const skill = (skillModule as { default?: Skill }).default || skillModule as Skill;\r\n\r\n if (skill && typeof skill.run === \"function\") {\r\n const skillName = skill.name || entry.name.replace(/\\.(ts|js)$/, \"\");\r\n skills.set(skillName, skill);\r\n }\r\n } catch (error) {\r\n console.error(pc.yellow(`Warning: Failed to load skill from ${skillPath}:`), error);\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.error(pc.yellow(\"Warning: Failed to read skills directory:\"), error);\r\n }\r\n\r\n return skills;\r\n}\r\n\r\nfunction buildAdapterContext(adapters: Adapter[]): Record<string, Record<string, (params: unknown) => Promise<unknown>>> {\r\n const ctx: Record<string, Record<string, (params: unknown) => Promise<unknown>>> = {};\r\n\r\n for (const adapter of adapters) {\r\n ctx[adapter.name] = {};\r\n for (const [methodName, method] of Object.entries(adapter.tools)) {\r\n ctx[adapter.name][methodName] = method.execute;\r\n }\r\n }\r\n\r\n return ctx;\r\n}\r\n\r\n// ============================================================================\r\n// Server Factory\r\n// ============================================================================\r\n\r\ninterface McxConfig {\r\n sandbox?: { timeout?: number; memoryLimit?: number };\r\n adapters?: Adapter[];\r\n env?: Record<string, string>;\r\n}\r\n\r\nasync function createMcxServerWithDeps(\r\n config: McxConfig | null,\r\n adapters: Adapter[],\r\n skills: Map<string, Skill>\r\n) {\r\n return createMcxServerCore(config, adapters, skills);\r\n}\r\n\r\nasync function createMcxServer() {\r\n // Load configuration\r\n const config = await loadConfig();\r\n const adapters = config?.adapters || [];\r\n const skills = await loadSkills();\r\n\r\n console.error(pc.dim(`Loaded ${adapters.length} adapter(s), ${skills.size} skill(s)`));\r\n return createMcxServerCore(config, adapters, skills);\r\n}\r\n\r\nasync function createMcxServerCore(\r\n config: McxConfig | null,\r\n adapters: Adapter[],\r\n skills: Map<string, Skill>\r\n) {\r\n\r\n // Initialize sandbox\r\n const sandbox = new IsolatedVMSandbox({\r\n timeout: config?.sandbox?.timeout ?? 30000,\r\n memoryLimit: config?.sandbox?.memoryLimit ?? 128,\r\n allowAsync: true,\r\n });\r\n\r\n // Build adapter context for sandbox\r\n const adapterContext = buildAdapterContext(adapters);\r\n\r\n // Build dynamic descriptions\r\n const adapterNames = adapters.map((a) => a.name).join(\", \") || \"none\";\r\n const skillNames = Array.from(skills.keys()).join(\", \") || \"none\";\r\n const adapterList = adapters.map(a => `- ${a.name}: ${Object.keys(a.tools).join(\", \")}`).join(\"\\n\") || \"No adapters loaded\";\r\n const skillList = Array.from(skills.entries())\r\n .map(([name, skill]) => `- ${name}: ${skill.description || \"No description\"}`)\r\n .join(\"\\n\") || \"No skills loaded\";\r\n\r\n // Create MCP server with modern API\r\n const server = new McpServer({\r\n name: \"mcx-mcp-server\",\r\n version: \"0.1.0\",\r\n });\r\n\r\n // ============================================================================\r\n // Tool: mcx_execute\r\n // ============================================================================\r\n server.registerTool(\r\n \"mcx_execute\",\r\n {\r\n title: \"Execute Code in MCX Sandbox\",\r\n description: `Execute JavaScript/TypeScript code in an isolated sandbox with access to registered adapters.\r\n\r\nAvailable adapters: [${adapterNames}]\r\n${adapterList}\r\n\r\nIMPORTANT: Always filter/transform data before returning to minimize context usage.\r\n\r\nBuilt-in helpers:\r\n- pick(arr, ['id', 'name', 'total']) - Extract specific fields\r\n- first(arr, 5) - First N items only\r\n- count(arr, 'status') - Count by field value\r\n- sum(arr, 'total') - Sum numeric field\r\n- table(arr) - Format as markdown table (for logs)\r\n\r\nArgs:\r\n - code (string): JavaScript/TypeScript code to execute\r\n\r\nReturns:\r\n - result: The return value of the code execution\r\n - logs: Console output captured during execution\r\n\r\nExamples:\r\n - \"List records (filtered)\":\r\n const data = await api.getRecords({ limit: 10 });\r\n return pick(data, ['id', 'name', 'status']);\r\n\r\n - \"Summarize data\":\r\n const data = await api.getRecords({ limit: 100 });\r\n return { count: data.length, total: sum(data, 'amount'), byStatus: count(data, 'status') };\r\n\r\n - \"Debug with table\":\r\n const data = await api.getRecords({ limit: 5 });\r\n console.log(table(pick(data, ['id', 'name', 'amount'])));\r\n return { count: data.length };\r\n\r\nError Handling:\r\n - Timeout errors if code runs longer than ${config?.sandbox?.timeout ?? 30000}ms\r\n - Syntax errors are reported with line numbers`,\r\n inputSchema: ExecuteInputSchema,\r\n annotations: {\r\n readOnlyHint: false,\r\n destructiveHint: false,\r\n idempotentHint: false,\r\n openWorldHint: true,\r\n },\r\n },\r\n async (params: ExecuteInput) => {\r\n try {\r\n const result = await sandbox.execute(params.code, {\r\n adapters: adapterContext,\r\n env: config?.env || {},\r\n });\r\n\r\n if (!result.success) {\r\n const errorMsg = result.error\r\n ? `${result.error.name}: ${result.error.message}`\r\n : \"Unknown error\";\r\n return {\r\n content: [{\r\n type: \"text\" as const,\r\n text: `Execution error: ${errorMsg}\\n\\nLogs:\\n${result.logs.join(\"\\n\")}`,\r\n }],\r\n isError: true,\r\n };\r\n }\r\n\r\n // Smart result handling per Anthropic's code execution article:\r\n // - Logs are primary output (what the code explicitly wants to show)\r\n // - Return value is summarized if large\r\n const summarizedResult = summarizeResult(result.value);\r\n\r\n const output = {\r\n result: summarizedResult.value,\r\n logs: result.logs,\r\n executionTime: result.executionTime,\r\n truncated: summarizedResult.truncated,\r\n };\r\n\r\n const textOutput = [\r\n result.logs.length > 0 ? `Logs:\\n${result.logs.join(\"\\n\")}\\n` : \"\",\r\n summarizedResult.truncated\r\n ? `Result (truncated, ${summarizedResult.originalSize}):\\n${JSON.stringify(summarizedResult.value, null, 2)}`\r\n : result.value !== undefined\r\n ? `Result:\\n${JSON.stringify(result.value, null, 2)}`\r\n : \"Code executed successfully (no return value)\",\r\n ].filter(Boolean).join(\"\\n\");\r\n\r\n return {\r\n content: [{ type: \"text\" as const, text: textOutput }],\r\n structuredContent: output,\r\n };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n return {\r\n content: [{\r\n type: \"text\" as const,\r\n text: `Sandbox error: ${message}. Try checking your code syntax or reducing complexity.`,\r\n }],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // Tool: mcx_run_skill\r\n // ============================================================================\r\n server.registerTool(\r\n \"mcx_run_skill\",\r\n {\r\n title: \"Run MCX Skill\",\r\n description: `Run a registered MCX skill by name.\r\n\r\nAvailable skills: [${skillNames}]\r\n${skillList}\r\n\r\nSkills are pre-defined operations that combine adapter calls into reusable workflows.\r\n\r\nArgs:\r\n - skill (string): The skill name to run\r\n - inputs (object): Input parameters for the skill (optional)\r\n\r\nReturns:\r\n - The skill's return value\r\n\r\nExamples:\r\n - Run sync check: skill = \"sync-check\"\r\n - Run report: skill = \"overdue-report\", inputs = { days: 30 }\r\n\r\nError Handling:\r\n - Returns error if skill not found (check available skills above)\r\n - Skill-specific errors are propagated with details`,\r\n inputSchema: RunSkillInputSchema,\r\n annotations: {\r\n readOnlyHint: false,\r\n destructiveHint: false,\r\n idempotentHint: false,\r\n openWorldHint: true,\r\n },\r\n },\r\n async (params: RunSkillInput) => {\r\n const skill = skills.get(params.skill);\r\n\r\n if (!skill) {\r\n const available = Array.from(skills.keys()).join(\", \") || \"none\";\r\n return {\r\n content: [{\r\n type: \"text\" as const,\r\n text: `Error: Skill '${params.skill}' not found.\\n\\nAvailable skills: ${available}\\n\\nTip: Use mcx_list to see all available skills with descriptions.`,\r\n }],\r\n isError: true,\r\n };\r\n }\r\n\r\n try {\r\n const result = await skill.run({ inputs: params.inputs, ...adapterContext });\r\n\r\n return {\r\n content: [{\r\n type: \"text\" as const,\r\n text: result !== undefined\r\n ? JSON.stringify(result, null, 2)\r\n : \"Skill executed successfully\",\r\n }],\r\n structuredContent: { result },\r\n };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n return {\r\n content: [{\r\n type: \"text\" as const,\r\n text: `Skill '${params.skill}' error: ${message}`,\r\n }],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // Tool: mcx_list\r\n // ============================================================================\r\n server.registerTool(\r\n \"mcx_list\",\r\n {\r\n title: \"List MCX Adapters and Skills\",\r\n description: `List all available MCX adapters and skills with their methods and descriptions.\r\n\r\nUse this tool to discover what capabilities are available before using mcx_execute or mcx_run_skill.\r\n\r\nReturns:\r\n - adapters: List of adapters with their methods\r\n - skills: List of skills with descriptions`,\r\n inputSchema: ListInputSchema,\r\n annotations: {\r\n readOnlyHint: true,\r\n destructiveHint: false,\r\n idempotentHint: true,\r\n openWorldHint: false,\r\n },\r\n },\r\n async () => {\r\n const adapterListData = adapters.map((a) => ({\r\n name: a.name,\r\n description: a.description || \"No description\",\r\n methods: Object.keys(a.tools),\r\n }));\r\n\r\n const skillListData = Array.from(skills.entries()).map(([name, skill]) => ({\r\n name,\r\n description: skill.description || \"No description\",\r\n inputs: skill.inputs,\r\n }));\r\n\r\n const output = { adapters: adapterListData, skills: skillListData };\r\n\r\n return {\r\n content: [{\r\n type: \"text\" as const,\r\n text: JSON.stringify(output, null, 2),\r\n }],\r\n structuredContent: output,\r\n };\r\n }\r\n );\r\n\r\n return server;\r\n}\r\n\r\n// ============================================================================\r\n// Transport: stdio (for Claude Code)\r\n// ============================================================================\r\n\r\nasync function runStdio() {\r\n // Write debug to file since Claude Code doesn't show stderr\r\n const fs = await import(\"node:fs\");\r\n fs.writeFileSync(\"D:/Claude/mcx-debug.log\", `[${new Date().toISOString()}] MCX Starting\\nArgs: ${process.argv.join(' ')}\\nCWD: ${process.cwd()}\\n`);\r\n\r\n console.error(pc.dim(`[MCX] Working directory: ${process.cwd()}`));\r\n await loadEnvFile();\r\n console.error(pc.cyan(\"Starting MCX MCP server (stdio)...\\n\"));\r\n\r\n const server = await createMcxServer();\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n\r\n console.error(pc.green(\"MCX MCP server running\"));\r\n console.error(pc.dim(\"Tools: mcx_execute, mcx_run_skill, mcx_list\"));\r\n console.error(pc.dim(\"Waiting for connections via stdio...\"));\r\n}\r\n\r\n// ============================================================================\r\n// Transport: HTTP (for web apps / chatbot)\r\n// ============================================================================\r\n\r\nasync function runHttp(port: number) {\r\n await loadEnvFile();\r\n console.error(pc.cyan(`Starting MCX MCP server (HTTP on port ${port})...\\n`));\r\n\r\n // Pre-load config and skills once at startup\r\n const config = await loadConfig();\r\n const skills = await loadSkills();\r\n const adapters = config?.adapters || [];\r\n console.error(pc.dim(`Loaded ${adapters.length} adapter(s), ${skills.size} skill(s)`));\r\n\r\n const app = express();\r\n app.use(express.json());\r\n\r\n // MCP endpoint - create fresh server and transport per request (stateless mode)\r\n app.post(\"/mcp\", async (req, res) => {\r\n\r\n // Create a fresh MCP server for this request\r\n const server = await createMcxServerWithDeps(config, adapters, skills);\r\n\r\n const transport = new StreamableHTTPServerTransport({\r\n sessionIdGenerator: undefined,\r\n enableJsonResponse: true,\r\n });\r\n\r\n res.on(\"close\", () => {\r\n transport.close();\r\n });\r\n\r\n await server.connect(transport);\r\n await transport.handleRequest(req, res, req.body);\r\n });\r\n\r\n // Health check\r\n app.get(\"/health\", (_req, res) => {\r\n res.json({ status: \"ok\", server: \"mcx-mcp-server\", version: \"0.1.0\" });\r\n });\r\n\r\n app.listen(port, \"127.0.0.1\", () => {\r\n console.error(pc.green(`MCX MCP server running on http://127.0.0.1:${port}/mcp`));\r\n console.error(pc.dim(\"Tools: mcx_execute, mcx_run_skill, mcx_list\"));\r\n console.error(pc.dim(\"Health check: GET /health\"));\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Main Export\r\n// ============================================================================\r\n\r\nexport interface ServeOptions {\r\n transport?: \"stdio\" | \"http\";\r\n port?: number;\r\n cwd?: string;\r\n}\r\n\r\nexport async function serveCommand(options: ServeOptions = {}): Promise<void> {\r\n // Change working directory if specified\r\n if (options.cwd) {\r\n process.chdir(options.cwd);\r\n }\r\n const transport = options.transport || \"stdio\";\r\n const port = options.port || 3100;\r\n\r\n if (transport === \"http\") {\r\n await runHttp(port);\r\n } else {\r\n await runStdio();\r\n }\r\n}\r\n","// src/sandbox/vm2.ts\nimport ivm from \"isolated-vm\";\nimport { performance as performance2 } from \"perf_hooks\";\nvar DEFAULT_CONFIG = {\n timeout: 5e3,\n memoryLimit: 128,\n allowAsync: true,\n globals: {}\n};\nvar IsolatedVMSandbox = class {\n config;\n isolate = null;\n constructor(config) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n /**\n * Get the current sandbox configuration.\n */\n getConfig() {\n return { ...this.config };\n }\n /**\n * Update sandbox configuration.\n */\n configure(config) {\n this.config = { ...this.config, ...config };\n this.disposeIsolate();\n }\n /**\n * Execute code within the isolated VM sandbox.\n */\n async execute(code, context) {\n const startTime = performance2.now();\n const logs = [];\n try {\n this.isolate = new ivm.Isolate({\n memoryLimit: this.config.memoryLimit\n });\n const isolateContext = await this.isolate.createContext();\n const jail = isolateContext.global;\n await jail.set(\"global\", jail.derefInto());\n const logCallback = new ivm.Reference((message) => {\n logs.push(message);\n });\n await jail.set(\"__logCallback\", logCallback);\n const consoleSetupCode = `\n const console = {\n log: (...args) => __logCallback.apply(undefined, [args.map(a => {\n try {\n return typeof a === 'object' ? JSON.stringify(a) : String(a);\n } catch {\n return String(a);\n }\n }).join(' ')]),\n warn: (...args) => __logCallback.apply(undefined, ['[WARN] ' + args.map(a => {\n try {\n return typeof a === 'object' ? JSON.stringify(a) : String(a);\n } catch {\n return String(a);\n }\n }).join(' ')]),\n error: (...args) => __logCallback.apply(undefined, ['[ERROR] ' + args.map(a => {\n try {\n return typeof a === 'object' ? JSON.stringify(a) : String(a);\n } catch {\n return String(a);\n }\n }).join(' ')]),\n info: (...args) => __logCallback.apply(undefined, ['[INFO] ' + args.map(a => {\n try {\n return typeof a === 'object' ? JSON.stringify(a) : String(a);\n } catch {\n return String(a);\n }\n }).join(' ')]),\n };\n global.console = console;\n\n // ============================================================\n // MCX Helper Utilities - For filtering data before returning\n // Per Anthropic's code execution article: transform in sandbox\n // ============================================================\n\n /**\n * Pick specific fields from array of objects\n * Usage: pick(invoices, ['id', 'client.name', 'total', 'status'])\n */\n global.pick = (arr, fields) => {\n if (!Array.isArray(arr)) return arr;\n return arr.map(item => {\n const result = {};\n for (const field of fields) {\n const parts = field.split('.');\n let value = item;\n let key = parts[parts.length - 1];\n for (const part of parts) {\n value = value?.[part];\n }\n result[key] = value;\n }\n return result;\n });\n };\n\n /**\n * Format array as markdown table (for logs)\n * Usage: console.log(table(data))\n */\n global.table = (arr, maxRows = 10) => {\n if (!Array.isArray(arr) || arr.length === 0) return '(empty)';\n const items = arr.slice(0, maxRows);\n const keys = Object.keys(items[0]);\n const header = '| ' + keys.join(' | ') + ' |';\n const sep = '|' + keys.map(() => '---').join('|') + '|';\n const rows = items.map(item =>\n '| ' + keys.map(k => String(item[k] ?? '')).join(' | ') + ' |'\n );\n let result = [header, sep, ...rows].join('\\\\n');\n if (arr.length > maxRows) {\n result += '\\\\n... +' + (arr.length - maxRows) + ' more rows';\n }\n return result;\n };\n\n /**\n * Count/summarize array\n * Usage: count(invoices, 'status') => { open: 5, closed: 10 }\n */\n global.count = (arr, field) => {\n if (!Array.isArray(arr)) return {};\n return arr.reduce((acc, item) => {\n const key = String(item[field] ?? 'unknown');\n acc[key] = (acc[key] || 0) + 1;\n return acc;\n }, {});\n };\n\n /**\n * Sum field values\n * Usage: sum(invoices, 'total') => 15000.50\n */\n global.sum = (arr, field) => {\n if (!Array.isArray(arr)) return 0;\n return arr.reduce((acc, item) => acc + (Number(item[field]) || 0), 0);\n };\n\n /**\n * First N items only\n * Usage: first(invoices, 3)\n */\n global.first = (arr, n = 5) => {\n if (!Array.isArray(arr)) return arr;\n return arr.slice(0, n);\n };\n `;\n const consoleScript = await this.isolate.compileScript(consoleSetupCode);\n await consoleScript.run(isolateContext);\n for (const [key, value2] of Object.entries(this.config.globals)) {\n await jail.set(key, new ivm.ExternalCopy(value2).copyInto());\n }\n if (context.variables) {\n for (const [key, value2] of Object.entries(context.variables)) {\n await jail.set(key, new ivm.ExternalCopy(value2).copyInto());\n }\n }\n await this.injectAdapters(context.adapters, jail, isolateContext);\n const wrappedCode = this.config.allowAsync ? `(async () => {\n const __result = await (async () => { ${code} })();\n return JSON.stringify(__result);\n })()` : `(() => {\n const __result = (() => { ${code} })();\n return JSON.stringify(__result);\n })()`;\n const script = await this.isolate.compileScript(wrappedCode);\n const jsonResult = await script.run(isolateContext, {\n timeout: this.config.timeout,\n promise: this.config.allowAsync\n });\n let value;\n if (jsonResult !== void 0 && jsonResult !== \"undefined\") {\n try {\n value = JSON.parse(jsonResult);\n } catch {\n value = jsonResult;\n }\n }\n const executionTime = performance2.now() - startTime;\n return {\n success: true,\n value,\n logs,\n executionTime\n };\n } catch (err) {\n const executionTime = performance2.now() - startTime;\n const error = err instanceof Error ? err : new Error(String(err));\n return {\n success: false,\n error: {\n name: error.name,\n message: error.message,\n stack: error.stack\n },\n logs,\n executionTime\n };\n } finally {\n this.disposeIsolate();\n }\n }\n /**\n * Inject adapters into the sandbox context.\n */\n async injectAdapters(adapters, jail, isolateContext) {\n for (const [adapterName, methods] of Object.entries(adapters)) {\n for (const [methodName, handlerFn] of Object.entries(methods)) {\n const handler = handlerFn;\n const ref = new ivm.Reference(function(...args) {\n return handler(...args).then((result) => {\n return JSON.stringify(result);\n }).catch((err) => {\n throw err instanceof Error ? err : new Error(String(err));\n });\n });\n await jail.set(`__adapter_${adapterName}_${methodName}`, ref);\n }\n }\n const adapterEntries = Object.entries(adapters);\n if (adapterEntries.length === 0) {\n const emptyAdaptersScript = await this.isolate.compileScript(`global.adapters = {};`);\n await emptyAdaptersScript.run(isolateContext);\n return;\n }\n const adaptersCode = adapterEntries.map(([adapterName, methods]) => {\n const methodEntries = Object.entries(methods);\n const methodsCode = methodEntries.map(([methodName]) => {\n return `${methodName}: async (...args) => {\n const json = await __adapter_${adapterName}_${methodName}.apply(undefined, args, { arguments: { copy: true }, result: { promise: true } });\n return JSON.parse(json);\n }`;\n }).join(\",\\n \");\n return `${adapterName}: {\n ${methodsCode}\n }`;\n }).join(\",\\n \");\n const adapterNames = adapterEntries.map(([name]) => name);\n const directGlobalsCode = adapterNames.map((name) => `global.${name} = global.adapters.${name};`).join(\"\\n \");\n const adaptersSetupCode = `\n global.adapters = {\n ${adaptersCode}\n };\n // Also expose adapters as direct globals for convenience\n ${directGlobalsCode}\n `;\n const adaptersScript = await this.isolate.compileScript(adaptersSetupCode);\n await adaptersScript.run(isolateContext);\n }\n /**\n * Dispose of the current isolate.\n */\n disposeIsolate() {\n if (this.isolate) {\n this.isolate.dispose();\n this.isolate = null;\n }\n }\n /**\n * Dispose of sandbox resources.\n */\n dispose() {\n this.disposeIsolate();\n }\n};\nfunction createSandbox(config) {\n return new IsolatedVMSandbox(config);\n}\n\n// src/adapter.ts\nimport { z } from \"zod\";\nfunction createParameterValidator(params) {\n const shape = {};\n for (const param of params) {\n let schema;\n switch (param.type) {\n case \"string\":\n schema = z.string();\n break;\n case \"number\":\n schema = z.number();\n break;\n case \"boolean\":\n schema = z.boolean();\n break;\n case \"object\":\n schema = z.record(z.unknown());\n break;\n case \"array\":\n schema = z.array(z.unknown());\n break;\n default:\n schema = z.unknown();\n }\n if (param.default !== void 0) {\n schema = schema.default(param.default);\n }\n if (!param.required) {\n schema = schema.optional();\n }\n shape[param.name] = schema;\n }\n return z.object(shape);\n}\nfunction createMethod(config) {\n const parameters = config.parameters ?? [];\n const validator = createParameterValidator(parameters);\n const execute = async (...args) => {\n const paramObj = {};\n parameters.forEach((param, index) => {\n if (index < args.length) {\n paramObj[param.name] = args[index];\n }\n });\n const validatedParams = validator.parse(paramObj);\n const validatedArgs = parameters.map((param) => validatedParams[param.name]);\n return config.handler(...validatedArgs);\n };\n return {\n name: config.name,\n description: config.description,\n parameters,\n execute\n };\n}\nfunction defineAdapter(config, adapterConfig) {\n let validatedConfig;\n if (config.configSchema && adapterConfig !== void 0) {\n validatedConfig = config.configSchema.parse(adapterConfig);\n } else {\n validatedConfig = adapterConfig;\n }\n const methods = /* @__PURE__ */ new Map();\n for (const methodConfig of config.methods) {\n const method = createMethod(methodConfig);\n methods.set(method.name, method);\n }\n return {\n name: config.name,\n description: config.description,\n version: config.version ?? \"1.0.0\",\n methods,\n config: validatedConfig\n };\n}\nfunction createAdapterFactory(config) {\n return (adapterConfig) => defineAdapter(config, adapterConfig);\n}\n\n// src/skill.ts\nvar DEFAULT_SANDBOX_CONFIG = {\n timeout: 5e3,\n memoryLimit: 128,\n allowAsync: true,\n globals: {}\n};\nfunction defineSkill(config) {\n if (!config.name) {\n throw new Error(\"Skill name is required\");\n }\n const hasCode = config.code && config.code.trim() !== \"\";\n const hasRun = typeof config.run === \"function\";\n if (!hasCode && !hasRun) {\n throw new Error(\"Skill must have either 'code' (string) or 'run' (function)\");\n }\n return {\n name: config.name,\n description: config.description,\n version: config.version ?? \"1.0.0\",\n adapters: config.adapters ?? [],\n code: config.code,\n run: config.run,\n sandboxConfig: {\n ...DEFAULT_SANDBOX_CONFIG,\n ...config.sandbox\n }\n };\n}\nfunction defineSkills(configs) {\n return configs.map(defineSkill);\n}\nfunction skillBuilder(name) {\n return new SkillBuilder(name);\n}\nvar SkillBuilder = class {\n config;\n constructor(name) {\n this.config = {\n name,\n code: \"\"\n };\n }\n /**\n * Set the skill description.\n */\n description(description) {\n this.config.description = description;\n return this;\n }\n /**\n * Set the skill version.\n */\n version(version) {\n this.config.version = version;\n return this;\n }\n /**\n * Specify required adapters.\n */\n requires(...adapters) {\n this.config.adapters = adapters;\n return this;\n }\n /**\n * Set the execution timeout in milliseconds.\n */\n timeout(ms) {\n this.config.sandbox = {\n ...this.config.sandbox,\n timeout: ms\n };\n return this;\n }\n /**\n * Set the memory limit in MB.\n */\n memoryLimit(mb) {\n this.config.sandbox = {\n ...this.config.sandbox,\n memoryLimit: mb\n };\n return this;\n }\n /**\n * Set the skill code.\n */\n code(code) {\n this.config.code = code;\n return this;\n }\n /**\n * Set custom sandbox configuration.\n */\n sandbox(config) {\n this.config.sandbox = {\n ...this.config.sandbox,\n ...config\n };\n return this;\n }\n /**\n * Build the skill.\n */\n build() {\n return defineSkill(this.config);\n }\n};\n\n// src/config.ts\nvar DEFAULT_CONFIG2 = {\n sandbox: {\n timeout: 5e3,\n memoryLimit: 128,\n allowAsync: true,\n globals: {}\n },\n adaptersDir: \"./adapters\",\n skillsDir: \"./skills\"\n};\nfunction defineConfig(config) {\n return {\n ...DEFAULT_CONFIG2,\n ...config,\n sandbox: {\n ...DEFAULT_CONFIG2.sandbox,\n ...config.sandbox\n }\n };\n}\nfunction configBuilder() {\n return new MCXConfigBuilder();\n}\nvar MCXConfigBuilder = class {\n config = {\n adapters: [],\n skills: []\n };\n /**\n * Add an adapter to the configuration.\n */\n adapter(adapter) {\n this.config.adapters = [...this.config.adapters ?? [], adapter];\n return this;\n }\n /**\n * Add multiple adapters to the configuration.\n */\n adapters(...adapters) {\n this.config.adapters = [...this.config.adapters ?? [], ...adapters];\n return this;\n }\n /**\n * Add a skill to the configuration.\n */\n skill(skill) {\n this.config.skills = [...this.config.skills ?? [], skill];\n return this;\n }\n /**\n * Add multiple skills to the configuration.\n */\n skills(...skills) {\n this.config.skills = [...this.config.skills ?? [], ...skills];\n return this;\n }\n /**\n * Set the sandbox configuration.\n */\n sandbox(config) {\n this.config.sandbox = {\n ...this.config.sandbox,\n ...config\n };\n return this;\n }\n /**\n * Set the adapters directory path.\n */\n adaptersDir(path) {\n this.config.adaptersDir = path;\n return this;\n }\n /**\n * Set the skills directory path.\n */\n skillsDir(path) {\n this.config.skillsDir = path;\n return this;\n }\n /**\n * Build the configuration.\n */\n build() {\n return defineConfig(this.config);\n }\n};\nfunction mergeConfigs(...configs) {\n const merged = {\n adapters: [],\n skills: [],\n sandbox: { ...DEFAULT_CONFIG2.sandbox },\n adaptersDir: DEFAULT_CONFIG2.adaptersDir,\n skillsDir: DEFAULT_CONFIG2.skillsDir\n };\n for (const config of configs) {\n if (config.adapters) {\n merged.adapters = [...merged.adapters ?? [], ...config.adapters];\n }\n if (config.skills) {\n merged.skills = [...merged.skills ?? [], ...config.skills];\n }\n if (config.sandbox) {\n merged.sandbox = { ...merged.sandbox, ...config.sandbox };\n }\n if (config.adaptersDir) {\n merged.adaptersDir = config.adaptersDir;\n }\n if (config.skillsDir) {\n merged.skillsDir = config.skillsDir;\n }\n }\n return merged;\n}\n\n// src/executor.ts\nimport { pathToFileURL } from \"url\";\nvar MCXExecutor = class {\n adapters = /* @__PURE__ */ new Map();\n skills = /* @__PURE__ */ new Map();\n sandboxConfig;\n sandboxFactory;\n configPath;\n constructor(options = {}) {\n this.sandboxConfig = options.config?.sandbox ?? {\n timeout: 5e3,\n memoryLimit: 128,\n allowAsync: true,\n globals: {}\n };\n this.sandboxFactory = options.sandboxFactory ?? createSandbox;\n this.configPath = options.configPath;\n if (options.config?.adapters) {\n for (const adapter of options.config.adapters) {\n this.registerAdapter(adapter);\n }\n }\n if (options.config?.skills) {\n for (const skill of options.config.skills) {\n this.registerSkill(skill);\n }\n }\n }\n /**\n * Load configuration from an mcx.config.ts file.\n *\n * @param configPath - Path to the configuration file\n */\n async loadConfig(configPath) {\n const path = configPath ?? this.configPath ?? \"./mcx.config.ts\";\n try {\n const fileUrl = pathToFileURL(path).href;\n const module = await import(fileUrl);\n const config = module.default ?? module;\n if (config.sandbox) {\n this.sandboxConfig = {\n ...this.sandboxConfig,\n ...config.sandbox\n };\n }\n if (config.adapters) {\n for (const adapter of config.adapters) {\n this.registerAdapter(adapter);\n }\n }\n if (config.skills) {\n for (const skill of config.skills) {\n this.registerSkill(skill);\n }\n }\n } catch (error) {\n throw new Error(\n `Failed to load MCX config from ${path}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n /**\n * Register an adapter.\n *\n * @param adapter - The adapter to register\n */\n registerAdapter(adapter) {\n if (this.adapters.has(adapter.name)) {\n console.warn(`Adapter \"${adapter.name}\" is being overwritten`);\n }\n this.adapters.set(adapter.name, adapter);\n }\n /**\n * Unregister an adapter.\n *\n * @param name - The adapter name\n * @returns Whether the adapter was removed\n */\n unregisterAdapter(name) {\n return this.adapters.delete(name);\n }\n /**\n * Get a registered adapter by name.\n *\n * @param name - The adapter name\n */\n getAdapter(name) {\n return this.adapters.get(name);\n }\n /**\n * Get all registered adapter names.\n */\n getAdapterNames() {\n return Array.from(this.adapters.keys());\n }\n /**\n * Register a skill.\n *\n * @param skill - The skill to register\n */\n registerSkill(skill) {\n if (this.skills.has(skill.name)) {\n console.warn(`Skill \"${skill.name}\" is being overwritten`);\n }\n this.skills.set(skill.name, skill);\n }\n /**\n * Unregister a skill.\n *\n * @param name - The skill name\n * @returns Whether the skill was removed\n */\n unregisterSkill(name) {\n return this.skills.delete(name);\n }\n /**\n * Get a registered skill by name.\n *\n * @param name - The skill name\n */\n getSkill(name) {\n return this.skills.get(name);\n }\n /**\n * Get all registered skill names.\n */\n getSkillNames() {\n return Array.from(this.skills.keys());\n }\n /**\n * Execute code in the sandbox.\n *\n * @param code - The code to execute\n * @param options - Execution options\n */\n async execute(code, options = {}) {\n const sandboxConfig = {\n ...this.sandboxConfig,\n ...options.sandbox\n };\n const sandbox = this.sandboxFactory(sandboxConfig);\n try {\n const context = this.buildExecutionContext(\n options.adapters,\n options.variables\n );\n return await sandbox.execute(code, context);\n } finally {\n sandbox.dispose();\n }\n }\n /**\n * Run a registered skill by name.\n *\n * @param name - The skill name\n * @param options - Execution options\n */\n async runSkill(name, options = {}) {\n const skill = this.skills.get(name);\n if (!skill) {\n return {\n success: false,\n error: {\n name: \"SkillNotFoundError\",\n message: `Skill \"${name}\" not found`\n },\n logs: [],\n executionTime: 0\n };\n }\n const missingAdapters = skill.adapters.filter(\n (adapterName) => !this.adapters.has(adapterName)\n );\n if (missingAdapters.length > 0) {\n return {\n success: false,\n error: {\n name: \"MissingAdaptersError\",\n message: `Skill \"${name}\" requires missing adapters: ${missingAdapters.join(\", \")}`\n },\n logs: [],\n executionTime: 0\n };\n }\n if (skill.run) {\n const startTime = performance.now();\n try {\n const context = this.buildExecutionContext(\n skill.adapters.length > 0 ? skill.adapters : void 0,\n options.variables\n );\n const result = await skill.run({\n ...context.adapters,\n ...context.variables\n });\n return {\n success: true,\n value: result,\n logs: [],\n executionTime: performance.now() - startTime\n };\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n return {\n success: false,\n error: {\n name: err.name,\n message: err.message,\n stack: err.stack\n },\n logs: [],\n executionTime: performance.now() - startTime\n };\n }\n }\n if (!skill.code) {\n return {\n success: false,\n error: {\n name: \"InvalidSkillError\",\n message: `Skill \"${name}\" has neither code nor run function`\n },\n logs: [],\n executionTime: 0\n };\n }\n return this.execute(skill.code, {\n sandbox: skill.sandboxConfig,\n adapters: skill.adapters.length > 0 ? skill.adapters : void 0,\n variables: options.variables\n });\n }\n /**\n * Update the default sandbox configuration.\n */\n configureSandbox(config) {\n this.sandboxConfig = {\n ...this.sandboxConfig,\n ...config\n };\n }\n /**\n * Build the execution context for the sandbox.\n */\n buildExecutionContext(adapterNames, variables) {\n const adaptersToInclude = adapterNames ? adapterNames.filter((name) => this.adapters.has(name)) : Array.from(this.adapters.keys());\n const adapterMethods = {};\n for (const name of adaptersToInclude) {\n const adapter = this.adapters.get(name);\n if (!adapter) continue;\n adapterMethods[name] = {};\n for (const [methodName, method] of adapter.methods) {\n adapterMethods[name][methodName] = method.execute.bind(method);\n }\n }\n return {\n adapters: adapterMethods,\n variables\n };\n }\n};\nfunction createExecutor(options) {\n return new MCXExecutor(options);\n}\n\n// src/index.ts\nimport { z as z2 } from \"zod\";\nexport {\n IsolatedVMSandbox,\n MCXExecutor,\n configBuilder,\n createAdapterFactory,\n createExecutor,\n createSandbox,\n defineAdapter,\n defineConfig,\n defineSkill,\n defineSkills,\n mergeConfigs,\n skillBuilder,\n z2 as z\n};\n","import { readdir, access } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport pc from \"picocolors\";\r\n\r\ninterface Skill {\r\n name: string;\r\n description?: string;\r\n inputs?: Record<string, { type: string; description?: string; default?: unknown }>;\r\n}\r\n\r\ninterface Adapter {\r\n name: string;\r\n description?: string;\r\n tools?: Record<string, { description?: string }>;\r\n}\r\n\r\nasync function exists(path: string): Promise<boolean> {\r\n try {\r\n await access(path);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function listSkills(): Promise<Skill[]> {\r\n const skills: Skill[] = [];\r\n const cwd = process.cwd();\r\n const skillsDir = join(cwd, \"skills\");\r\n\r\n if (!(await exists(skillsDir))) {\r\n return skills;\r\n }\r\n\r\n try {\r\n const entries = await readdir(skillsDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n let skillPath: string | null = null;\r\n let skillName = entry.name.replace(/\\.(ts|js)$/, \"\");\r\n\r\n if (entry.isFile() && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".js\"))) {\r\n skillPath = join(skillsDir, entry.name);\r\n } else if (entry.isDirectory()) {\r\n skillName = entry.name;\r\n const indexTs = join(skillsDir, entry.name, \"index.ts\");\r\n const indexJs = join(skillsDir, entry.name, \"index.js\");\r\n if (await exists(indexTs)) {\r\n skillPath = indexTs;\r\n } else if (await exists(indexJs)) {\r\n skillPath = indexJs;\r\n }\r\n }\r\n\r\n if (skillPath) {\r\n try {\r\n const skillModule = await import(`file://${skillPath}`);\r\n const skill = skillModule.default || skillModule;\r\n\r\n if (skill && typeof skill.run === \"function\") {\r\n skills.push({\r\n name: skill.name || skillName,\r\n description: skill.description,\r\n inputs: skill.inputs,\r\n });\r\n }\r\n } catch {\r\n // Skip invalid skills\r\n skills.push({\r\n name: skillName,\r\n description: \"(failed to load)\",\r\n });\r\n }\r\n }\r\n }\r\n } catch {\r\n // Directory read failed\r\n }\r\n\r\n return skills;\r\n}\r\n\r\nasync function listAdapters(): Promise<Adapter[]> {\r\n const adapters: Adapter[] = [];\r\n const cwd = process.cwd();\r\n const adaptersDir = join(cwd, \"adapters\");\r\n\r\n if (!(await exists(adaptersDir))) {\r\n return adapters;\r\n }\r\n\r\n try {\r\n const entries = await readdir(adaptersDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n let adapterPath: string | null = null;\r\n let adapterName = entry.name.replace(/\\.(ts|js)$/, \"\");\r\n\r\n if (entry.isFile() && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".js\"))) {\r\n adapterPath = join(adaptersDir, entry.name);\r\n } else if (entry.isDirectory()) {\r\n adapterName = entry.name;\r\n const indexTs = join(adaptersDir, entry.name, \"index.ts\");\r\n const indexJs = join(adaptersDir, entry.name, \"index.js\");\r\n if (await exists(indexTs)) {\r\n adapterPath = indexTs;\r\n } else if (await exists(indexJs)) {\r\n adapterPath = indexJs;\r\n }\r\n }\r\n\r\n if (adapterPath) {\r\n try {\r\n const adapterModule = await import(`file://${adapterPath}`);\r\n const adapter = adapterModule.default || adapterModule;\r\n\r\n adapters.push({\r\n name: adapter.name || adapterName,\r\n description: adapter.description,\r\n tools: adapter.tools,\r\n });\r\n } catch {\r\n // Skip invalid adapters\r\n adapters.push({\r\n name: adapterName,\r\n description: \"(failed to load)\",\r\n });\r\n }\r\n }\r\n }\r\n } catch {\r\n // Directory read failed\r\n }\r\n\r\n return adapters;\r\n}\r\n\r\nexport async function listCommand(): Promise<void> {\r\n const cwd = process.cwd();\r\n\r\n console.log(pc.cyan(\"MCX Resources\\n\"));\r\n\r\n // List skills\r\n console.log(pc.bold(\"Skills:\"));\r\n const skills = await listSkills();\r\n\r\n if (skills.length === 0) {\r\n console.log(pc.dim(\" No skills found in skills/\"));\r\n console.log(pc.dim(\" Run 'mcx init' to create example skills\"));\r\n } else {\r\n for (const skill of skills) {\r\n console.log(` ${pc.green(skill.name)}`);\r\n if (skill.description) {\r\n console.log(pc.dim(` ${skill.description}`));\r\n }\r\n if (skill.inputs && Object.keys(skill.inputs).length > 0) {\r\n console.log(pc.dim(` inputs: ${Object.keys(skill.inputs).join(\", \")}`));\r\n }\r\n }\r\n }\r\n\r\n console.log();\r\n\r\n // List adapters\r\n console.log(pc.bold(\"Adapters:\"));\r\n const adapters = await listAdapters();\r\n\r\n if (adapters.length === 0) {\r\n console.log(pc.dim(\" No adapters found in adapters/\"));\r\n console.log(pc.dim(\" Run 'mcx init' to create example adapters\"));\r\n } else {\r\n for (const adapter of adapters) {\r\n console.log(` ${pc.green(adapter.name)}`);\r\n if (adapter.description) {\r\n console.log(pc.dim(` ${adapter.description}`));\r\n }\r\n if (adapter.tools && Object.keys(adapter.tools).length > 0) {\r\n console.log(pc.dim(` tools: ${Object.keys(adapter.tools).join(\", \")}`));\r\n }\r\n }\r\n }\r\n\r\n console.log();\r\n console.log(pc.dim(`Working directory: ${cwd}`));\r\n}\r\n","import * as fs from \"fs/promises\";\r\nimport * as path from \"path\";\r\nimport pc from \"picocolors\";\r\nimport { glob } from \"glob\";\r\nimport { parse as parseYAML } from \"yaml\";\r\n\r\ninterface OpenAPIParameter {\r\n name: string;\r\n in: \"query\" | \"path\" | \"header\";\r\n description?: string;\r\n required?: boolean;\r\n schema?: {\r\n type?: string;\r\n format?: string;\r\n enum?: string[];\r\n default?: unknown;\r\n };\r\n}\r\n\r\ninterface OpenAPIOperation {\r\n summary?: string;\r\n description?: string;\r\n parameters?: OpenAPIParameter[];\r\n requestBody?: {\r\n required?: boolean;\r\n content?: {\r\n \"application/json\"?: {\r\n schema?: Record<string, unknown>;\r\n };\r\n };\r\n };\r\n responses?: Record<string, unknown>;\r\n}\r\n\r\ninterface OpenAPIPath {\r\n get?: OpenAPIOperation;\r\n post?: OpenAPIOperation;\r\n put?: OpenAPIOperation;\r\n delete?: OpenAPIOperation;\r\n patch?: OpenAPIOperation;\r\n}\r\n\r\ninterface OpenAPISpec {\r\n openapi: string;\r\n info: {\r\n title: string;\r\n description?: string;\r\n version: string;\r\n };\r\n servers?: Array<{ url: string; description?: string }>;\r\n paths: Record<string, OpenAPIPath>;\r\n}\r\n\r\ninterface ParsedEndpoint {\r\n path: string;\r\n method: \"get\" | \"post\" | \"put\" | \"delete\" | \"patch\";\r\n operation: OpenAPIOperation;\r\n methodName: string;\r\n category: string;\r\n}\r\n\r\nexport async function genCommand(options: {\r\n source: string;\r\n output: string;\r\n name: string;\r\n baseUrl?: string;\r\n}): Promise<void> {\r\n const { source, output, name, baseUrl } = options;\r\n\r\n console.log(pc.blue(\"\\n📄 MCX Adapter Generator\\n\"));\r\n console.log(`Source: ${pc.cyan(source)}`);\r\n console.log(`Output: ${pc.cyan(output)}`);\r\n console.log(`Adapter name: ${pc.cyan(name)}\\n`);\r\n\r\n // Find all markdown files\r\n const mdFiles = await findMarkdownFiles(source);\r\n console.log(`Found ${pc.yellow(String(mdFiles.length))} markdown files\\n`);\r\n\r\n // Parse all endpoints\r\n const endpoints: ParsedEndpoint[] = [];\r\n const errors: string[] = [];\r\n\r\n for (const file of mdFiles) {\r\n try {\r\n const content = await fs.readFile(file, \"utf-8\");\r\n const parsed = parseMarkdownDoc(content, file);\r\n if (parsed.length > 0) {\r\n endpoints.push(...parsed);\r\n }\r\n } catch (err) {\r\n errors.push(`${file}: ${(err as Error).message}`);\r\n }\r\n }\r\n\r\n console.log(`Parsed ${pc.green(String(endpoints.length))} endpoints`);\r\n if (errors.length > 0) {\r\n console.log(`${pc.yellow(String(errors.length))} files had errors`);\r\n }\r\n\r\n // Group endpoints by category\r\n const byCategory = groupByCategory(endpoints);\r\n console.log(`\\nCategories:`);\r\n for (const [cat, eps] of Object.entries(byCategory)) {\r\n console.log(` ${pc.dim(\"-\")} ${cat}: ${eps.length} endpoints`);\r\n }\r\n\r\n // Detect base URL from specs\r\n let detectedBaseUrl = baseUrl;\r\n if (!detectedBaseUrl && endpoints.length > 0) {\r\n // Try to extract from first endpoint\r\n detectedBaseUrl = \"https://api.alegra.com/api/v1\";\r\n }\r\n\r\n // Generate adapter code\r\n const adapterCode = generateAdapter(name, endpoints, detectedBaseUrl);\r\n\r\n // Write output\r\n await fs.mkdir(path.dirname(output), { recursive: true });\r\n await fs.writeFile(output, adapterCode, \"utf-8\");\r\n\r\n console.log(`\\n${pc.green(\"✓\")} Generated adapter: ${pc.cyan(output)}`);\r\n console.log(`\\nAdapter \"${name}\" has ${endpoints.length} methods ready to use.\\n`);\r\n}\r\n\r\nasync function findMarkdownFiles(source: string): Promise<string[]> {\r\n const stats = await fs.stat(source);\r\n\r\n if (stats.isFile() && (source.endsWith(\".md\") || source.endsWith(\".md.txt\"))) {\r\n return [source];\r\n }\r\n\r\n if (stats.isDirectory()) {\r\n // Find both .md and .md.txt files\r\n const mdPattern = path.join(source, \"**/*.md\").replace(/\\\\/g, \"/\");\r\n const mdTxtPattern = path.join(source, \"**/*.md.txt\").replace(/\\\\/g, \"/\");\r\n\r\n const [mdFiles, mdTxtFiles] = await Promise.all([\r\n glob(mdPattern),\r\n glob(mdTxtPattern),\r\n ]);\r\n\r\n return [...mdFiles, ...mdTxtFiles];\r\n }\r\n\r\n throw new Error(`Source must be a markdown file or directory: ${source}`);\r\n}\r\n\r\nfunction parseMarkdownDoc(content: string, filePath: string): ParsedEndpoint[] {\r\n const endpoints: ParsedEndpoint[] = [];\r\n\r\n let spec: OpenAPISpec | null = null;\r\n\r\n // Try JSON first\r\n const jsonMatch = content.match(/```json\\s*([\\s\\S]*?)\\s*```/);\r\n if (jsonMatch) {\r\n try {\r\n spec = JSON.parse(jsonMatch[1]);\r\n } catch {\r\n // Not valid JSON\r\n }\r\n }\r\n\r\n // Try YAML if JSON didn't work\r\n if (!spec) {\r\n const yamlMatch = content.match(/```ya?ml\\s*([\\s\\S]*?)\\s*```/);\r\n if (yamlMatch) {\r\n try {\r\n spec = parseYAML(yamlMatch[1]) as OpenAPISpec;\r\n } catch {\r\n // Not valid YAML\r\n }\r\n }\r\n }\r\n\r\n if (!spec || !spec.paths) {\r\n return endpoints;\r\n }\r\n\r\n // Get category from file path\r\n const category = extractCategory(filePath);\r\n\r\n // Process each path\r\n for (const [pathStr, pathObj] of Object.entries(spec.paths)) {\r\n const methods: Array<\"get\" | \"post\" | \"put\" | \"delete\" | \"patch\"> = [\r\n \"get\",\r\n \"post\",\r\n \"put\",\r\n \"delete\",\r\n \"patch\",\r\n ];\r\n\r\n for (const method of methods) {\r\n const operation = pathObj[method];\r\n if (!operation) continue;\r\n\r\n const methodName = generateMethodName(method, pathStr, operation);\r\n\r\n endpoints.push({\r\n path: pathStr,\r\n method,\r\n operation,\r\n methodName,\r\n category,\r\n });\r\n }\r\n }\r\n\r\n return endpoints;\r\n}\r\n\r\nfunction extractCategory(filePath: string): string {\r\n const parts = filePath.replace(/\\\\/g, \"/\").split(\"/\");\r\n // Look for category in path (e.g., \"Ingresos\", \"Egresos\", etc.)\r\n for (let i = parts.length - 2; i >= 0; i--) {\r\n const part = parts[i];\r\n if (part && !part.includes(\".\") && part !== \"alegra official endpoints\") {\r\n return part;\r\n }\r\n }\r\n return \"general\";\r\n}\r\n\r\nfunction generateMethodName(\r\n method: string,\r\n pathStr: string,\r\n operation: OpenAPIOperation\r\n): string {\r\n // Clean path: /invoices/{id} -> invoicesById\r\n let cleaned = pathStr\r\n .replace(/\\{([^}]+)\\}/g, \"ById\")\r\n .replace(/[^a-zA-Z0-9]/g, \" \")\r\n .trim()\r\n .split(/\\s+/)\r\n .map((word, i) => (i === 0 ? word.toLowerCase() : capitalize(word)))\r\n .join(\"\");\r\n\r\n // Prefix with method for non-GET\r\n const prefix =\r\n method === \"get\"\r\n ? \"get\"\r\n : method === \"post\"\r\n ? \"create\"\r\n : method === \"put\"\r\n ? \"update\"\r\n : method === \"delete\"\r\n ? \"delete\"\r\n : method;\r\n\r\n // Avoid redundant prefixes\r\n if (cleaned.toLowerCase().startsWith(prefix)) {\r\n return cleaned;\r\n }\r\n\r\n return prefix + capitalize(cleaned);\r\n}\r\n\r\nfunction capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\nfunction groupByCategory(\r\n endpoints: ParsedEndpoint[]\r\n): Record<string, ParsedEndpoint[]> {\r\n const groups: Record<string, ParsedEndpoint[]> = {};\r\n for (const ep of endpoints) {\r\n if (!groups[ep.category]) {\r\n groups[ep.category] = [];\r\n }\r\n groups[ep.category].push(ep);\r\n }\r\n return groups;\r\n}\r\n\r\nfunction generateAdapter(\r\n name: string,\r\n endpoints: ParsedEndpoint[],\r\n baseUrl?: string\r\n): string {\r\n const lines: string[] = [];\r\n const finalBaseUrl = baseUrl || \"https://api.alegra.com/api/v1\";\r\n const envPrefix = name.toUpperCase();\r\n\r\n // Header\r\n lines.push(`/**`);\r\n lines.push(` * ${capitalize(name)} API Adapter - Auto-generated`);\r\n lines.push(` * Generated: ${new Date().toISOString()}`);\r\n lines.push(` * Endpoints: ${endpoints.length}`);\r\n lines.push(` *`);\r\n lines.push(` * Environment variables:`);\r\n lines.push(` * - ${envPrefix}_EMAIL`);\r\n lines.push(` * - ${envPrefix}_TOKEN`);\r\n lines.push(` */`);\r\n lines.push(``);\r\n lines.push(`import { defineAdapter } from '@mcx/adapters';`);\r\n lines.push(``);\r\n lines.push(`const BASE_URL = process.env.${envPrefix}_API_URL || '${finalBaseUrl}';`);\r\n lines.push(``);\r\n\r\n // Auth helper\r\n lines.push(`function getAuthHeader(): string {`);\r\n lines.push(` const email = process.env.${envPrefix}_EMAIL;`);\r\n lines.push(` const token = process.env.${envPrefix}_TOKEN;`);\r\n lines.push(` if (!email || !token) {`);\r\n lines.push(` throw new Error('${envPrefix}_EMAIL and ${envPrefix}_TOKEN environment variables are required');`);\r\n lines.push(` }`);\r\n lines.push(` return \\`Basic \\${Buffer.from(\\`\\${email}:\\${token}\\`).toString('base64')}\\`;`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // Fetch helper\r\n lines.push(`async function apiFetch<T>(endpoint: string, params?: Record<string, unknown>, options?: { method?: string; body?: unknown }): Promise<T> {`);\r\n lines.push(` const url = new URL(\\`\\${BASE_URL}\\${endpoint}\\`);`);\r\n lines.push(` if (params && (!options?.method || options.method === 'GET')) {`);\r\n lines.push(` Object.entries(params).forEach(([key, value]) => {`);\r\n lines.push(` if (value !== undefined && value !== null) {`);\r\n lines.push(` url.searchParams.set(key, String(value));`);\r\n lines.push(` }`);\r\n lines.push(` });`);\r\n lines.push(` }`);\r\n lines.push(` const response = await fetch(url.toString(), {`);\r\n lines.push(` method: options?.method || 'GET',`);\r\n lines.push(` headers: {`);\r\n lines.push(` 'Authorization': getAuthHeader(),`);\r\n lines.push(` 'Content-Type': 'application/json',`);\r\n lines.push(` },`);\r\n lines.push(` body: options?.body ? JSON.stringify(options.body) : undefined,`);\r\n lines.push(` });`);\r\n lines.push(` if (!response.ok) {`);\r\n lines.push(` const error = await response.text();`);\r\n lines.push(` throw new Error(\\`${capitalize(name)} API error (\\${response.status}): \\${error}\\`);`);\r\n lines.push(` }`);\r\n lines.push(` return response.json() as T;`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // Start adapter definition\r\n lines.push(`export const ${name} = defineAdapter({`);\r\n lines.push(` name: '${name}',`);\r\n lines.push(` description: '${capitalize(name)} API - Auto-generated with ${endpoints.length} endpoints',`);\r\n lines.push(` tools: {`);\r\n\r\n // Generate each method\r\n const seenMethods = new Set<string>();\r\n\r\n for (const ep of endpoints) {\r\n // Dedupe method names\r\n let methodName = ep.methodName;\r\n let suffix = 1;\r\n while (seenMethods.has(methodName)) {\r\n methodName = `${ep.methodName}${suffix++}`;\r\n }\r\n seenMethods.add(methodName);\r\n\r\n const methodCode = generateMethod(methodName, ep);\r\n lines.push(methodCode);\r\n }\r\n\r\n lines.push(` },`);\r\n lines.push(`});`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nfunction generateMethod(methodName: string, ep: ParsedEndpoint): string {\r\n const lines: string[] = [];\r\n const indent = \" \";\r\n\r\n // Description - escape quotes and remove newlines\r\n const desc = (ep.operation.summary || ep.operation.description || ep.path)\r\n .replace(/'/g, \"\\\\'\")\r\n .replace(/[\\r\\n]+/g, \" \");\r\n\r\n lines.push(`${indent}${methodName}: {`);\r\n lines.push(`${indent} description: '${desc}',`);\r\n\r\n // Parameters object\r\n const paramsCode = generateParametersObject(ep);\r\n lines.push(`${indent} parameters: ${paramsCode},`);\r\n\r\n // Execute function - use _params if no parameters are used\r\n const hasParams = (ep.operation.parameters || []).length > 0 || !!ep.operation.requestBody;\r\n const paramName = hasParams ? \"params\" : \"_params\";\r\n const executeCode = generateExecuteFunction(ep);\r\n lines.push(`${indent} execute: async (${paramName}: Record<string, unknown>) => {`);\r\n lines.push(`${indent} ${executeCode}`);\r\n lines.push(`${indent} },`);\r\n lines.push(`${indent}},`);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nfunction generateParametersObject(ep: ParsedEndpoint): string {\r\n const params = ep.operation.parameters || [];\r\n const hasRequestBody = !!ep.operation.requestBody;\r\n\r\n if (params.length === 0 && !hasRequestBody) {\r\n return \"{}\";\r\n }\r\n\r\n const fields: string[] = [];\r\n\r\n // Query and path parameters (skip headers like Content-Type)\r\n for (const param of params) {\r\n if (param.in === \"header\") continue; // Skip header params - handled by apiFetch\r\n\r\n const paramType = mapToParamType(param.schema);\r\n // Escape quotes, remove newlines, and truncate\r\n const desc = (param.description || \"\")\r\n .replace(/'/g, \"\\\\'\")\r\n .replace(/[\\r\\n]+/g, \" \")\r\n .slice(0, 100);\r\n // Quote param names if they contain special characters\r\n const safeName = /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(param.name) ? param.name : `'${param.name}'`;\r\n fields.push(` ${safeName}: { type: '${paramType}', description: '${desc}'${param.required ? \", required: true\" : \"\"} }`);\r\n }\r\n\r\n // Request body (simplified)\r\n if (hasRequestBody) {\r\n fields.push(` body: { type: 'object', description: 'Request body' }`);\r\n }\r\n\r\n return `{\\n${fields.join(\",\\n\")}\\n }`;\r\n}\r\n\r\nfunction mapToParamType(schema?: OpenAPIParameter[\"schema\"]): string {\r\n if (!schema) return \"string\";\r\n const { type } = schema;\r\n switch (type) {\r\n case \"integer\":\r\n case \"number\":\r\n return \"number\";\r\n case \"boolean\":\r\n return \"boolean\";\r\n case \"array\":\r\n return \"array\";\r\n case \"object\":\r\n return \"object\";\r\n default:\r\n return \"string\";\r\n }\r\n}\r\n\r\nfunction generateExecuteFunction(ep: ParsedEndpoint): string {\r\n const { method, path: pathStr } = ep;\r\n const params = ep.operation.parameters || [];\r\n\r\n // Build URL with path params\r\n let urlExpr = `\\`${pathStr}\\``;\r\n const pathParams = params.filter((p) => p.in === \"path\");\r\n if (pathParams.length > 0) {\r\n // Replace {id} with ${params.id}\r\n urlExpr = urlExpr.replace(/\\{([^}]+)\\}/g, \"${params.$1}\");\r\n }\r\n\r\n // Build query string\r\n const queryParams = params.filter((p) => p.in === \"query\");\r\n const queryCode =\r\n queryParams.length > 0\r\n ? `\r\n const query = new URLSearchParams();\r\n${queryParams.map((p) => ` if (params.${p.name} !== undefined) query.set('${p.name}', String(params.${p.name}));`).join(\"\\n\")}\r\n const url = ${urlExpr} + (query.toString() ? '?' + query.toString() : '');`\r\n : `const url = ${urlExpr};`;\r\n\r\n // Generate apiFetch call\r\n const hasBody = method === \"post\" || method === \"put\" || method === \"patch\";\r\n\r\n if (method === \"get\") {\r\n // GET: apiFetch(url, queryParams)\r\n const queryObj = queryParams.length > 0\r\n ? `{ ${queryParams.map(p => `${p.name}: params.${p.name}`).join(\", \")} }`\r\n : \"\";\r\n return queryParams.length > 0\r\n ? `return apiFetch(${urlExpr}, ${queryObj});`\r\n : `return apiFetch(${urlExpr});`;\r\n } else if (method === \"delete\") {\r\n // DELETE: apiFetch(url, queryParams, { method: 'DELETE' })\r\n const queryObj = queryParams.length > 0\r\n ? `{ ${queryParams.map(p => `${p.name}: params.${p.name}`).join(\", \")} }`\r\n : \"undefined\";\r\n return `return apiFetch(${urlExpr}, ${queryObj}, { method: 'DELETE' });`;\r\n } else {\r\n // POST/PUT/PATCH: apiFetch(url, queryParams, { method, body })\r\n const queryObj = queryParams.length > 0\r\n ? `{ ${queryParams.map(p => `${p.name}: params.${p.name}`).join(\", \")} }`\r\n : \"undefined\";\r\n return `return apiFetch(${urlExpr}, ${queryObj}, { method: '${method.toUpperCase()}', body: params.body });`;\r\n }\r\n}\r\n"],"mappings":"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","names":["pc","path","path","access","join","pc","exists","path","exists","pc","join","path","access","readFile","join","z","pc","join","readFile","z","exists","path","access","join","pc","fs","readdir","access","join","pc","exists","path","pc","pc"]}
@@ -0,0 +1,27 @@
1
+ ; Query from: https://raw.githubusercontent.com/nvim-treesitter/nvim-treesitter/refs/heads/master/queries/markdown/injections.scm
2
+ (fenced_code_block
3
+ (info_string
4
+ (language) @_lang)
5
+ (code_fence_content) @injection.content
6
+ (#set-lang-from-info-string! @_lang))
7
+
8
+ ((html_block) @injection.content
9
+ (#set! injection.language "html")
10
+ (#set! injection.combined)
11
+ (#set! injection.include-children))
12
+
13
+ ((minus_metadata) @injection.content
14
+ (#set! injection.language "yaml")
15
+ (#offset! @injection.content 1 0 -1 0)
16
+ (#set! injection.include-children))
17
+
18
+ ((plus_metadata) @injection.content
19
+ (#set! injection.language "toml")
20
+ (#offset! @injection.content 1 0 -1 0)
21
+ (#set! injection.include-children))
22
+
23
+ ([
24
+ (inline)
25
+ (pipe_table_cell)
26
+ ] @injection.content
27
+ (#set! injection.language "markdown_inline"))
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@papicandela/mcx-cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI for the MCX framework - MCP Code Execution",
5
+ "author": "papicandela",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/schizoidcock/mcx"
10
+ },
11
+ "type": "module",
12
+ "bin": {
13
+ "mcx": "./dist/index.js"
14
+ },
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "import": "./dist/index.js",
20
+ "types": "./dist/index.d.ts"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "scripts": {
27
+ "build": "bun build src/index.ts --outdir dist --target bun --env disable --external @opentui/core --external @opentui/react --external @opentui-ui/dialog --external @opentui-ui/toast && bun run add-shebang",
28
+ "add-shebang": "bun -e \"const f=Bun.file('dist/index.js');const c=await f.text();if(!c.startsWith('#!'))await Bun.write('dist/index.js','#!/usr/bin/env bun\\n'+c)\"",
29
+ "dev": "bun --watch dist/index.js",
30
+ "typecheck": "tsc --noEmit"
31
+ },
32
+ "dependencies": {
33
+ "@papicandela/mcx-core": "^0.1.0",
34
+ "@modelcontextprotocol/sdk": "^1.26.0",
35
+ "@opentui-ui/dialog": "^0.1.2",
36
+ "@opentui-ui/toast": "^0.0.5",
37
+ "@opentui/core": "^0.1.79",
38
+ "@opentui/react": "^0.1.79",
39
+ "commander": "^12.1.0",
40
+ "picocolors": "^1.1.1",
41
+ "react": "^19.2.4",
42
+ "yaml": "^2.6.0",
43
+ "zod": "^3.23.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/bun": "^1.3.9",
47
+ "@types/node": "^22.10.0",
48
+ "typescript": "^5.7.2"
49
+ },
50
+ "keywords": [
51
+ "mcx",
52
+ "cli",
53
+ "mcp",
54
+ "claude"
55
+ ],
56
+ "license": "MIT"
57
+ }