@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.
- package/.claude-plugin/marketplace.json +63 -63
- package/CHANGELOG.md +42 -0
- package/README.md +426 -426
- package/package.json +1 -1
- package/plugins/video-pipeline/.claude-plugin/plugin.json +25 -25
- package/plugins/video-pipeline/skills/.upstream-skills.json +143 -143
- package/plugins/video-pipeline/skills/html-renderer/references/procedural-sfx.md +15 -3
- package/plugins/video-pipeline/skills/video-pipeline/SKILL.md +384 -384
- package/plugins/video-pipeline/skills/video-pipeline/assets/project/ANIMATION_GUIDE.md +2 -1
- package/plugins/video-pipeline/skills/video-pipeline/assets/project/pipeline/briefings/orchestrator.md +8 -4
- package/plugins/video-pipeline/skills/video-pipeline/references/mcp-tools.md +441 -291
- package/scripts/deep-validate.js +403 -388
- package/scripts/html-renderer/new-project.mjs +7 -3
- package/src/mcp-server/server.js +2999 -2999
- package/src/skills/sync-upstream.js +290 -290
|
@@ -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
|
-
###
|
|
59
|
-
|
|
60
|
-
```json
|
|
61
|
-
{
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
"
|
|
110
|
-
"
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
{ "
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
"
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
{
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
{ "
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
"
|
|
258
|
-
"
|
|
259
|
-
"
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
"
|
|
285
|
-
"
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
+
```
|