@studiomeyer/mcp-video 1.0.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.
Files changed (184) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
  3. package/.github/workflows/ci.yml +34 -0
  4. package/CHANGELOG.md +24 -0
  5. package/CONTRIBUTING.md +75 -0
  6. package/LICENSE +21 -0
  7. package/README.md +198 -0
  8. package/USAGE.md +144 -0
  9. package/dist/handlers/capcut.d.ts +6 -0
  10. package/dist/handlers/capcut.js +229 -0
  11. package/dist/handlers/capcut.js.map +1 -0
  12. package/dist/handlers/editing.d.ts +6 -0
  13. package/dist/handlers/editing.js +242 -0
  14. package/dist/handlers/editing.js.map +1 -0
  15. package/dist/handlers/index.d.ts +2 -0
  16. package/dist/handlers/index.js +33 -0
  17. package/dist/handlers/index.js.map +1 -0
  18. package/dist/handlers/post-production.d.ts +5 -0
  19. package/dist/handlers/post-production.js +109 -0
  20. package/dist/handlers/post-production.js.map +1 -0
  21. package/dist/handlers/smart-screenshot.d.ts +5 -0
  22. package/dist/handlers/smart-screenshot.js +83 -0
  23. package/dist/handlers/smart-screenshot.js.map +1 -0
  24. package/dist/handlers/tts.d.ts +5 -0
  25. package/dist/handlers/tts.js +83 -0
  26. package/dist/handlers/tts.js.map +1 -0
  27. package/dist/handlers/video.d.ts +5 -0
  28. package/dist/handlers/video.js +127 -0
  29. package/dist/handlers/video.js.map +1 -0
  30. package/dist/lib/dual-transport.d.ts +42 -0
  31. package/dist/lib/dual-transport.js +208 -0
  32. package/dist/lib/dual-transport.js.map +1 -0
  33. package/dist/lib/logger.d.ts +12 -0
  34. package/dist/lib/logger.js +42 -0
  35. package/dist/lib/logger.js.map +1 -0
  36. package/dist/lib/types.d.ts +16 -0
  37. package/dist/lib/types.js +15 -0
  38. package/dist/lib/types.js.map +1 -0
  39. package/dist/schemas/capcut.d.ts +608 -0
  40. package/dist/schemas/capcut.js +411 -0
  41. package/dist/schemas/capcut.js.map +1 -0
  42. package/dist/schemas/editing.d.ts +822 -0
  43. package/dist/schemas/editing.js +466 -0
  44. package/dist/schemas/editing.js.map +1 -0
  45. package/dist/schemas/index.d.ts +2366 -0
  46. package/dist/schemas/index.js +15 -0
  47. package/dist/schemas/index.js.map +1 -0
  48. package/dist/schemas/post-production.d.ts +379 -0
  49. package/dist/schemas/post-production.js +268 -0
  50. package/dist/schemas/post-production.js.map +1 -0
  51. package/dist/schemas/smart-screenshot.d.ts +127 -0
  52. package/dist/schemas/smart-screenshot.js +122 -0
  53. package/dist/schemas/smart-screenshot.js.map +1 -0
  54. package/dist/schemas/tts.d.ts +220 -0
  55. package/dist/schemas/tts.js +194 -0
  56. package/dist/schemas/tts.js.map +1 -0
  57. package/dist/schemas/video.d.ts +236 -0
  58. package/dist/schemas/video.js +210 -0
  59. package/dist/schemas/video.js.map +1 -0
  60. package/dist/server.d.ts +11 -0
  61. package/dist/server.js +239 -0
  62. package/dist/server.js.map +1 -0
  63. package/dist/server.test.d.ts +1 -0
  64. package/dist/server.test.js +87 -0
  65. package/dist/server.test.js.map +1 -0
  66. package/dist/tools/engine/audio-mixer.d.ts +40 -0
  67. package/dist/tools/engine/audio-mixer.js +169 -0
  68. package/dist/tools/engine/audio-mixer.js.map +1 -0
  69. package/dist/tools/engine/audio.d.ts +22 -0
  70. package/dist/tools/engine/audio.js +73 -0
  71. package/dist/tools/engine/audio.js.map +1 -0
  72. package/dist/tools/engine/beat-sync.d.ts +31 -0
  73. package/dist/tools/engine/beat-sync.js +270 -0
  74. package/dist/tools/engine/beat-sync.js.map +1 -0
  75. package/dist/tools/engine/capture.d.ts +12 -0
  76. package/dist/tools/engine/capture.js +290 -0
  77. package/dist/tools/engine/capture.js.map +1 -0
  78. package/dist/tools/engine/chroma-key.d.ts +27 -0
  79. package/dist/tools/engine/chroma-key.js +154 -0
  80. package/dist/tools/engine/chroma-key.js.map +1 -0
  81. package/dist/tools/engine/concat.d.ts +49 -0
  82. package/dist/tools/engine/concat.js +149 -0
  83. package/dist/tools/engine/concat.js.map +1 -0
  84. package/dist/tools/engine/cursor.d.ts +26 -0
  85. package/dist/tools/engine/cursor.js +185 -0
  86. package/dist/tools/engine/cursor.js.map +1 -0
  87. package/dist/tools/engine/easing.d.ts +15 -0
  88. package/dist/tools/engine/easing.js +100 -0
  89. package/dist/tools/engine/easing.js.map +1 -0
  90. package/dist/tools/engine/editing.d.ts +158 -0
  91. package/dist/tools/engine/editing.js +541 -0
  92. package/dist/tools/engine/editing.js.map +1 -0
  93. package/dist/tools/engine/encoder.d.ts +31 -0
  94. package/dist/tools/engine/encoder.js +154 -0
  95. package/dist/tools/engine/encoder.js.map +1 -0
  96. package/dist/tools/engine/index.d.ts +30 -0
  97. package/dist/tools/engine/index.js +23 -0
  98. package/dist/tools/engine/index.js.map +1 -0
  99. package/dist/tools/engine/lut-presets.d.ts +25 -0
  100. package/dist/tools/engine/lut-presets.js +141 -0
  101. package/dist/tools/engine/lut-presets.js.map +1 -0
  102. package/dist/tools/engine/narrated-video.d.ts +63 -0
  103. package/dist/tools/engine/narrated-video.js +163 -0
  104. package/dist/tools/engine/narrated-video.js.map +1 -0
  105. package/dist/tools/engine/scenes.d.ts +17 -0
  106. package/dist/tools/engine/scenes.js +223 -0
  107. package/dist/tools/engine/scenes.js.map +1 -0
  108. package/dist/tools/engine/smart-screenshot.d.ts +80 -0
  109. package/dist/tools/engine/smart-screenshot.js +744 -0
  110. package/dist/tools/engine/smart-screenshot.js.map +1 -0
  111. package/dist/tools/engine/social-format.d.ts +66 -0
  112. package/dist/tools/engine/social-format.js +107 -0
  113. package/dist/tools/engine/social-format.js.map +1 -0
  114. package/dist/tools/engine/template-renderer.d.ts +45 -0
  115. package/dist/tools/engine/template-renderer.js +233 -0
  116. package/dist/tools/engine/template-renderer.js.map +1 -0
  117. package/dist/tools/engine/templates.d.ts +87 -0
  118. package/dist/tools/engine/templates.js +272 -0
  119. package/dist/tools/engine/templates.js.map +1 -0
  120. package/dist/tools/engine/text-animations.d.ts +33 -0
  121. package/dist/tools/engine/text-animations.js +192 -0
  122. package/dist/tools/engine/text-animations.js.map +1 -0
  123. package/dist/tools/engine/text-overlay.d.ts +27 -0
  124. package/dist/tools/engine/text-overlay.js +84 -0
  125. package/dist/tools/engine/text-overlay.js.map +1 -0
  126. package/dist/tools/engine/tts.d.ts +54 -0
  127. package/dist/tools/engine/tts.js +186 -0
  128. package/dist/tools/engine/tts.js.map +1 -0
  129. package/dist/tools/engine/types.d.ts +166 -0
  130. package/dist/tools/engine/types.js +13 -0
  131. package/dist/tools/engine/types.js.map +1 -0
  132. package/dist/tools/engine/voice-effects.d.ts +18 -0
  133. package/dist/tools/engine/voice-effects.js +215 -0
  134. package/dist/tools/engine/voice-effects.js.map +1 -0
  135. package/dist/tools/index.d.ts +32 -0
  136. package/dist/tools/index.js +23 -0
  137. package/dist/tools/index.js.map +1 -0
  138. package/package.json +56 -0
  139. package/scripts/check-deps.js +39 -0
  140. package/src/handlers/capcut.ts +245 -0
  141. package/src/handlers/editing.ts +260 -0
  142. package/src/handlers/index.ts +34 -0
  143. package/src/handlers/post-production.ts +136 -0
  144. package/src/handlers/smart-screenshot.ts +86 -0
  145. package/src/handlers/tts.ts +103 -0
  146. package/src/handlers/video.ts +137 -0
  147. package/src/lib/dual-transport.ts +272 -0
  148. package/src/lib/logger.ts +59 -0
  149. package/src/lib/types.ts +25 -0
  150. package/src/schemas/capcut.ts +418 -0
  151. package/src/schemas/editing.ts +476 -0
  152. package/src/schemas/index.ts +15 -0
  153. package/src/schemas/post-production.ts +273 -0
  154. package/src/schemas/smart-screenshot.ts +122 -0
  155. package/src/schemas/tts.ts +197 -0
  156. package/src/schemas/video.ts +211 -0
  157. package/src/server.test.ts +99 -0
  158. package/src/server.ts +289 -0
  159. package/src/tools/engine/audio-mixer.ts +244 -0
  160. package/src/tools/engine/audio.ts +115 -0
  161. package/src/tools/engine/beat-sync.ts +356 -0
  162. package/src/tools/engine/capture.ts +360 -0
  163. package/src/tools/engine/chroma-key.ts +202 -0
  164. package/src/tools/engine/concat.ts +242 -0
  165. package/src/tools/engine/cursor.ts +222 -0
  166. package/src/tools/engine/easing.ts +120 -0
  167. package/src/tools/engine/editing.ts +809 -0
  168. package/src/tools/engine/encoder.ts +208 -0
  169. package/src/tools/engine/index.ts +33 -0
  170. package/src/tools/engine/lut-presets.ts +235 -0
  171. package/src/tools/engine/narrated-video.ts +267 -0
  172. package/src/tools/engine/scenes.ts +309 -0
  173. package/src/tools/engine/smart-screenshot.ts +923 -0
  174. package/src/tools/engine/social-format.ts +146 -0
  175. package/src/tools/engine/template-renderer.ts +294 -0
  176. package/src/tools/engine/templates.ts +370 -0
  177. package/src/tools/engine/text-animations.ts +282 -0
  178. package/src/tools/engine/text-overlay.ts +143 -0
  179. package/src/tools/engine/tts.ts +284 -0
  180. package/src/tools/engine/types.ts +191 -0
  181. package/src/tools/engine/voice-effects.ts +258 -0
  182. package/src/tools/index.ts +67 -0
  183. package/tsconfig.json +19 -0
  184. package/vitest.config.ts +7 -0
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Dual Transport for MCP Servers — Stdio + Streamable HTTP
3
+ *
4
+ * Default: stdio (backward compatible, used by Claude Code via subprocess)
5
+ * --http: Streamable HTTP on configurable port (persistent HTTP microservice)
6
+ *
7
+ * Usage:
8
+ * startDualTransport(createMcpServer, { serverName, serverVersion, defaultPort })
9
+ *
10
+ * HTTP mode flags:
11
+ * --http Enable HTTP transport
12
+ * --port=XXXX Override default port
13
+ * MCP_HTTP=1 Enable via env var
14
+ * MCP_PORT=XXXX Override port via env var
15
+ */
16
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
17
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
18
+ import { createServer as createHttpServer } from 'node:http';
19
+ import { randomUUID } from 'node:crypto';
20
+ import { logger } from './logger.js';
21
+ // ─── Detection ───────────────────────────────────────
22
+ function isHttpMode() {
23
+ return (process.argv.includes('--http') ||
24
+ process.env.MCP_HTTP === '1' ||
25
+ process.env.MCP_HTTP === 'true');
26
+ }
27
+ function getPort(defaultPort) {
28
+ const portArg = process.argv.find((a) => a.startsWith('--port='));
29
+ if (portArg) {
30
+ const parsed = parseInt(portArg.split('=')[1], 10);
31
+ if (!isNaN(parsed))
32
+ return parsed;
33
+ }
34
+ if (process.env.MCP_PORT) {
35
+ const parsed = parseInt(process.env.MCP_PORT, 10);
36
+ if (!isNaN(parsed))
37
+ return parsed;
38
+ }
39
+ return defaultPort;
40
+ }
41
+ // ─── Main Entry ──────────────────────────────────────
42
+ /**
43
+ * Start an MCP server with dual transport support.
44
+ *
45
+ * @param createServer - Factory that creates a fresh MCP server (McpServer or Server)
46
+ * @param options - Server name, version, and default HTTP port
47
+ *
48
+ * For stdio: creates one server, connects to StdioServerTransport.
49
+ * For HTTP: creates a new server per session, connects to StreamableHTTPServerTransport.
50
+ */
51
+ export async function startDualTransport(createServer, options) {
52
+ if (isHttpMode()) {
53
+ return startHttpTransport(createServer, options);
54
+ }
55
+ return startStdioTransport(createServer, options);
56
+ }
57
+ // ─── Stdio Transport ─────────────────────────────────
58
+ async function startStdioTransport(createServer, options) {
59
+ const server = createServer();
60
+ const transport = new StdioServerTransport();
61
+ await server.connect(transport);
62
+ logger.info(`${options.serverName} v${options.serverVersion} started (stdio)`);
63
+ return { type: 'stdio' };
64
+ }
65
+ async function startHttpTransport(createServer, options) {
66
+ const port = getPort(options.defaultPort);
67
+ const sessions = new Map();
68
+ const httpServer = createHttpServer(async (req, res) => {
69
+ try {
70
+ await handleHttpRequest(req, res, sessions, createServer, options);
71
+ }
72
+ catch (err) {
73
+ logger.logError('HTTP request error', err);
74
+ if (!res.headersSent) {
75
+ res.writeHead(500, { 'Content-Type': 'application/json' });
76
+ res.end(JSON.stringify({ error: 'Internal server error' }));
77
+ }
78
+ }
79
+ });
80
+ const host = process.env.MCP_HOST || '127.0.0.1';
81
+ httpServer.listen(port, host, () => {
82
+ logger.info(`${options.serverName} v${options.serverVersion} started (HTTP on ${host}:${port})`);
83
+ });
84
+ // Session cleanup: remove stale sessions older than 30 minutes
85
+ const cleanupInterval = setInterval(() => {
86
+ const now = Date.now();
87
+ const staleThreshold = 30 * 60 * 1000;
88
+ for (const [sid, session] of sessions) {
89
+ if (now - session.createdAt > staleThreshold) {
90
+ session.transport.close();
91
+ sessions.delete(sid);
92
+ logger.info(`Session expired: ${sid.slice(0, 8)}...`);
93
+ }
94
+ }
95
+ }, 60_000);
96
+ // Graceful shutdown
97
+ const shutdown = () => {
98
+ logger.info('Shutting down HTTP transport...');
99
+ clearInterval(cleanupInterval);
100
+ for (const [, session] of sessions) {
101
+ session.transport.close();
102
+ }
103
+ httpServer.close();
104
+ process.exit(0);
105
+ };
106
+ process.on('SIGINT', shutdown);
107
+ process.on('SIGTERM', shutdown);
108
+ return { type: 'http', port };
109
+ }
110
+ // ─── Request Handler ─────────────────────────────────
111
+ async function handleHttpRequest(req, res, sessions, createServer, options) {
112
+ // CORS headers
113
+ res.setHeader('Access-Control-Allow-Origin', '*');
114
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
115
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, MCP-Session-ID');
116
+ res.setHeader('Access-Control-Expose-Headers', 'MCP-Session-ID');
117
+ if (req.method === 'OPTIONS') {
118
+ res.writeHead(204);
119
+ res.end();
120
+ return;
121
+ }
122
+ // Health check endpoint
123
+ if (req.url === '/health') {
124
+ res.writeHead(200, { 'Content-Type': 'application/json' });
125
+ res.end(JSON.stringify({
126
+ status: 'ok',
127
+ server: options.serverName,
128
+ version: options.serverVersion,
129
+ transport: 'streamable-http',
130
+ sessions: sessions.size,
131
+ }));
132
+ return;
133
+ }
134
+ // MCP endpoint
135
+ if (req.url === '/mcp') {
136
+ const sessionId = req.headers['mcp-session-id'];
137
+ if (req.method === 'POST') {
138
+ const body = await parseBody(req);
139
+ if (sessionId && sessions.has(sessionId)) {
140
+ await sessions.get(sessionId).transport.handleRequest(req, res, body);
141
+ }
142
+ else if (!sessionId) {
143
+ const mcpServer = createServer();
144
+ const transport = new StreamableHTTPServerTransport({
145
+ sessionIdGenerator: () => randomUUID(),
146
+ onsessioninitialized: (sid) => {
147
+ sessions.set(sid, { transport, createdAt: Date.now() });
148
+ logger.info(`Session created: ${sid.slice(0, 8)}... (${sessions.size} active)`);
149
+ },
150
+ onsessionclosed: (sid) => {
151
+ sessions.delete(sid);
152
+ logger.info(`Session closed: ${sid.slice(0, 8)}... (${sessions.size} active)`);
153
+ },
154
+ });
155
+ await mcpServer.connect(transport);
156
+ await transport.handleRequest(req, res, body);
157
+ }
158
+ else {
159
+ res.writeHead(404, { 'Content-Type': 'application/json' });
160
+ res.end(JSON.stringify({ error: 'Session not found', code: 'SESSION_NOT_FOUND' }));
161
+ }
162
+ return;
163
+ }
164
+ if (req.method === 'GET') {
165
+ if (sessionId && sessions.has(sessionId)) {
166
+ await sessions.get(sessionId).transport.handleRequest(req, res);
167
+ }
168
+ else {
169
+ res.writeHead(400, { 'Content-Type': 'application/json' });
170
+ res.end(JSON.stringify({ error: 'Invalid or missing session ID', code: 'INVALID_SESSION' }));
171
+ }
172
+ return;
173
+ }
174
+ if (req.method === 'DELETE') {
175
+ if (sessionId && sessions.has(sessionId)) {
176
+ const session = sessions.get(sessionId);
177
+ await session.transport.handleRequest(req, res);
178
+ sessions.delete(sessionId);
179
+ }
180
+ else {
181
+ res.writeHead(404, { 'Content-Type': 'application/json' });
182
+ res.end(JSON.stringify({ error: 'Session not found', code: 'SESSION_NOT_FOUND' }));
183
+ }
184
+ return;
185
+ }
186
+ }
187
+ // 404 for anything else
188
+ res.writeHead(404, { 'Content-Type': 'application/json' });
189
+ res.end(JSON.stringify({ error: 'Not found', code: 'NOT_FOUND' }));
190
+ }
191
+ // ─── Body Parser ─────────────────────────────────────
192
+ function parseBody(req) {
193
+ return new Promise((resolve, reject) => {
194
+ const chunks = [];
195
+ req.on('data', (chunk) => chunks.push(chunk));
196
+ req.on('end', () => {
197
+ const body = Buffer.concat(chunks).toString('utf-8');
198
+ try {
199
+ resolve(body ? JSON.parse(body) : undefined);
200
+ }
201
+ catch {
202
+ resolve(undefined);
203
+ }
204
+ });
205
+ req.on('error', reject);
206
+ });
207
+ }
208
+ //# sourceMappingURL=dual-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dual-transport.js","sourceRoot":"","sources":["../../src/lib/dual-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAA6C,MAAM,WAAW,CAAC;AACxG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAsBrC,wDAAwD;AAExD,SAAS,UAAU;IACjB,OAAO,CACL,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,GAAG;QAC5B,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,WAAmB;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;IACpC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,wDAAwD;AAExD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAA8B,EAC9B,OAA6B;IAE7B,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,OAAO,kBAAkB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,mBAAmB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,wDAAwD;AAExD,KAAK,UAAU,mBAAmB,CAChC,YAA8B,EAC9B,OAA6B;IAE7B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,aAAa,kBAAkB,CAAC,CAAC;IAC/E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AASD,KAAK,UAAU,kBAAkB,CAC/B,YAA8B,EAC9B,OAA6B;IAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEjD,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAE,EAAE;QACtF,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,WAAW,CAAC;IACjD,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,aAAa,qBAAqB,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;IACnG,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACtC,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;YACtC,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,GAAG,cAAc,EAAE,CAAC;gBAC7C,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBAC1B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC,EAAE,MAAM,CAAC,CAAC;IAEX,oBAAoB;IACpB,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,aAAa,CAAC,eAAe,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;YACnC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;QACD,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,wDAAwD;AAExD,KAAK,UAAU,iBAAiB,CAC9B,GAAoB,EACpB,GAAmB,EACnB,QAAmC,EACnC,YAA8B,EAC9B,OAA6B;IAE7B,eAAe;IACf,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,4BAA4B,CAAC,CAAC;IAC5E,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,8BAA8B,CAAC,CAAC;IAC9E,GAAG,CAAC,SAAS,CAAC,+BAA+B,EAAE,gBAAgB,CAAC,CAAC;IAEjE,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;YACb,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,OAAO,CAAC,UAAU;YAC1B,OAAO,EAAE,OAAO,CAAC,aAAa;YAC9B,SAAS,EAAE,iBAAiB;YAC5B,QAAQ,EAAE,QAAQ,CAAC,IAAI;SACxB,CAAC,CACH,CAAC;QACF,OAAO;IACT,CAAC;IAED,eAAe;IACf,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QAEtE,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;YAElC,IAAI,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzC,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACzE,CAAC;iBAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;oBAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;oBACtC,oBAAoB,EAAE,CAAC,GAAW,EAAE,EAAE;wBACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBACxD,MAAM,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,QAAQ,CAAC,IAAI,UAAU,CAAC,CAAC;oBAClF,CAAC;oBACD,eAAe,EAAE,CAAC,GAAW,EAAE,EAAE;wBAC/B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBACrB,MAAM,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,QAAQ,CAAC,IAAI,UAAU,CAAC,CAAC;oBACjF,CAAC;iBACF,CAAC,CAAC;gBAEH,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;YACrF,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACzB,IAAI,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzC,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;YAC/F,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;gBACzC,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAChD,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;YACrF,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,wDAAwD;AAExD,SAAS,SAAS,CAAC,GAAoB;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACrD,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Structured logging for mcp-video
3
+ * Logs to stderr to not interfere with MCP protocol on stdout
4
+ */
5
+ export declare const logger: {
6
+ debug: (message: string, context?: Record<string, unknown>) => void;
7
+ info: (message: string, context?: Record<string, unknown>) => void;
8
+ warn: (message: string, context?: Record<string, unknown>) => void;
9
+ error: (message: string, context?: Record<string, unknown>) => void;
10
+ logError: (message: string, error: unknown, context?: Record<string, unknown>) => void;
11
+ };
12
+ export type Logger = typeof logger;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Structured logging for mcp-video
3
+ * Logs to stderr to not interfere with MCP protocol on stdout
4
+ */
5
+ const DEBUG = process.env.DEBUG?.includes('mcp-video') || process.env.MCP_VIDEO_DEBUG === '1';
6
+ function formatEntry(entry) {
7
+ const prefix = `[${entry.timestamp}] [${entry.level.toUpperCase()}]`;
8
+ const ctx = entry.context ? ` ${JSON.stringify(entry.context)}` : '';
9
+ return `${prefix} ${entry.message}${ctx}`;
10
+ }
11
+ function log(level, message, context) {
12
+ if (level === 'debug' && !DEBUG)
13
+ return;
14
+ const entry = {
15
+ level,
16
+ message,
17
+ context,
18
+ timestamp: new Date().toISOString(),
19
+ };
20
+ console.error(formatEntry(entry));
21
+ }
22
+ export const logger = {
23
+ debug: (message, context) => log('debug', message, context),
24
+ info: (message, context) => log('info', message, context),
25
+ warn: (message, context) => log('warn', message, context),
26
+ error: (message, context) => log('error', message, context),
27
+ logError: (message, error, context) => {
28
+ const errorContext = { ...context };
29
+ if (error instanceof Error) {
30
+ errorContext.errorMessage = error.message;
31
+ errorContext.errorName = error.name;
32
+ if (DEBUG && error.stack) {
33
+ errorContext.stack = error.stack;
34
+ }
35
+ }
36
+ else {
37
+ errorContext.error = String(error);
38
+ }
39
+ log('error', message, errorContext);
40
+ },
41
+ };
42
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC;AAE9F,SAAS,WAAW,CAAC,KAAe;IAClC,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC;IACrE,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,OAAiC;IAC9E,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,KAAK;QAAE,OAAO;IAExC,MAAM,KAAK,GAAa;QACtB,KAAK;QACL,OAAO;QACP,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,OAAe,EAAE,OAAiC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;IAC7F,IAAI,EAAE,CAAC,OAAe,EAAE,OAAiC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IAC3F,IAAI,EAAE,CAAC,OAAe,EAAE,OAAiC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IAC3F,KAAK,EAAE,CAAC,OAAe,EAAE,OAAiC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;IAE7F,QAAQ,EAAE,CAAC,OAAe,EAAE,KAAc,EAAE,OAAiC,EAAE,EAAE;QAC/E,MAAM,YAAY,GAA4B,EAAE,GAAG,OAAO,EAAE,CAAC;QAE7D,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,YAAY,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;YAC1C,YAAY,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;YACpC,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACzB,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YACnC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QAED,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACtC,CAAC;CACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Shared types for MCP tool handlers
3
+ */
4
+ export interface ToolResponse {
5
+ [key: string]: unknown;
6
+ content: Array<{
7
+ type: string;
8
+ text: string;
9
+ }>;
10
+ isError?: boolean;
11
+ }
12
+ export type ToolHandler = (args: any) => ToolResponse | Promise<ToolResponse>;
13
+ /** Helper to wrap a JSON result into a ToolResponse */
14
+ export declare function jsonResponse(result: unknown, isError?: boolean): ToolResponse;
15
+ /** Helper to create an error ToolResponse with structured error code */
16
+ export declare function errorResponse(message: string, code?: string): ToolResponse;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Shared types for MCP tool handlers
3
+ */
4
+ /** Helper to wrap a JSON result into a ToolResponse */
5
+ export function jsonResponse(result, isError) {
6
+ return {
7
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
8
+ ...(isError !== undefined ? { isError } : {}),
9
+ };
10
+ }
11
+ /** Helper to create an error ToolResponse with structured error code */
12
+ export function errorResponse(message, code) {
13
+ return jsonResponse({ error: message, code: code ?? 'INTERNAL_ERROR' }, true);
14
+ }
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,MAAe,EAAE,OAAiB;IAC7D,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,IAAa;IAC1D,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,gBAAgB,EAAE,EAAE,IAAI,CAAC,CAAC;AAChF,CAAC"}