@amg555/frameforge-mcp 2.7.1 → 2.7.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.
@@ -1,291 +1,441 @@
1
- # MCP Tool Reference
2
-
3
- FrameForge exposes **28 tools** on the HTTP MCP server (`http://localhost:3210`)
4
- and via the Cloudflare Remote MCP proxy. Any MCP-compatible client works:
5
- IBM Bob, Claude Code, Codex, opencode, Cursor, Windsurf, Kiro, Copilot.
6
-
7
- ---
8
-
9
- ## Agent-first path (recommended)
10
-
11
- The IDE writes the scenes array; FrameForge renders it.
12
-
13
- ### create_video_from_script
14
-
15
- ```json
16
- {
17
- "scenes": [
18
- {
19
- "narration": "WiFi sends data as invisible radio waves.",
20
- "caption": "RADIO WAVES",
21
- "visual_description": "router emitting waves, flat illustration",
22
- "camera_hint": "slow_zoom_in",
23
- "music_mood": "calm"
24
- }
25
- ],
26
- "title": "How WiFi Works",
27
- "skipImages": false,
28
- "withMusic": true
29
- }
30
- ```
31
-
32
- Returns: `{ productionId, masterPath, passed, sizeBytes, sceneCount }`
33
-
34
- ---
35
-
36
- ## Full pipeline path
37
-
38
- ### research_topic
39
-
40
- ```json
41
- { "topic": "How does GPS work?", "claimCount": 10, "style": "educational" }
42
- ```
43
-
44
- ### write_script
45
-
46
- ```json
47
- {
48
- "productionId": "prod-001",
49
- "claims": ["..."],
50
- "topic": "How does GPS work?",
51
- "persona": "tech explainer",
52
- "sceneCount": 15
53
- }
54
- ```
55
-
56
- Returns: `{ productionId, scenes, title, description, tags, sceneCount }`
57
-
58
- ### render_from_scenes
59
-
60
- ```json
61
- { "productionId": "prod-001", "skipImages": false, "withMusic": true }
62
- ```
63
-
64
- ### publish_video
65
-
66
- ```json
67
- {
68
- "productionId": "prod-001",
69
- "masterPath": "/path/to/final_video.mp4",
70
- "channels": ["file"],
71
- "outputDir": "/path/to/output"
72
- }
73
- ```
74
-
75
- Channels:
76
- - `file` — copy master + shorts to `outputDir` (or `N8N_FILES_DIR/published/`)
77
- - `webhook` — POST JSON summary to `PUBLISH_WEBHOOK_URL`
78
-
79
- ---
80
-
81
- ## Edit path
82
-
83
- ### ingest_media
84
-
85
- ```json
86
- { "files": ["/path/to/clip1.mp4", "/path/to/clip2.mp4"], "title": "My Video" }
87
- ```
88
-
89
- ### edit_scenes
90
-
91
- ```json
92
- {
93
- "productionId": "prod-001",
94
- "edits": [{ "sceneIndex": 0, "field": "caption", "value": "NEW CAPTION" }]
95
- }
96
- ```
97
-
98
- ---
99
-
100
- ## TTS
101
-
102
- ### multi_voice_tts
103
-
104
- ```json
105
- {
106
- "text": "The text to speak aloud.",
107
- "outputPath": "/files-dir/voice_0.m4a",
108
- "platform": "elevenlabs",
109
- "voice": "your_cloned_voice_id",
110
- "apiKey": "sk_..."
111
- }
112
- ```
113
-
114
- ---
115
-
116
- ## Async job control
117
-
118
- ### queue_full_pipeline
119
-
120
- ```json
121
- {
122
- "topic": "Why planes avoid straight lines",
123
- "style": "educational",
124
- "channels": ["file"]
125
- }
126
- ```
127
-
128
- Returns `{ jobId, status }` immediately. Poll `get_job_status` for completion.
129
-
130
- ### get_job_status
131
-
132
- ```json
133
- { "jobId": "job_1234567890_abc123" }
134
- ```
135
-
136
- Returns `{ status: "RUNNING"|"SUCCEEDED"|"FAILED", result, error }`
137
-
138
- ---
139
-
140
- ## External platform
141
-
142
- ### external_platform_call
143
-
144
- ```json
145
- { "action": "ingest", "files": ["/path/to/clip.mp4"] }
146
- ```
147
-
148
- Actions: `ingest` | `render` | `status` | `download`.
149
- Configure with `EXTERNAL_PLATFORM_URL` + `EXTERNAL_PLATFORM_KEY` in `.env`.
150
-
151
- ---
152
-
153
- ## Media ingestion (yt-dlp & Whisper)
154
-
155
- ### ingest_url — Download from any web URL
156
-
157
- ```json
158
- {
159
- "url": "https://youtube.com/watch?v=...",
160
- "format": "video",
161
- "outputDir": ".frameforge-files/downloads/"
162
- }
163
- ```
164
-
165
- Requires `yt-dlp` in PATH. Supports 1000+ sites. Returns `{ localPath, duration, width, height }`.
166
-
167
- ### transcribe_media — Whisper word-level timestamps
168
-
169
- ```json
170
- {
171
- "mediaPath": ".frameforge-files/voice_0.m4a",
172
- "model": "base",
173
- "format": "all",
174
- "language": "en"
175
- }
176
- ```
177
-
178
- Returns `{ outputs: { ndjson, srt, json }, pauses, wordCount }`. NDJSON feeds `captions()` in engine.js.
179
-
180
- ---
181
-
182
- ## Professional audio post-production
183
-
184
- ### mix_audio_pro — 15+ year sound engineer chain
185
-
186
- ```json
187
- {
188
- "voicePath": ".frameforge-files/voice_0.m4a",
189
- "outputPath": ".frameforge-files/audio_pro.m4a",
190
- "musicPath": "/path/to/bg-music.mp3",
191
- "platform": "youtube",
192
- "roomProfile": "cinematic",
193
- "noiseGate": true,
194
- "stereoWiden": true,
195
- "sfxCues": [
196
- { "name": "whoosh", "time": 2.5, "volume": 0.8 },
197
- { "name": "impact", "time": 8.0, "volume": 1.0 },
198
- { "name": "riser", "time": 18.0, "volume": 0.7 },
199
- { "name": "deep_boom","time": 30.0, "volume": 0.9 },
200
- { "name": "sparkle", "time": 35.2, "volume": 0.4 }
201
- ]
202
- }
203
- ```
204
-
205
- Chain: noise gate → 80Hz HPF → presence EQ → de-esser → compressor → room acoustics → sidechain duck → stereo widen → SFX → EBU R128 loudnorm.
206
- SFX types: whoosh | impact | pop | click | riser | chime | buzz | tick | swish | punch | sparkle | deep_boom | transition
207
- Room profiles: studio_dry | broadcast | cinematic | concert_hall | intimate
208
- Platform presets: youtube (-14 LUFS) | podcast (-16) | broadcast (-23) | netflix (-27) | instagram (-14)
209
-
210
- ---
211
-
212
- ## Video editing & planning
213
-
214
- ### plan_video_edit — Plan/Approve/Render
215
-
216
- ```json
217
- {
218
- "footage": ["/path/clip1.mp4", "/path/clip2.mp4"],
219
- "goal": "Create a cinematic product showcase",
220
- "style": "cinematic_anamorphic",
221
- "target_duration": 60,
222
- "audio_path": ".frameforge-files/voice_0.m4a",
223
- "music_path": "/path/to/bg.mp3"
224
- }
225
- ```
226
-
227
- Style options include all lemo-opuscar film styles:
228
- `cinematic` | `fast_paced` | `documentary` | `vintage` | `cyberpunk` | `vibrant`
229
- `editorial_collage` | `retro_vhs` | `anime_action` | `sci_fi_hud` | `lofi_chill` | `minimal_monochrome`
230
- `cinematic_anamorphic` | `broadcast_news` | `blueprint_3d` | `film_16mm` | `product_obsidian` | `retro_vhs_80s`
231
-
232
- Returns: `{ planPath, editJsonPath, planMarkdown, editConfig }`.
233
-
234
- ### sync_upstream_skills — Fetch new commits from 9 reference repos
235
-
236
- ```json
237
- { "silent": false }
238
- ```
239
-
240
- Makes GitHub API requests. Returns `{ updatedRepos, perCategoryUpdates, lastSync }`.
241
- Each category update includes: `repo`, `sha`, `desc`, `userImpact`, `capabilities[]`.
242
-
243
- Tracked repos: HyperFrames, lemo-opuscar, OneTake, gbro-collage-broll, remotion-dev/skills,
244
- earshot, ClaudeAnimationBase, claude-remotion-skill, ffmpeg-skill.
245
-
246
- ### check_upstream_updates — Fast offline manifest read
247
-
248
- ```json
249
- {}
250
- ```
251
-
252
- No network requests — reads the local manifest only. Returns:
253
- ```json
254
- {
255
- "lastSync": "2026-11-11T20:00:00Z",
256
- "manifestVersion": "2.7.0",
257
- "totalRepos": 9,
258
- "syncedCount": 9,
259
- "repos": [
260
- {
261
- "id": "hyperframes",
262
- "repo": "heygen-com/hyperframes",
263
- "category": "compositor",
264
- "sha": "a1b2c3d",
265
- "lastChecked": "...",
266
- "userImpact": "New compositor patterns or GSAP animation primitives available"
267
- }
268
- ],
269
- "hint": "Run sync_upstream_skills to fetch latest commits from GitHub."
270
- }
271
- ```
272
-
273
- Call this to show users their current sync status without making any API calls.
274
-
275
- ---
276
-
277
- ## Calling from any IDE
278
-
279
- Any IDE that supports MCP calls these tools via JSON-RPC:
280
-
281
- ```json
282
- POST http://localhost:3210
283
- {
284
- "method": "tools/call",
285
- "params": {
286
- "name": "create_video_from_script",
287
- "arguments": { "scenes": [...] }
288
- },
289
- "id": 1
290
- }
291
- ```
1
+ # MCP Tool Reference
2
+
3
+ FrameForge exposes **28 tools** on the HTTP MCP server (`http://localhost:3210`)
4
+ and via the Cloudflare Remote MCP proxy. Any MCP-compatible client works:
5
+ IBM Bob, Claude Code, Codex, opencode, Cursor, Windsurf, Kiro, Copilot.
6
+
7
+ ---
8
+
9
+ ## Agent-first path (recommended)
10
+
11
+ The IDE writes the scenes array; FrameForge renders it.
12
+
13
+ ### create_video_from_script
14
+
15
+ ```json
16
+ {
17
+ "scenes": [
18
+ {
19
+ "narration": "WiFi sends data as invisible radio waves.",
20
+ "caption": "RADIO WAVES",
21
+ "visual_description": "router emitting waves, flat illustration",
22
+ "camera_hint": "slow_zoom_in",
23
+ "music_mood": "calm"
24
+ }
25
+ ],
26
+ "title": "How WiFi Works",
27
+ "skipImages": false,
28
+ "withMusic": true
29
+ }
30
+ ```
31
+
32
+ Returns: `{ productionId, masterPath, passed, sizeBytes, sceneCount }`
33
+
34
+ ---
35
+
36
+ ## Full pipeline path
37
+
38
+ ### research_topic
39
+
40
+ ```json
41
+ { "topic": "How does GPS work?", "claimCount": 10, "style": "educational" }
42
+ ```
43
+
44
+ ### write_script
45
+
46
+ ```json
47
+ {
48
+ "productionId": "prod-001",
49
+ "claims": ["..."],
50
+ "topic": "How does GPS work?",
51
+ "persona": "tech explainer",
52
+ "sceneCount": 15
53
+ }
54
+ ```
55
+
56
+ Returns: `{ productionId, scenes, title, description, tags, sceneCount }`
57
+
58
+ ### generate_scene_image
59
+
60
+ ```json
61
+ {
62
+ "productionId": "prod-001",
63
+ "sceneIndex": 0,
64
+ "visualDescription": "router emitting waves, flat illustration",
65
+ "imagePath": "/optional/custom/image.png"
66
+ }
67
+ ```
68
+
69
+ Registers or generates code-driven visual card for one scene.
70
+
71
+ ### render_tts
72
+
73
+ ```json
74
+ {
75
+ "productionId": "prod-001",
76
+ "sceneIndex": 0,
77
+ "text": "WiFi sends data as invisible radio waves.",
78
+ "voice": "en-US-GuyNeural"
79
+ }
80
+ ```
81
+
82
+ Converts scene narration text to audio using configured TTS provider.
83
+
84
+ ### assemble_video
85
+
86
+ ```json
87
+ {
88
+ "productionId": "prod-001",
89
+ "sceneCount": 15,
90
+ "withMusic": true,
91
+ "musicVolume": 0.07
92
+ }
93
+ ```
94
+
95
+ Assembles rendered scenes into final MP4 and validates quality gate.
96
+
97
+ ### render_from_scenes
98
+
99
+ ```json
100
+ { "productionId": "prod-001", "skipImages": false, "withMusic": true }
101
+ ```
102
+
103
+ ### publish_video
104
+
105
+ ```json
106
+ {
107
+ "productionId": "prod-001",
108
+ "masterPath": "/path/to/final_video.mp4",
109
+ "channels": ["file"],
110
+ "outputDir": "/path/to/output"
111
+ }
112
+ ```
113
+
114
+ Channels:
115
+ - `file` — copy master + shorts to `outputDir` (or `N8N_FILES_DIR/published/`)
116
+ - `webhook` — POST JSON summary to `PUBLISH_WEBHOOK_URL`
117
+
118
+ ---
119
+
120
+ ## Edit path
121
+
122
+ ### ingest_media
123
+
124
+ ```json
125
+ { "files": ["/path/to/clip1.mp4", "/path/to/clip2.mp4"], "title": "My Video" }
126
+ ```
127
+
128
+ ### edit_scenes
129
+
130
+ ```json
131
+ {
132
+ "productionId": "prod-001",
133
+ "edits": [{ "sceneIndex": 0, "field": "caption", "value": "NEW CAPTION" }]
134
+ }
135
+ ```
136
+
137
+ ---
138
+
139
+ ## TTS
140
+
141
+ ### multi_voice_tts
142
+
143
+ ```json
144
+ {
145
+ "text": "The text to speak aloud.",
146
+ "outputPath": "/files-dir/voice_0.m4a",
147
+ "platform": "elevenlabs",
148
+ "voice": "your_cloned_voice_id",
149
+ "apiKey": "sk_..."
150
+ }
151
+ ```
152
+
153
+ ---
154
+
155
+ ## Async job control
156
+
157
+ ### queue_full_pipeline
158
+
159
+ ```json
160
+ {
161
+ "topic": "Why planes avoid straight lines",
162
+ "style": "educational",
163
+ "channels": ["file"]
164
+ }
165
+ ```
166
+
167
+ Returns `{ jobId, status }` immediately. Poll `get_job_status` for completion.
168
+
169
+ ### get_job_status
170
+
171
+ ```json
172
+ { "jobId": "job_1234567890_abc123" }
173
+ ```
174
+
175
+ Returns `{ status: "RUNNING"|"SUCCEEDED"|"FAILED", result, error }`
176
+
177
+ ---
178
+
179
+ ## External platform
180
+
181
+ ### external_platform_call
182
+
183
+ ```json
184
+ { "action": "ingest", "files": ["/path/to/clip.mp4"] }
185
+ ```
186
+
187
+ Actions: `ingest` | `render` | `status` | `download`.
188
+ Configure with `EXTERNAL_PLATFORM_URL` + `EXTERNAL_PLATFORM_KEY` in `.env`.
189
+
190
+ ---
191
+
192
+ ## Media ingestion (yt-dlp & Whisper)
193
+
194
+ ### ingest_url — Download from any web URL
195
+
196
+ ```json
197
+ {
198
+ "url": "https://youtube.com/watch?v=...",
199
+ "format": "video",
200
+ "outputDir": ".frameforge-files/downloads/"
201
+ }
202
+ ```
203
+
204
+ Requires `yt-dlp` in PATH. Supports 1000+ sites. Returns `{ localPath, duration, width, height }`.
205
+
206
+ ### transcribe_media — Whisper word-level timestamps
207
+
208
+ ```json
209
+ {
210
+ "mediaPath": ".frameforge-files/voice_0.m4a",
211
+ "model": "base",
212
+ "format": "all",
213
+ "language": "en"
214
+ }
215
+ ```
216
+
217
+ Returns `{ outputs: { ndjson, srt, json }, pauses, wordCount }`. NDJSON feeds `captions()` in engine.js.
218
+
219
+ ---
220
+
221
+ ## Professional audio post-production
222
+
223
+ ### mix_audio_pro — 15+ year sound engineer chain
224
+
225
+ ```json
226
+ {
227
+ "voicePath": ".frameforge-files/voice_0.m4a",
228
+ "outputPath": ".frameforge-files/audio_pro.m4a",
229
+ "musicPath": "/path/to/bg-music.mp3",
230
+ "platform": "youtube",
231
+ "roomProfile": "cinematic",
232
+ "noiseGate": true,
233
+ "stereoWiden": true,
234
+ "sfxCues": [
235
+ { "name": "whoosh", "time": 2.5, "volume": 0.8 },
236
+ { "name": "impact", "time": 8.0, "volume": 1.0 },
237
+ { "name": "riser", "time": 18.0, "volume": 0.7 },
238
+ { "name": "deep_boom","time": 30.0, "volume": 0.9 },
239
+ { "name": "sparkle", "time": 35.2, "volume": 0.4 }
240
+ ]
241
+ }
242
+ ```
243
+
244
+ Chain: noise gate → 80Hz HPF → presence EQ → de-esser → compressor → room acoustics → sidechain duck → stereo widen → SFX → EBU R128 loudnorm.
245
+ SFX types: whoosh | impact | pop | click | riser | chime | buzz | tick | swish | punch | sparkle | deep_boom | transition
246
+ Room profiles: studio_dry | broadcast | cinematic | concert_hall | intimate
247
+ Platform presets: youtube (-14 LUFS) | podcast (-16) | broadcast (-23) | netflix (-27) | instagram (-14)
248
+
249
+ ---
250
+
251
+ ## Video editing & planning
252
+
253
+ ### plan_video_edit — Plan/Approve/Render
254
+
255
+ ```json
256
+ {
257
+ "footage": ["/path/clip1.mp4", "/path/clip2.mp4"],
258
+ "goal": "Create a cinematic product showcase",
259
+ "style": "cinematic_anamorphic",
260
+ "target_duration": 60,
261
+ "audio_path": ".frameforge-files/voice_0.m4a",
262
+ "music_path": "/path/to/bg.mp3"
263
+ }
264
+ ```
265
+
266
+ Style options include all lemo-opuscar film styles:
267
+ `cinematic` | `fast_paced` | `documentary` | `vintage` | `cyberpunk` | `vibrant`
268
+ `editorial_collage` | `retro_vhs` | `anime_action` | `sci_fi_hud` | `lofi_chill` | `minimal_monochrome`
269
+ `cinematic_anamorphic` | `broadcast_news` | `blueprint_3d` | `film_16mm` | `product_obsidian` | `retro_vhs_80s`
270
+
271
+ Returns: `{ planPath, editJsonPath, planMarkdown, editConfig }`.
272
+
273
+ ### edit_video — Execute planned cuts and color grading
274
+
275
+ ```json
276
+ {
277
+ "edit_file": ".frameforge-files/edit.json",
278
+ "footage": ["/path/clip1.mp4", "/path/clip2.mp4"],
279
+ "output_path": ".frameforge-files/final_cut.mp4",
280
+ "cuts": [
281
+ { "clip": 0, "start": 0, "end": 4.5, "speed": 1.0, "color_grade": "cinematic", "transition": "fade" }
282
+ ],
283
+ "audio_path": ".frameforge-files/voice_0.m4a",
284
+ "music_path": "/path/to/bg.mp3",
285
+ "color_grade": "cinematic",
286
+ "auto_fit": true
287
+ }
288
+ ```
289
+
290
+ Renders frame-exact edits with FFmpeg filtergraphs, J/L-cuts, pan/zoom camera moves, and color grading.
291
+
292
+ ### export_to_editor — Export to Premiere Pro / DaVinci Resolve
293
+
294
+ ```json
295
+ {
296
+ "project_dir": ".frameforge-files/project",
297
+ "format": "edl",
298
+ "output_path": ".frameforge-files/project/timeline.edl",
299
+ "title": "FrameForge Timeline"
300
+ }
301
+ ```
302
+
303
+ Formats: `edl` (CMX 3600), `fcpxml` (Final Cut Pro / DaVinci), `otio` (OpenTimelineIO).
304
+
305
+ ---
306
+
307
+ ## Code-driven HTML animation (Claude Opus 5.5 pure-function-of-t)
308
+
309
+ ### scaffold_animation_project
310
+
311
+ ```json
312
+ {
313
+ "outDir": "./my-animation",
314
+ "title": "Why Planets Orbit",
315
+ "width": 1920,
316
+ "height": 1080,
317
+ "fps": 30,
318
+ "scenes": [
319
+ { "narration": "Gravity curves spacetime.", "caption": "SPACETIME CURVATURE" }
320
+ ]
321
+ }
322
+ ```
323
+
324
+ Scaffolds a zero-diffusion HTML compositor project (`index.html`, `reel/engine.js`, `edit.js`, `scripts/render.mjs`).
325
+
326
+ ### validate_storyboard
327
+
328
+ ```json
329
+ { "storyboardPath": "./my-animation/STORYBOARD.md" }
330
+ ```
331
+
332
+ Validates storyboard against 4 hard gates: event timestamps, non-overlapping reads, named transitions, no on-screen text slop.
333
+
334
+ ### generate_scene_code
335
+
336
+ ```json
337
+ {
338
+ "visual_description": "Sun bending gravity grid with orbiting Earth particle trail",
339
+ "caption": "SPACETIME CURVATURE",
340
+ "style": "cosmic_space",
341
+ "duration": 4.0
342
+ }
343
+ ```
344
+
345
+ Generates pure mathematical `window.seek(t)` canvas animation code.
346
+
347
+ ### preview_scene
348
+
349
+ ```json
350
+ {
351
+ "html": "<html>...</html>",
352
+ "duration": 4.0,
353
+ "timestamps": [0.1, 2.0, 3.9]
354
+ }
355
+ ```
356
+
357
+ Renders headless Chromium still frames (PNGs) to let the agent visually inspect layout, typography, and colors before rendering.
358
+
359
+ ### verify_scene_quality
360
+
361
+ ```json
362
+ {
363
+ "htmlPath": "./my-animation/scene_1.html",
364
+ "duration": 4.0,
365
+ "sampleRate": 2
366
+ }
367
+ ```
368
+
369
+ Closed-loop QA grading (1–10 score): content presence, exposure, layout balance, motion delta. Returns worst frames for automated patch loop.
370
+
371
+ ### render_animation
372
+
373
+ ```json
374
+ {
375
+ "projectDir": "./my-animation",
376
+ "mode": "full"
377
+ }
378
+ ```
379
+
380
+ Modes: `full` (renders MP4), `sheet` (contact sheet), `stills` (specific frames), `strip` (motion strip), `look` (pre-render linter), `quality` (QA gate), `golden` (regression diff).
381
+ Returns `{ success, videoPath, sfxEvents }`.
382
+
383
+
384
+ ### sync_upstream_skills — Fetch new commits from 9 reference repos
385
+
386
+ ```json
387
+ { "silent": false }
388
+ ```
389
+
390
+ Makes GitHub API requests. Returns `{ updatedRepos, perCategoryUpdates, lastSync }`.
391
+ Each category update includes: `repo`, `sha`, `desc`, `userImpact`, `capabilities[]`.
392
+
393
+ Tracked repos: HyperFrames, lemo-opuscar, OneTake, gbro-collage-broll, remotion-dev/skills,
394
+ earshot, ClaudeAnimationBase, claude-remotion-skill, ffmpeg-skill.
395
+
396
+ ### check_upstream_updates — Fast offline manifest read
397
+
398
+ ```json
399
+ {}
400
+ ```
401
+
402
+ No network requests — reads the local manifest only. Returns:
403
+ ```json
404
+ {
405
+ "lastSync": "2026-11-11T20:00:00Z",
406
+ "manifestVersion": "2.7.3",
407
+ "totalRepos": 9,
408
+ "syncedCount": 9,
409
+ "repos": [
410
+ {
411
+ "id": "hyperframes",
412
+ "repo": "heygen-com/hyperframes",
413
+ "category": "compositor",
414
+ "sha": "a1b2c3d",
415
+ "lastChecked": "...",
416
+ "userImpact": "New compositor patterns or GSAP animation primitives available"
417
+ }
418
+ ],
419
+ "hint": "Run sync_upstream_skills to fetch latest commits from GitHub."
420
+ }
421
+ ```
422
+
423
+ Call this to show users their current sync status without making any API calls.
424
+
425
+ ---
426
+
427
+ ## Calling from any IDE
428
+
429
+ Any IDE that supports MCP calls these tools via JSON-RPC:
430
+
431
+ ```json
432
+ POST http://localhost:3210
433
+ {
434
+ "method": "tools/call",
435
+ "params": {
436
+ "name": "create_video_from_script",
437
+ "arguments": { "scenes": [...] }
438
+ },
439
+ "id": 1
440
+ }
441
+ ```