@agimon-ai/video-editor-mcp 0.2.2 → 0.2.3

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/dist/cli.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- const e=require(`./stdio-DRNt1yxK.cjs`);let t=require(`commander`),n=require(`node:child_process`),r=require(`node:path`);r=e.m(r);let i=require(`chalk`);i=e.m(i);let a=require(`node:fs`);a=e.m(a);var o=`0.2.1`;const s=new t.Command(`http-serve`).description(`Start Remotion Studio for video editing`).option(`-p, --port <port>`,`Port to run Remotion Studio on`,`3001`).action(async e=>{try{let t=parseInt(e.port,10),a=r.default.resolve(__dirname,`..`);console.error(i.default.green(`✓ Starting Remotion Studio on port ${t}...`)),console.error(i.default.gray(` Working directory: ${a}`));let o=(0,n.spawn)(r.default.join(a,`node_modules`,`.bin`,`remotion`),[`studio`,`--port`,String(t)],{stdio:`inherit`,cwd:a});o.on(`error`,e=>{console.error(i.default.red(`Failed to start Remotion Studio: ${e.message}`)),process.exit(1)}),process.on(`SIGINT`,()=>{o.kill(`SIGINT`),process.exit(0)}),process.on(`SIGTERM`,()=>{o.kill(`SIGTERM`),process.exit(0)})}catch(e){console.error(`Error executing http-serve:`,e),process.exit(1)}});async function c(e){await e.start();let t=async t=>{console.error(`\nReceived ${t}, shutting down gracefully...`);try{await e.stop(),process.exit(0)}catch(e){console.error(`Error during shutdown:`,e),process.exit(1)}};process.on(`SIGINT`,()=>t(`SIGINT`)),process.on(`SIGTERM`,()=>t(`SIGTERM`))}const l=new t.Command(`mcp-serve`).description(`Start MCP server with specified transport`).option(`-t, --type <type>`,`Transport type: stdio`,`stdio`).action(async t=>{try{let n=t.type.toLowerCase();n===`stdio`?await c(new e.t(e.n(e.r()))):(console.error(`Unknown transport type: ${n}. Use: stdio`),process.exit(1))}catch(e){console.error(`Failed to start MCP server:`,e),process.exit(1)}}),u=new t.Command(`render`).description(`Render a video from JSON props file`).requiredOption(`-i, --input <path>`,`Path to JSON props file`).requiredOption(`-o, --output <path>`,`Output video file path`).option(`-c, --composition <id>`,`Composition ID`,`Main`).option(`--codec <codec>`,`Video codec (h264, h265, vp8, vp9)`,`h264`).action(async t=>{try{process.stderr.write(i.default.blue(`🎬 Starting video render...
2
+ const e=require(`./stdio-DRNt1yxK.cjs`);let t=require(`commander`),n=require(`node:child_process`),r=require(`node:path`);r=e.m(r);let i=require(`chalk`);i=e.m(i);let a=require(`node:fs`);a=e.m(a);var o=`0.2.2`;const s=new t.Command(`http-serve`).description(`Start Remotion Studio for video editing`).option(`-p, --port <port>`,`Port to run Remotion Studio on`,`3001`).action(async e=>{try{let t=parseInt(e.port,10),a=r.default.resolve(__dirname,`..`);console.error(i.default.green(`✓ Starting Remotion Studio on port ${t}...`)),console.error(i.default.gray(` Working directory: ${a}`));let o=(0,n.spawn)(r.default.join(a,`node_modules`,`.bin`,`remotion`),[`studio`,`--port`,String(t)],{stdio:`inherit`,cwd:a});o.on(`error`,e=>{console.error(i.default.red(`Failed to start Remotion Studio: ${e.message}`)),process.exit(1)}),process.on(`SIGINT`,()=>{o.kill(`SIGINT`),process.exit(0)}),process.on(`SIGTERM`,()=>{o.kill(`SIGTERM`),process.exit(0)})}catch(e){console.error(`Error executing http-serve:`,e),process.exit(1)}});async function c(e){await e.start();let t=async t=>{console.error(`\nReceived ${t}, shutting down gracefully...`);try{await e.stop(),process.exit(0)}catch(e){console.error(`Error during shutdown:`,e),process.exit(1)}};process.on(`SIGINT`,()=>t(`SIGINT`)),process.on(`SIGTERM`,()=>t(`SIGTERM`))}const l=new t.Command(`mcp-serve`).description(`Start MCP server with specified transport`).option(`-t, --type <type>`,`Transport type: stdio`,`stdio`).action(async t=>{try{let n=t.type.toLowerCase();n===`stdio`?await c(new e.t(e.n(e.r()))):(console.error(`Unknown transport type: ${n}. Use: stdio`),process.exit(1))}catch(e){console.error(`Failed to start MCP server:`,e),process.exit(1)}}),u=new t.Command(`render`).description(`Render a video from JSON props file`).requiredOption(`-i, --input <path>`,`Path to JSON props file`).requiredOption(`-o, --output <path>`,`Output video file path`).option(`-c, --composition <id>`,`Composition ID`,`Main`).option(`--codec <codec>`,`Video codec (h264, h265, vp8, vp9)`,`h264`).action(async t=>{try{process.stderr.write(i.default.blue(`🎬 Starting video render...
3
3
  `)),process.stderr.write(i.default.gray(` Input: ${t.input}\n`)),process.stderr.write(i.default.gray(` Output: ${t.output}\n`)),process.stderr.write(i.default.gray(` Composition: ${t.composition}\n`)),process.stderr.write(i.default.gray(` Codec: ${t.codec}\n`)),a.default.existsSync(t.input)||(process.stderr.write(i.default.red(`Error: Input file not found: ${t.input}\n`)),process.exit(1));let n=a.default.readFileSync(t.input,`utf-8`),r=JSON.parse(n),o=e.r().get(e.d.RenderService);process.stderr.write(i.default.blue(`📦 Bundling Remotion project...
4
4
  `));let s=await o.render({compositionId:t.composition,inputProps:r,outputPath:t.output,codec:t.codec});process.stderr.write(i.default.green(`✓ Video rendered successfully: ${s.outputPath}\n`))}catch(e){process.stderr.write(i.default.red(`Error rendering video: ${e}\n`)),process.exit(1)}});async function d(){let e=new t.Command;e.name(`video-editor-mcp`).description(`MCP server for video editing with Remotion`).version(o),e.addCommand(l),e.addCommand(s),e.addCommand(u),await e.parseAsync(process.argv)}d();
5
5
  //# sourceMappingURL=cli.cjs.map
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.cjs","names":["Command","path","Command","StdioTransportHandler","createServer","createContainer","Command","fs","createContainer","TYPES","Command","packageJson.version"],"sources":["../package.json","../src/commands/http-serve.ts","../src/commands/mcp-serve.ts","../src/commands/render.ts","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"@agimon-ai/video-editor-mcp\",\n \"description\": \"MCP server for video editing with Remotion\",\n \"version\": \"0.2.1\",\n \"license\": \"AGPL-3.0\",\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"remotion\",\n \"video-editor\",\n \"typescript\"\n ],\n \"bin\": {\n \"video-editor-mcp\": \"./dist/cli.cjs\"\n },\n \"main\": \"./dist/index.cjs\",\n \"types\": \"./dist/index.d.cts\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"dev\": \"node --loader ts-node/esm src/cli.ts mcp-serve\",\n \"build\": \"tsdown\",\n \"test\": \"vitest --run\",\n \"lint\": \"eslint src\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"1.19.1\",\n \"@remotion/bundler\": \"^4.0.0\",\n \"@remotion/captions\": \"^4.0.0\",\n \"@remotion/cli\": \"^4.0.0\",\n \"@remotion/fonts\": \"^4.0.0\",\n \"@remotion/gif\": \"^4.0.0\",\n \"@remotion/google-fonts\": \"^4.0.0\",\n \"@remotion/lottie\": \"^4.0.0\",\n \"@remotion/media-utils\": \"^4.0.0\",\n \"@remotion/renderer\": \"^4.0.0\",\n \"@remotion/transitions\": \"^4.0.0\",\n \"chalk\": \"5.4.1\",\n \"commander\": \"14.0.0\",\n \"inversify\": \"7.1.0\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"reflect-metadata\": \"0.2.2\",\n \"remotion\": \"^4.0.0\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.0.0\",\n \"@types/react\": \"^19.0.0\",\n \"tsdown\": \"0.16.1\",\n \"typescript\": \"5.9.3\",\n \"vitest\": \"4.0.18\"\n },\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./cli\": {\n \"import\": \"./dist/cli.mjs\",\n \"require\": \"./dist/cli.cjs\"\n },\n \"./package.json\": \"./package.json\"\n }\n}\n","/**\n * HTTP Serve Command\n *\n * Starts Remotion Studio for interactive video editing.\n */\n\nimport { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nexport const httpServeCommand = new Command('http-serve')\n .description('Start Remotion Studio for video editing')\n .option('-p, --port <port>', 'Port to run Remotion Studio on', '3001')\n .action(async (options: { port: string }) => {\n try {\n const port = parseInt(options.port, 10);\n\n // Get the package directory (where remotion entry point is)\n // In compiled output, files are flat in dist/, so go up one level\n const packageDir = path.resolve(import.meta.dirname, '..');\n\n console.error(chalk.green(`✓ Starting Remotion Studio on port ${port}...`));\n console.error(chalk.gray(` Working directory: ${packageDir}`));\n\n // Use the locally installed remotion CLI\n const remotionBin = path.join(packageDir, 'node_modules', '.bin', 'remotion');\n\n const studio = spawn(remotionBin, ['studio', '--port', String(port)], {\n stdio: 'inherit',\n cwd: packageDir,\n });\n\n studio.on('error', (error) => {\n console.error(chalk.red(`Failed to start Remotion Studio: ${error.message}`));\n process.exit(1);\n });\n\n process.on('SIGINT', () => {\n studio.kill('SIGINT');\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n studio.kill('SIGTERM');\n process.exit(0);\n });\n } catch (error) {\n console.error('Error executing http-serve:', error);\n process.exit(1);\n }\n });\n","/**\n * MCP Serve Command\n *\n * DESIGN PATTERNS:\n * - Command pattern with Commander for CLI argument parsing\n * - Transport abstraction pattern for flexible deployment (stdio, HTTP, SSE)\n * - Factory pattern for creating transport handlers\n * - Graceful shutdown pattern with signal handling\n *\n * CODING STANDARDS:\n * - Use async/await for asynchronous operations\n * - Implement proper error handling with try-catch blocks\n * - Handle process signals for graceful shutdown\n * - Provide clear CLI options and help messages\n *\n * AVOID:\n * - Hardcoded configuration values (use CLI options or environment variables)\n * - Missing error handling for transport startup\n * - Not cleaning up resources on shutdown\n */\n\nimport { Command } from 'commander';\nimport { createContainer } from '../container/index.js';\nimport { createServer } from '../server/index.js';\nimport { StdioTransportHandler } from '../transports/stdio.js';\n\n/**\n * Start MCP server with given transport handler\n */\nasync function startServer(handler: any) {\n await handler.start();\n\n // Handle graceful shutdown\n const shutdown = async (signal: string) => {\n console.error(`\\nReceived ${signal}, shutting down gracefully...`);\n try {\n await handler.stop();\n process.exit(0);\n } catch (error) {\n console.error('Error during shutdown:', error);\n process.exit(1);\n }\n };\n\n process.on('SIGINT', () => shutdown('SIGINT'));\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n}\n\n/**\n * MCP Serve command\n */\nexport const mcpServeCommand = new Command('mcp-serve')\n .description('Start MCP server with specified transport')\n .option('-t, --type <type>', 'Transport type: stdio', 'stdio')\n .action(async (options) => {\n try {\n const transportType = options.type.toLowerCase();\n\n if (transportType === 'stdio') {\n const container = createContainer();\n const server = createServer(container);\n const handler = new StdioTransportHandler(server);\n await startServer(handler);\n } else {\n console.error(`Unknown transport type: ${transportType}. Use: stdio`);\n process.exit(1);\n }\n } catch (error) {\n console.error('Failed to start MCP server:', error);\n process.exit(1);\n }\n });\n","/**\n * Render Command\n *\n * Renders a video from JSON props using Remotion.\n */\n\nimport fs from 'node:fs';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createContainer } from '../container/index.js';\nimport { RenderService } from '../services/RenderService.js';\nimport { TYPES } from '../types/index.js';\n\ninterface RenderOptions {\n input: string;\n output: string;\n composition: string;\n codec: 'h264' | 'h265' | 'vp8' | 'vp9';\n}\n\nexport const renderCommand = new Command('render')\n .description('Render a video from JSON props file')\n .requiredOption('-i, --input <path>', 'Path to JSON props file')\n .requiredOption('-o, --output <path>', 'Output video file path')\n .option('-c, --composition <id>', 'Composition ID', 'Main')\n .option('--codec <codec>', 'Video codec (h264, h265, vp8, vp9)', 'h264')\n .action(async (options: RenderOptions) => {\n try {\n process.stderr.write(chalk.blue('🎬 Starting video render...\\n'));\n process.stderr.write(chalk.gray(` Input: ${options.input}\\n`));\n process.stderr.write(chalk.gray(` Output: ${options.output}\\n`));\n process.stderr.write(chalk.gray(` Composition: ${options.composition}\\n`));\n process.stderr.write(chalk.gray(` Codec: ${options.codec}\\n`));\n\n // Read JSON props file\n if (!fs.existsSync(options.input)) {\n process.stderr.write(chalk.red(`Error: Input file not found: ${options.input}\\n`));\n process.exit(1);\n }\n\n const propsContent = fs.readFileSync(options.input, 'utf-8');\n const inputProps = JSON.parse(propsContent) as Record<string, unknown>;\n\n // Create container and get RenderService\n const container = createContainer();\n const renderService = container.get<RenderService>(TYPES.RenderService);\n\n process.stderr.write(chalk.blue('📦 Bundling Remotion project...\\n'));\n\n const result = await renderService.render({\n compositionId: options.composition,\n inputProps,\n outputPath: options.output,\n codec: options.codec,\n });\n\n process.stderr.write(chalk.green(`✓ Video rendered successfully: ${result.outputPath}\\n`));\n } catch (error) {\n process.stderr.write(chalk.red(`Error rendering video: ${error}\\n`));\n process.exit(1);\n }\n });\n","#!/usr/bin/env node\n/**\n * MCP Server Entry Point\n *\n * DESIGN PATTERNS:\n * - CLI pattern with Commander for argument parsing\n * - Command pattern for organizing CLI commands\n * - Transport abstraction for multiple communication methods\n *\n * CODING STANDARDS:\n * - Use async/await for asynchronous operations\n * - Handle errors gracefully with try-catch\n * - Log important events for debugging\n * - Register all commands in main entry point\n *\n * AVOID:\n * - Hardcoding command logic in index.ts (use separate command files)\n * - Missing error handling for command execution\n */\nimport { Command } from 'commander';\nimport packageJson from '../package.json' with { type: 'json' };\nimport { httpServeCommand } from './commands/http-serve.js';\nimport { mcpServeCommand } from './commands/mcp-serve.js';\nimport { renderCommand } from './commands/render.js';\n\n/**\n * Main entry point\n */\nasync function main() {\n const program = new Command();\n\n program\n .name('video-editor-mcp')\n .description('MCP server for video editing with Remotion')\n .version(packageJson.version);\n\n // Add all commands\n program.addCommand(mcpServeCommand);\n program.addCommand(httpServeCommand);\n program.addCommand(renderCommand);\n\n // Parse arguments\n await program.parseAsync(process.argv);\n}\n\nmain();\n"],"mappings":";2MAGa,QCQb,MAAa,EAAmB,IAAIA,EAAAA,QAAQ,aAAa,CACtD,YAAY,0CAA0C,CACtD,OAAO,oBAAqB,iCAAkC,OAAO,CACrE,OAAO,KAAO,IAA8B,CAC3C,GAAI,CACF,IAAM,EAAO,SAAS,EAAQ,KAAM,GAAG,CAIjC,EAAaC,EAAAA,QAAK,QAAA,UAA6B,KAAK,CAE1D,QAAQ,MAAM,EAAA,QAAM,MAAM,sCAAsC,EAAK,KAAK,CAAC,CAC3E,QAAQ,MAAM,EAAA,QAAM,KAAK,wBAAwB,IAAa,CAAC,CAK/D,IAAM,GAAA,EAAA,EAAA,OAFcA,EAAAA,QAAK,KAAK,EAAY,eAAgB,OAAQ,WAAW,CAE3C,CAAC,SAAU,SAAU,OAAO,EAAK,CAAC,CAAE,CACpE,MAAO,UACP,IAAK,EACN,CAAC,CAEF,EAAO,GAAG,QAAU,GAAU,CAC5B,QAAQ,MAAM,EAAA,QAAM,IAAI,oCAAoC,EAAM,UAAU,CAAC,CAC7E,QAAQ,KAAK,EAAE,EACf,CAEF,QAAQ,GAAG,aAAgB,CACzB,EAAO,KAAK,SAAS,CACrB,QAAQ,KAAK,EAAE,EACf,CAEF,QAAQ,GAAG,cAAiB,CAC1B,EAAO,KAAK,UAAU,CACtB,QAAQ,KAAK,EAAE,EACf,OACK,EAAO,CACd,QAAQ,MAAM,8BAA+B,EAAM,CACnD,QAAQ,KAAK,EAAE,GAEjB,CCtBJ,eAAe,EAAY,EAAc,CACvC,MAAM,EAAQ,OAAO,CAGrB,IAAM,EAAW,KAAO,IAAmB,CACzC,QAAQ,MAAM,cAAc,EAAO,+BAA+B,CAClE,GAAI,CACF,MAAM,EAAQ,MAAM,CACpB,QAAQ,KAAK,EAAE,OACR,EAAO,CACd,QAAQ,MAAM,yBAA0B,EAAM,CAC9C,QAAQ,KAAK,EAAE,GAInB,QAAQ,GAAG,aAAgB,EAAS,SAAS,CAAC,CAC9C,QAAQ,GAAG,cAAiB,EAAS,UAAU,CAAC,CAMlD,MAAa,EAAkB,IAAIC,EAAAA,QAAQ,YAAY,CACpD,YAAY,4CAA4C,CACxD,OAAO,oBAAqB,wBAAyB,QAAQ,CAC7D,OAAO,KAAO,IAAY,CACzB,GAAI,CACF,IAAM,EAAgB,EAAQ,KAAK,aAAa,CAE5C,IAAkB,QAIpB,MAAM,EADU,IAAIC,EAAAA,EADLC,EAAAA,EADGC,EAAAA,GAAiB,CACG,CACW,CACvB,EAE1B,QAAQ,MAAM,2BAA2B,EAAc,cAAc,CACrE,QAAQ,KAAK,EAAE,QAEV,EAAO,CACd,QAAQ,MAAM,8BAA+B,EAAM,CACnD,QAAQ,KAAK,EAAE,GAEjB,CCnDS,EAAgB,IAAIC,EAAAA,QAAQ,SAAS,CAC/C,YAAY,sCAAsC,CAClD,eAAe,qBAAsB,0BAA0B,CAC/D,eAAe,sBAAuB,yBAAyB,CAC/D,OAAO,yBAA0B,iBAAkB,OAAO,CAC1D,OAAO,kBAAmB,qCAAsC,OAAO,CACvE,OAAO,KAAO,IAA2B,CACxC,GAAI,CACF,QAAQ,OAAO,MAAM,EAAA,QAAM,KAAK;EAAgC,CAAC,CACjE,QAAQ,OAAO,MAAM,EAAA,QAAM,KAAK,YAAY,EAAQ,MAAM,IAAI,CAAC,CAC/D,QAAQ,OAAO,MAAM,EAAA,QAAM,KAAK,aAAa,EAAQ,OAAO,IAAI,CAAC,CACjE,QAAQ,OAAO,MAAM,EAAA,QAAM,KAAK,kBAAkB,EAAQ,YAAY,IAAI,CAAC,CAC3E,QAAQ,OAAO,MAAM,EAAA,QAAM,KAAK,YAAY,EAAQ,MAAM,IAAI,CAAC,CAG1DC,EAAAA,QAAG,WAAW,EAAQ,MAAM,GAC/B,QAAQ,OAAO,MAAM,EAAA,QAAM,IAAI,gCAAgC,EAAQ,MAAM,IAAI,CAAC,CAClF,QAAQ,KAAK,EAAE,EAGjB,IAAM,EAAeA,EAAAA,QAAG,aAAa,EAAQ,MAAO,QAAQ,CACtD,EAAa,KAAK,MAAM,EAAa,CAIrC,EADYC,EAAAA,GAAiB,CACH,IAAmBC,EAAAA,EAAM,cAAc,CAEvE,QAAQ,OAAO,MAAM,EAAA,QAAM,KAAK;EAAoC,CAAC,CAErE,IAAM,EAAS,MAAM,EAAc,OAAO,CACxC,cAAe,EAAQ,YACvB,aACA,WAAY,EAAQ,OACpB,MAAO,EAAQ,MAChB,CAAC,CAEF,QAAQ,OAAO,MAAM,EAAA,QAAM,MAAM,kCAAkC,EAAO,WAAW,IAAI,CAAC,OACnF,EAAO,CACd,QAAQ,OAAO,MAAM,EAAA,QAAM,IAAI,0BAA0B,EAAM,IAAI,CAAC,CACpE,QAAQ,KAAK,EAAE,GAEjB,CCjCJ,eAAe,GAAO,CACpB,IAAM,EAAU,IAAIC,EAAAA,QAEpB,EACG,KAAK,mBAAmB,CACxB,YAAY,6CAA6C,CACzD,QAAQC,EAAoB,CAG/B,EAAQ,WAAW,EAAgB,CACnC,EAAQ,WAAW,EAAiB,CACpC,EAAQ,WAAW,EAAc,CAGjC,MAAM,EAAQ,WAAW,QAAQ,KAAK,CAGxC,GAAM"}
1
+ {"version":3,"file":"cli.cjs","names":["Command","path","Command","StdioTransportHandler","createServer","createContainer","Command","fs","createContainer","TYPES","Command","packageJson.version"],"sources":["../package.json","../src/commands/http-serve.ts","../src/commands/mcp-serve.ts","../src/commands/render.ts","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"@agimon-ai/video-editor-mcp\",\n \"description\": \"MCP server for video editing with Remotion\",\n \"version\": \"0.2.2\",\n \"license\": \"AGPL-3.0\",\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"remotion\",\n \"video-editor\",\n \"typescript\"\n ],\n \"bin\": {\n \"video-editor-mcp\": \"./dist/cli.cjs\"\n },\n \"main\": \"./dist/index.cjs\",\n \"types\": \"./dist/index.d.cts\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"dev\": \"node --loader ts-node/esm src/cli.ts mcp-serve\",\n \"build\": \"tsdown\",\n \"test\": \"vitest --run\",\n \"lint\": \"eslint src\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"1.19.1\",\n \"@remotion/bundler\": \"^4.0.0\",\n \"@remotion/captions\": \"^4.0.0\",\n \"@remotion/cli\": \"^4.0.0\",\n \"@remotion/fonts\": \"^4.0.0\",\n \"@remotion/gif\": \"^4.0.0\",\n \"@remotion/google-fonts\": \"^4.0.0\",\n \"@remotion/lottie\": \"^4.0.0\",\n \"@remotion/media-utils\": \"^4.0.0\",\n \"@remotion/renderer\": \"^4.0.0\",\n \"@remotion/transitions\": \"^4.0.0\",\n \"chalk\": \"5.4.1\",\n \"commander\": \"14.0.0\",\n \"inversify\": \"7.1.0\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"reflect-metadata\": \"0.2.2\",\n \"remotion\": \"^4.0.0\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.0.0\",\n \"@types/react\": \"^19.0.0\",\n \"tsdown\": \"0.16.1\",\n \"typescript\": \"5.9.3\",\n \"vitest\": \"4.0.18\"\n },\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./cli\": {\n \"import\": \"./dist/cli.mjs\",\n \"require\": \"./dist/cli.cjs\"\n },\n \"./package.json\": \"./package.json\"\n }\n}\n","/**\n * HTTP Serve Command\n *\n * Starts Remotion Studio for interactive video editing.\n */\n\nimport { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nexport const httpServeCommand = new Command('http-serve')\n .description('Start Remotion Studio for video editing')\n .option('-p, --port <port>', 'Port to run Remotion Studio on', '3001')\n .action(async (options: { port: string }) => {\n try {\n const port = parseInt(options.port, 10);\n\n // Get the package directory (where remotion entry point is)\n // In compiled output, files are flat in dist/, so go up one level\n const packageDir = path.resolve(import.meta.dirname, '..');\n\n console.error(chalk.green(`✓ Starting Remotion Studio on port ${port}...`));\n console.error(chalk.gray(` Working directory: ${packageDir}`));\n\n // Use the locally installed remotion CLI\n const remotionBin = path.join(packageDir, 'node_modules', '.bin', 'remotion');\n\n const studio = spawn(remotionBin, ['studio', '--port', String(port)], {\n stdio: 'inherit',\n cwd: packageDir,\n });\n\n studio.on('error', (error) => {\n console.error(chalk.red(`Failed to start Remotion Studio: ${error.message}`));\n process.exit(1);\n });\n\n process.on('SIGINT', () => {\n studio.kill('SIGINT');\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n studio.kill('SIGTERM');\n process.exit(0);\n });\n } catch (error) {\n console.error('Error executing http-serve:', error);\n process.exit(1);\n }\n });\n","/**\n * MCP Serve Command\n *\n * DESIGN PATTERNS:\n * - Command pattern with Commander for CLI argument parsing\n * - Transport abstraction pattern for flexible deployment (stdio, HTTP, SSE)\n * - Factory pattern for creating transport handlers\n * - Graceful shutdown pattern with signal handling\n *\n * CODING STANDARDS:\n * - Use async/await for asynchronous operations\n * - Implement proper error handling with try-catch blocks\n * - Handle process signals for graceful shutdown\n * - Provide clear CLI options and help messages\n *\n * AVOID:\n * - Hardcoded configuration values (use CLI options or environment variables)\n * - Missing error handling for transport startup\n * - Not cleaning up resources on shutdown\n */\n\nimport { Command } from 'commander';\nimport { createContainer } from '../container/index.js';\nimport { createServer } from '../server/index.js';\nimport { StdioTransportHandler } from '../transports/stdio.js';\n\n/**\n * Start MCP server with given transport handler\n */\nasync function startServer(handler: any) {\n await handler.start();\n\n // Handle graceful shutdown\n const shutdown = async (signal: string) => {\n console.error(`\\nReceived ${signal}, shutting down gracefully...`);\n try {\n await handler.stop();\n process.exit(0);\n } catch (error) {\n console.error('Error during shutdown:', error);\n process.exit(1);\n }\n };\n\n process.on('SIGINT', () => shutdown('SIGINT'));\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n}\n\n/**\n * MCP Serve command\n */\nexport const mcpServeCommand = new Command('mcp-serve')\n .description('Start MCP server with specified transport')\n .option('-t, --type <type>', 'Transport type: stdio', 'stdio')\n .action(async (options) => {\n try {\n const transportType = options.type.toLowerCase();\n\n if (transportType === 'stdio') {\n const container = createContainer();\n const server = createServer(container);\n const handler = new StdioTransportHandler(server);\n await startServer(handler);\n } else {\n console.error(`Unknown transport type: ${transportType}. Use: stdio`);\n process.exit(1);\n }\n } catch (error) {\n console.error('Failed to start MCP server:', error);\n process.exit(1);\n }\n });\n","/**\n * Render Command\n *\n * Renders a video from JSON props using Remotion.\n */\n\nimport fs from 'node:fs';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createContainer } from '../container/index.js';\nimport { RenderService } from '../services/RenderService.js';\nimport { TYPES } from '../types/index.js';\n\ninterface RenderOptions {\n input: string;\n output: string;\n composition: string;\n codec: 'h264' | 'h265' | 'vp8' | 'vp9';\n}\n\nexport const renderCommand = new Command('render')\n .description('Render a video from JSON props file')\n .requiredOption('-i, --input <path>', 'Path to JSON props file')\n .requiredOption('-o, --output <path>', 'Output video file path')\n .option('-c, --composition <id>', 'Composition ID', 'Main')\n .option('--codec <codec>', 'Video codec (h264, h265, vp8, vp9)', 'h264')\n .action(async (options: RenderOptions) => {\n try {\n process.stderr.write(chalk.blue('🎬 Starting video render...\\n'));\n process.stderr.write(chalk.gray(` Input: ${options.input}\\n`));\n process.stderr.write(chalk.gray(` Output: ${options.output}\\n`));\n process.stderr.write(chalk.gray(` Composition: ${options.composition}\\n`));\n process.stderr.write(chalk.gray(` Codec: ${options.codec}\\n`));\n\n // Read JSON props file\n if (!fs.existsSync(options.input)) {\n process.stderr.write(chalk.red(`Error: Input file not found: ${options.input}\\n`));\n process.exit(1);\n }\n\n const propsContent = fs.readFileSync(options.input, 'utf-8');\n const inputProps = JSON.parse(propsContent) as Record<string, unknown>;\n\n // Create container and get RenderService\n const container = createContainer();\n const renderService = container.get<RenderService>(TYPES.RenderService);\n\n process.stderr.write(chalk.blue('📦 Bundling Remotion project...\\n'));\n\n const result = await renderService.render({\n compositionId: options.composition,\n inputProps,\n outputPath: options.output,\n codec: options.codec,\n });\n\n process.stderr.write(chalk.green(`✓ Video rendered successfully: ${result.outputPath}\\n`));\n } catch (error) {\n process.stderr.write(chalk.red(`Error rendering video: ${error}\\n`));\n process.exit(1);\n }\n });\n","#!/usr/bin/env node\n/**\n * MCP Server Entry Point\n *\n * DESIGN PATTERNS:\n * - CLI pattern with Commander for argument parsing\n * - Command pattern for organizing CLI commands\n * - Transport abstraction for multiple communication methods\n *\n * CODING STANDARDS:\n * - Use async/await for asynchronous operations\n * - Handle errors gracefully with try-catch\n * - Log important events for debugging\n * - Register all commands in main entry point\n *\n * AVOID:\n * - Hardcoding command logic in index.ts (use separate command files)\n * - Missing error handling for command execution\n */\nimport { Command } from 'commander';\nimport packageJson from '../package.json' with { type: 'json' };\nimport { httpServeCommand } from './commands/http-serve.js';\nimport { mcpServeCommand } from './commands/mcp-serve.js';\nimport { renderCommand } from './commands/render.js';\n\n/**\n * Main entry point\n */\nasync function main() {\n const program = new Command();\n\n program\n .name('video-editor-mcp')\n .description('MCP server for video editing with Remotion')\n .version(packageJson.version);\n\n // Add all commands\n program.addCommand(mcpServeCommand);\n program.addCommand(httpServeCommand);\n program.addCommand(renderCommand);\n\n // Parse arguments\n await program.parseAsync(process.argv);\n}\n\nmain();\n"],"mappings":"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"}
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{d as e,n as t,r as n,t as r}from"./stdio-C7h0m1FD.mjs";import{Command as i}from"commander";import{spawn as a}from"node:child_process";import o from"node:path";import s from"chalk";import c from"node:fs";var l=`0.2.1`;const u=new i(`http-serve`).description(`Start Remotion Studio for video editing`).option(`-p, --port <port>`,`Port to run Remotion Studio on`,`3001`).action(async e=>{try{let t=parseInt(e.port,10),n=o.resolve(import.meta.dirname,`..`);console.error(s.green(`✓ Starting Remotion Studio on port ${t}...`)),console.error(s.gray(` Working directory: ${n}`));let r=a(o.join(n,`node_modules`,`.bin`,`remotion`),[`studio`,`--port`,String(t)],{stdio:`inherit`,cwd:n});r.on(`error`,e=>{console.error(s.red(`Failed to start Remotion Studio: ${e.message}`)),process.exit(1)}),process.on(`SIGINT`,()=>{r.kill(`SIGINT`),process.exit(0)}),process.on(`SIGTERM`,()=>{r.kill(`SIGTERM`),process.exit(0)})}catch(e){console.error(`Error executing http-serve:`,e),process.exit(1)}});async function d(e){await e.start();let t=async t=>{console.error(`\nReceived ${t}, shutting down gracefully...`);try{await e.stop(),process.exit(0)}catch(e){console.error(`Error during shutdown:`,e),process.exit(1)}};process.on(`SIGINT`,()=>t(`SIGINT`)),process.on(`SIGTERM`,()=>t(`SIGTERM`))}const f=new i(`mcp-serve`).description(`Start MCP server with specified transport`).option(`-t, --type <type>`,`Transport type: stdio`,`stdio`).action(async e=>{try{let i=e.type.toLowerCase();i===`stdio`?await d(new r(t(n()))):(console.error(`Unknown transport type: ${i}. Use: stdio`),process.exit(1))}catch(e){console.error(`Failed to start MCP server:`,e),process.exit(1)}}),p=new i(`render`).description(`Render a video from JSON props file`).requiredOption(`-i, --input <path>`,`Path to JSON props file`).requiredOption(`-o, --output <path>`,`Output video file path`).option(`-c, --composition <id>`,`Composition ID`,`Main`).option(`--codec <codec>`,`Video codec (h264, h265, vp8, vp9)`,`h264`).action(async t=>{try{process.stderr.write(s.blue(`🎬 Starting video render...
2
+ import{d as e,n as t,r as n,t as r}from"./stdio-C7h0m1FD.mjs";import{Command as i}from"commander";import{spawn as a}from"node:child_process";import o from"node:path";import s from"chalk";import c from"node:fs";var l=`0.2.2`;const u=new i(`http-serve`).description(`Start Remotion Studio for video editing`).option(`-p, --port <port>`,`Port to run Remotion Studio on`,`3001`).action(async e=>{try{let t=parseInt(e.port,10),n=o.resolve(import.meta.dirname,`..`);console.error(s.green(`✓ Starting Remotion Studio on port ${t}...`)),console.error(s.gray(` Working directory: ${n}`));let r=a(o.join(n,`node_modules`,`.bin`,`remotion`),[`studio`,`--port`,String(t)],{stdio:`inherit`,cwd:n});r.on(`error`,e=>{console.error(s.red(`Failed to start Remotion Studio: ${e.message}`)),process.exit(1)}),process.on(`SIGINT`,()=>{r.kill(`SIGINT`),process.exit(0)}),process.on(`SIGTERM`,()=>{r.kill(`SIGTERM`),process.exit(0)})}catch(e){console.error(`Error executing http-serve:`,e),process.exit(1)}});async function d(e){await e.start();let t=async t=>{console.error(`\nReceived ${t}, shutting down gracefully...`);try{await e.stop(),process.exit(0)}catch(e){console.error(`Error during shutdown:`,e),process.exit(1)}};process.on(`SIGINT`,()=>t(`SIGINT`)),process.on(`SIGTERM`,()=>t(`SIGTERM`))}const f=new i(`mcp-serve`).description(`Start MCP server with specified transport`).option(`-t, --type <type>`,`Transport type: stdio`,`stdio`).action(async e=>{try{let i=e.type.toLowerCase();i===`stdio`?await d(new r(t(n()))):(console.error(`Unknown transport type: ${i}. Use: stdio`),process.exit(1))}catch(e){console.error(`Failed to start MCP server:`,e),process.exit(1)}}),p=new i(`render`).description(`Render a video from JSON props file`).requiredOption(`-i, --input <path>`,`Path to JSON props file`).requiredOption(`-o, --output <path>`,`Output video file path`).option(`-c, --composition <id>`,`Composition ID`,`Main`).option(`--codec <codec>`,`Video codec (h264, h265, vp8, vp9)`,`h264`).action(async t=>{try{process.stderr.write(s.blue(`🎬 Starting video render...
3
3
  `)),process.stderr.write(s.gray(` Input: ${t.input}\n`)),process.stderr.write(s.gray(` Output: ${t.output}\n`)),process.stderr.write(s.gray(` Composition: ${t.composition}\n`)),process.stderr.write(s.gray(` Codec: ${t.codec}\n`)),c.existsSync(t.input)||(process.stderr.write(s.red(`Error: Input file not found: ${t.input}\n`)),process.exit(1));let r=c.readFileSync(t.input,`utf-8`),i=JSON.parse(r),a=n().get(e.RenderService);process.stderr.write(s.blue(`📦 Bundling Remotion project...
4
4
  `));let o=await a.render({compositionId:t.composition,inputProps:i,outputPath:t.output,codec:t.codec});process.stderr.write(s.green(`✓ Video rendered successfully: ${o.outputPath}\n`))}catch(e){process.stderr.write(s.red(`Error rendering video: ${e}\n`)),process.exit(1)}});async function m(){let e=new i;e.name(`video-editor-mcp`).description(`MCP server for video editing with Remotion`).version(l),e.addCommand(f),e.addCommand(u),e.addCommand(p),await e.parseAsync(process.argv)}m();export{};
5
5
  //# sourceMappingURL=cli.mjs.map
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":["packageJson.version"],"sources":["../package.json","../src/commands/http-serve.ts","../src/commands/mcp-serve.ts","../src/commands/render.ts","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"@agimon-ai/video-editor-mcp\",\n \"description\": \"MCP server for video editing with Remotion\",\n \"version\": \"0.2.1\",\n \"license\": \"AGPL-3.0\",\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"remotion\",\n \"video-editor\",\n \"typescript\"\n ],\n \"bin\": {\n \"video-editor-mcp\": \"./dist/cli.cjs\"\n },\n \"main\": \"./dist/index.cjs\",\n \"types\": \"./dist/index.d.cts\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"dev\": \"node --loader ts-node/esm src/cli.ts mcp-serve\",\n \"build\": \"tsdown\",\n \"test\": \"vitest --run\",\n \"lint\": \"eslint src\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"1.19.1\",\n \"@remotion/bundler\": \"^4.0.0\",\n \"@remotion/captions\": \"^4.0.0\",\n \"@remotion/cli\": \"^4.0.0\",\n \"@remotion/fonts\": \"^4.0.0\",\n \"@remotion/gif\": \"^4.0.0\",\n \"@remotion/google-fonts\": \"^4.0.0\",\n \"@remotion/lottie\": \"^4.0.0\",\n \"@remotion/media-utils\": \"^4.0.0\",\n \"@remotion/renderer\": \"^4.0.0\",\n \"@remotion/transitions\": \"^4.0.0\",\n \"chalk\": \"5.4.1\",\n \"commander\": \"14.0.0\",\n \"inversify\": \"7.1.0\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"reflect-metadata\": \"0.2.2\",\n \"remotion\": \"^4.0.0\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.0.0\",\n \"@types/react\": \"^19.0.0\",\n \"tsdown\": \"0.16.1\",\n \"typescript\": \"5.9.3\",\n \"vitest\": \"4.0.18\"\n },\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./cli\": {\n \"import\": \"./dist/cli.mjs\",\n \"require\": \"./dist/cli.cjs\"\n },\n \"./package.json\": \"./package.json\"\n }\n}\n","/**\n * HTTP Serve Command\n *\n * Starts Remotion Studio for interactive video editing.\n */\n\nimport { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nexport const httpServeCommand = new Command('http-serve')\n .description('Start Remotion Studio for video editing')\n .option('-p, --port <port>', 'Port to run Remotion Studio on', '3001')\n .action(async (options: { port: string }) => {\n try {\n const port = parseInt(options.port, 10);\n\n // Get the package directory (where remotion entry point is)\n // In compiled output, files are flat in dist/, so go up one level\n const packageDir = path.resolve(import.meta.dirname, '..');\n\n console.error(chalk.green(`✓ Starting Remotion Studio on port ${port}...`));\n console.error(chalk.gray(` Working directory: ${packageDir}`));\n\n // Use the locally installed remotion CLI\n const remotionBin = path.join(packageDir, 'node_modules', '.bin', 'remotion');\n\n const studio = spawn(remotionBin, ['studio', '--port', String(port)], {\n stdio: 'inherit',\n cwd: packageDir,\n });\n\n studio.on('error', (error) => {\n console.error(chalk.red(`Failed to start Remotion Studio: ${error.message}`));\n process.exit(1);\n });\n\n process.on('SIGINT', () => {\n studio.kill('SIGINT');\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n studio.kill('SIGTERM');\n process.exit(0);\n });\n } catch (error) {\n console.error('Error executing http-serve:', error);\n process.exit(1);\n }\n });\n","/**\n * MCP Serve Command\n *\n * DESIGN PATTERNS:\n * - Command pattern with Commander for CLI argument parsing\n * - Transport abstraction pattern for flexible deployment (stdio, HTTP, SSE)\n * - Factory pattern for creating transport handlers\n * - Graceful shutdown pattern with signal handling\n *\n * CODING STANDARDS:\n * - Use async/await for asynchronous operations\n * - Implement proper error handling with try-catch blocks\n * - Handle process signals for graceful shutdown\n * - Provide clear CLI options and help messages\n *\n * AVOID:\n * - Hardcoded configuration values (use CLI options or environment variables)\n * - Missing error handling for transport startup\n * - Not cleaning up resources on shutdown\n */\n\nimport { Command } from 'commander';\nimport { createContainer } from '../container/index.js';\nimport { createServer } from '../server/index.js';\nimport { StdioTransportHandler } from '../transports/stdio.js';\n\n/**\n * Start MCP server with given transport handler\n */\nasync function startServer(handler: any) {\n await handler.start();\n\n // Handle graceful shutdown\n const shutdown = async (signal: string) => {\n console.error(`\\nReceived ${signal}, shutting down gracefully...`);\n try {\n await handler.stop();\n process.exit(0);\n } catch (error) {\n console.error('Error during shutdown:', error);\n process.exit(1);\n }\n };\n\n process.on('SIGINT', () => shutdown('SIGINT'));\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n}\n\n/**\n * MCP Serve command\n */\nexport const mcpServeCommand = new Command('mcp-serve')\n .description('Start MCP server with specified transport')\n .option('-t, --type <type>', 'Transport type: stdio', 'stdio')\n .action(async (options) => {\n try {\n const transportType = options.type.toLowerCase();\n\n if (transportType === 'stdio') {\n const container = createContainer();\n const server = createServer(container);\n const handler = new StdioTransportHandler(server);\n await startServer(handler);\n } else {\n console.error(`Unknown transport type: ${transportType}. Use: stdio`);\n process.exit(1);\n }\n } catch (error) {\n console.error('Failed to start MCP server:', error);\n process.exit(1);\n }\n });\n","/**\n * Render Command\n *\n * Renders a video from JSON props using Remotion.\n */\n\nimport fs from 'node:fs';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createContainer } from '../container/index.js';\nimport { RenderService } from '../services/RenderService.js';\nimport { TYPES } from '../types/index.js';\n\ninterface RenderOptions {\n input: string;\n output: string;\n composition: string;\n codec: 'h264' | 'h265' | 'vp8' | 'vp9';\n}\n\nexport const renderCommand = new Command('render')\n .description('Render a video from JSON props file')\n .requiredOption('-i, --input <path>', 'Path to JSON props file')\n .requiredOption('-o, --output <path>', 'Output video file path')\n .option('-c, --composition <id>', 'Composition ID', 'Main')\n .option('--codec <codec>', 'Video codec (h264, h265, vp8, vp9)', 'h264')\n .action(async (options: RenderOptions) => {\n try {\n process.stderr.write(chalk.blue('🎬 Starting video render...\\n'));\n process.stderr.write(chalk.gray(` Input: ${options.input}\\n`));\n process.stderr.write(chalk.gray(` Output: ${options.output}\\n`));\n process.stderr.write(chalk.gray(` Composition: ${options.composition}\\n`));\n process.stderr.write(chalk.gray(` Codec: ${options.codec}\\n`));\n\n // Read JSON props file\n if (!fs.existsSync(options.input)) {\n process.stderr.write(chalk.red(`Error: Input file not found: ${options.input}\\n`));\n process.exit(1);\n }\n\n const propsContent = fs.readFileSync(options.input, 'utf-8');\n const inputProps = JSON.parse(propsContent) as Record<string, unknown>;\n\n // Create container and get RenderService\n const container = createContainer();\n const renderService = container.get<RenderService>(TYPES.RenderService);\n\n process.stderr.write(chalk.blue('📦 Bundling Remotion project...\\n'));\n\n const result = await renderService.render({\n compositionId: options.composition,\n inputProps,\n outputPath: options.output,\n codec: options.codec,\n });\n\n process.stderr.write(chalk.green(`✓ Video rendered successfully: ${result.outputPath}\\n`));\n } catch (error) {\n process.stderr.write(chalk.red(`Error rendering video: ${error}\\n`));\n process.exit(1);\n }\n });\n","#!/usr/bin/env node\n/**\n * MCP Server Entry Point\n *\n * DESIGN PATTERNS:\n * - CLI pattern with Commander for argument parsing\n * - Command pattern for organizing CLI commands\n * - Transport abstraction for multiple communication methods\n *\n * CODING STANDARDS:\n * - Use async/await for asynchronous operations\n * - Handle errors gracefully with try-catch\n * - Log important events for debugging\n * - Register all commands in main entry point\n *\n * AVOID:\n * - Hardcoding command logic in index.ts (use separate command files)\n * - Missing error handling for command execution\n */\nimport { Command } from 'commander';\nimport packageJson from '../package.json' with { type: 'json' };\nimport { httpServeCommand } from './commands/http-serve.js';\nimport { mcpServeCommand } from './commands/mcp-serve.js';\nimport { renderCommand } from './commands/render.js';\n\n/**\n * Main entry point\n */\nasync function main() {\n const program = new Command();\n\n program\n .name('video-editor-mcp')\n .description('MCP server for video editing with Remotion')\n .version(packageJson.version);\n\n // Add all commands\n program.addCommand(mcpServeCommand);\n program.addCommand(httpServeCommand);\n program.addCommand(renderCommand);\n\n // Parse arguments\n await program.parseAsync(process.argv);\n}\n\nmain();\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","names":["packageJson.version"],"sources":["../package.json","../src/commands/http-serve.ts","../src/commands/mcp-serve.ts","../src/commands/render.ts","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"@agimon-ai/video-editor-mcp\",\n \"description\": \"MCP server for video editing with Remotion\",\n \"version\": \"0.2.2\",\n \"license\": \"AGPL-3.0\",\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"remotion\",\n \"video-editor\",\n \"typescript\"\n ],\n \"bin\": {\n \"video-editor-mcp\": \"./dist/cli.cjs\"\n },\n \"main\": \"./dist/index.cjs\",\n \"types\": \"./dist/index.d.cts\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"dev\": \"node --loader ts-node/esm src/cli.ts mcp-serve\",\n \"build\": \"tsdown\",\n \"test\": \"vitest --run\",\n \"lint\": \"eslint src\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"1.19.1\",\n \"@remotion/bundler\": \"^4.0.0\",\n \"@remotion/captions\": \"^4.0.0\",\n \"@remotion/cli\": \"^4.0.0\",\n \"@remotion/fonts\": \"^4.0.0\",\n \"@remotion/gif\": \"^4.0.0\",\n \"@remotion/google-fonts\": \"^4.0.0\",\n \"@remotion/lottie\": \"^4.0.0\",\n \"@remotion/media-utils\": \"^4.0.0\",\n \"@remotion/renderer\": \"^4.0.0\",\n \"@remotion/transitions\": \"^4.0.0\",\n \"chalk\": \"5.4.1\",\n \"commander\": \"14.0.0\",\n \"inversify\": \"7.1.0\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"reflect-metadata\": \"0.2.2\",\n \"remotion\": \"^4.0.0\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.0.0\",\n \"@types/react\": \"^19.0.0\",\n \"tsdown\": \"0.16.1\",\n \"typescript\": \"5.9.3\",\n \"vitest\": \"4.0.18\"\n },\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./cli\": {\n \"import\": \"./dist/cli.mjs\",\n \"require\": \"./dist/cli.cjs\"\n },\n \"./package.json\": \"./package.json\"\n }\n}\n","/**\n * HTTP Serve Command\n *\n * Starts Remotion Studio for interactive video editing.\n */\n\nimport { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nexport const httpServeCommand = new Command('http-serve')\n .description('Start Remotion Studio for video editing')\n .option('-p, --port <port>', 'Port to run Remotion Studio on', '3001')\n .action(async (options: { port: string }) => {\n try {\n const port = parseInt(options.port, 10);\n\n // Get the package directory (where remotion entry point is)\n // In compiled output, files are flat in dist/, so go up one level\n const packageDir = path.resolve(import.meta.dirname, '..');\n\n console.error(chalk.green(`✓ Starting Remotion Studio on port ${port}...`));\n console.error(chalk.gray(` Working directory: ${packageDir}`));\n\n // Use the locally installed remotion CLI\n const remotionBin = path.join(packageDir, 'node_modules', '.bin', 'remotion');\n\n const studio = spawn(remotionBin, ['studio', '--port', String(port)], {\n stdio: 'inherit',\n cwd: packageDir,\n });\n\n studio.on('error', (error) => {\n console.error(chalk.red(`Failed to start Remotion Studio: ${error.message}`));\n process.exit(1);\n });\n\n process.on('SIGINT', () => {\n studio.kill('SIGINT');\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n studio.kill('SIGTERM');\n process.exit(0);\n });\n } catch (error) {\n console.error('Error executing http-serve:', error);\n process.exit(1);\n }\n });\n","/**\n * MCP Serve Command\n *\n * DESIGN PATTERNS:\n * - Command pattern with Commander for CLI argument parsing\n * - Transport abstraction pattern for flexible deployment (stdio, HTTP, SSE)\n * - Factory pattern for creating transport handlers\n * - Graceful shutdown pattern with signal handling\n *\n * CODING STANDARDS:\n * - Use async/await for asynchronous operations\n * - Implement proper error handling with try-catch blocks\n * - Handle process signals for graceful shutdown\n * - Provide clear CLI options and help messages\n *\n * AVOID:\n * - Hardcoded configuration values (use CLI options or environment variables)\n * - Missing error handling for transport startup\n * - Not cleaning up resources on shutdown\n */\n\nimport { Command } from 'commander';\nimport { createContainer } from '../container/index.js';\nimport { createServer } from '../server/index.js';\nimport { StdioTransportHandler } from '../transports/stdio.js';\n\n/**\n * Start MCP server with given transport handler\n */\nasync function startServer(handler: any) {\n await handler.start();\n\n // Handle graceful shutdown\n const shutdown = async (signal: string) => {\n console.error(`\\nReceived ${signal}, shutting down gracefully...`);\n try {\n await handler.stop();\n process.exit(0);\n } catch (error) {\n console.error('Error during shutdown:', error);\n process.exit(1);\n }\n };\n\n process.on('SIGINT', () => shutdown('SIGINT'));\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n}\n\n/**\n * MCP Serve command\n */\nexport const mcpServeCommand = new Command('mcp-serve')\n .description('Start MCP server with specified transport')\n .option('-t, --type <type>', 'Transport type: stdio', 'stdio')\n .action(async (options) => {\n try {\n const transportType = options.type.toLowerCase();\n\n if (transportType === 'stdio') {\n const container = createContainer();\n const server = createServer(container);\n const handler = new StdioTransportHandler(server);\n await startServer(handler);\n } else {\n console.error(`Unknown transport type: ${transportType}. Use: stdio`);\n process.exit(1);\n }\n } catch (error) {\n console.error('Failed to start MCP server:', error);\n process.exit(1);\n }\n });\n","/**\n * Render Command\n *\n * Renders a video from JSON props using Remotion.\n */\n\nimport fs from 'node:fs';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createContainer } from '../container/index.js';\nimport { RenderService } from '../services/RenderService.js';\nimport { TYPES } from '../types/index.js';\n\ninterface RenderOptions {\n input: string;\n output: string;\n composition: string;\n codec: 'h264' | 'h265' | 'vp8' | 'vp9';\n}\n\nexport const renderCommand = new Command('render')\n .description('Render a video from JSON props file')\n .requiredOption('-i, --input <path>', 'Path to JSON props file')\n .requiredOption('-o, --output <path>', 'Output video file path')\n .option('-c, --composition <id>', 'Composition ID', 'Main')\n .option('--codec <codec>', 'Video codec (h264, h265, vp8, vp9)', 'h264')\n .action(async (options: RenderOptions) => {\n try {\n process.stderr.write(chalk.blue('🎬 Starting video render...\\n'));\n process.stderr.write(chalk.gray(` Input: ${options.input}\\n`));\n process.stderr.write(chalk.gray(` Output: ${options.output}\\n`));\n process.stderr.write(chalk.gray(` Composition: ${options.composition}\\n`));\n process.stderr.write(chalk.gray(` Codec: ${options.codec}\\n`));\n\n // Read JSON props file\n if (!fs.existsSync(options.input)) {\n process.stderr.write(chalk.red(`Error: Input file not found: ${options.input}\\n`));\n process.exit(1);\n }\n\n const propsContent = fs.readFileSync(options.input, 'utf-8');\n const inputProps = JSON.parse(propsContent) as Record<string, unknown>;\n\n // Create container and get RenderService\n const container = createContainer();\n const renderService = container.get<RenderService>(TYPES.RenderService);\n\n process.stderr.write(chalk.blue('📦 Bundling Remotion project...\\n'));\n\n const result = await renderService.render({\n compositionId: options.composition,\n inputProps,\n outputPath: options.output,\n codec: options.codec,\n });\n\n process.stderr.write(chalk.green(`✓ Video rendered successfully: ${result.outputPath}\\n`));\n } catch (error) {\n process.stderr.write(chalk.red(`Error rendering video: ${error}\\n`));\n process.exit(1);\n }\n });\n","#!/usr/bin/env node\n/**\n * MCP Server Entry Point\n *\n * DESIGN PATTERNS:\n * - CLI pattern with Commander for argument parsing\n * - Command pattern for organizing CLI commands\n * - Transport abstraction for multiple communication methods\n *\n * CODING STANDARDS:\n * - Use async/await for asynchronous operations\n * - Handle errors gracefully with try-catch\n * - Log important events for debugging\n * - Register all commands in main entry point\n *\n * AVOID:\n * - Hardcoding command logic in index.ts (use separate command files)\n * - Missing error handling for command execution\n */\nimport { Command } from 'commander';\nimport packageJson from '../package.json' with { type: 'json' };\nimport { httpServeCommand } from './commands/http-serve.js';\nimport { mcpServeCommand } from './commands/mcp-serve.js';\nimport { renderCommand } from './commands/render.js';\n\n/**\n * Main entry point\n */\nasync function main() {\n const program = new Command();\n\n program\n .name('video-editor-mcp')\n .description('MCP server for video editing with Remotion')\n .version(packageJson.version);\n\n // Add all commands\n program.addCommand(mcpServeCommand);\n program.addCommand(httpServeCommand);\n program.addCommand(renderCommand);\n\n // Parse arguments\n await program.parseAsync(process.argv);\n}\n\nmain();\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@agimon-ai/video-editor-mcp",
3
3
  "description": "MCP server for video editing with Remotion",
4
- "version": "0.2.2",
4
+ "version": "0.2.3",
5
5
  "license": "AGPL-3.0",
6
6
  "keywords": [
7
7
  "mcp",