video-overlay-kit
Generates portrait-orientation video overlays optimized for Instagram Reels (1080x1920).
Generates portrait-orientation video overlays optimized for TikTok (1080x1920).
Generates landscape-orientation video overlays optimized for YouTube (1920x1080).
Generates portrait-orientation video overlays optimized for YouTube Shorts (1080x1920).
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@video-overlay-kitGenerate a comparison overlay for iOS vs Android"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Make b-roll for your videos. Tell an agent what you want. Get an MP4 back.
Zero per-render cost. Wednesday Solutions design system as the default theme. Built for people who ship a lot of short-form video and don't want to learn After Effects. Works with any MCP-compatible agent — Claude Code, Codex, OpenCode, Cursor, Cline, or anything else that speaks the Model Context Protocol.
Same scene spec, both orientations. Portrait fits TikTok / Instagram Reels / YouTube Shorts. Landscape fits YouTube / desktop / TV. The kit auto-flips the layout based on the canvas aspect.
list-reveal · a title and three points appearing on cue
Portrait spec · mp4 • Landscape spec · mp4
flow · a process from A to B to C
Portrait spec · mp4 • Landscape spec · mp4
comparison · two things in contrast
Portrait spec · mp4 • Landscape spec · mp4
hub · a centre concept with satellites pointing in
Portrait spec · mp4 • Landscape spec · mp4
Every clip above is real output. 5 to 6 seconds. Wednesday Solutions design system as the default theme. Click any mp4 link for the full-quality version.
Start here
Paste this into a fresh session of any MCP-compatible coding agent (Claude Code, Codex, OpenCode, Cursor, Cline, etc). The agent does the whole setup. It clones the repo, installs deps, wires the MCP into your config, and verifies it works.
Set up github.com/alichherawalla/video-overlay-kit as an MCP server in
my coding agent.
1. Clone the repo to ~/code/video-overlay-kit (or ask me where to put it
if that path is taken).
2. Run `npm install` inside the cloned directory.
3. Find my MCP config file and add a `video-overlay-kit` entry that runs
`node <absolute-cloned-path>/bin/mcp.mjs`. Pick the right path for my
agent:
- Claude Code: `.mcp.json` in the current repo, otherwise
`~/.claude/mcp_settings.json`.
- Codex / OpenCode: their MCP config (usually `~/.codex/mcp.json`
or similar — ask me if you can't find it).
- Cursor / Cline: their MCP settings in the IDE config.
Preserve any existing MCP servers in the config.
4. Verify the server starts by sending it a `tools/list` JSON-RPC request
over stdio and confirming the tools `list_icons`, `validate_scene`, and
`render_scene` come back.
5. Tell me to restart my agent so the new MCP server is picked up.
After setup, read the README at the cloned repo so you know how to author
scene specs. Default to the Wednesday Solutions light theme and 5-second
duration unless I say otherwise.Restart Claude Code. Now ask for a video:
"Make me a 5-second overlay titled 'A runbook for every incident' with three rows: drift, prompt injection, exfil attempts."
The agent picks the icons, writes the scene spec, renders the MP4, hands you the file path. Drop it into your editor.
If you want to wire the MCP yourself instead, skip to Manual setup.
Related MCP server: WhisperCUT
What you can make
Eight building blocks. Combine any of them inside a single 4-to-6-second scene.
title-overlay
The deliverable bar at the top of the frame. Use this on every scene. It is the one-line promise of what the viewer is about to see.
If a stranger reads the title and can't immediately tell what the video is about, rewrite it.
The bar lives at the top of the frame with a thin lavender accent underneath. 80pt bold, centered. You don't pick the position, it is fixed.
{ "kind": "title-overlay", "id": "agenda",
"text": "How to control AI traffic",
"startFrame": 0, "endFrame": 150 }list-reveal
A vertical list of 1 to 5 rows. Each row gets an optional icon and reveals on a frame you specify.
Use this when you have a list of things to show, between 1 and 5 of them.
{ "kind": "list-reveal", "id": "outcomes",
"position": { "x": 0.5, "y": 0.55 },
"startFrame": 20, "endFrame": 150,
"rows": [
{ "text": "One gateway in front of every model", "iconName": "IconShield", "revealAtFrame": 0 },
{ "text": "Input policy. Output policy.", "iconName": "IconFilter", "revealAtFrame": 35 },
{ "text": "Every prompt, every dollar, every output", "iconName": "IconChartBar", "revealAtFrame": 70 }
]
}flow
A horizontal sequence of 2 to 5 nodes. Each node appears, an arrow draws toward the next one, the next node appears.
Use this when the meaning is in the sequence. Incident detected leads to runbook activated leads to contained.
{ "kind": "flow", "id": "incident-flow",
"startFrame": 20, "endFrame": 150,
"nodes": [
{ "iconName": "IconAlertOctagon", "label": "Incident" },
{ "iconName": "IconBook2", "label": "Runbook" },
{ "iconName": "IconCircleCheck", "label": "Contained" }
]
}comparison
Two icons side by side with a configurable divider in the middle. Each side has a label and an optional sub-label.
Use this for binary contrasts. Old way against new way is the canonical example.
The divider word is configurable. "vs" is the default for opposition; swap to "+" or "→" when the relationship is additive or transitional.
{ "kind": "comparison", "id": "old-vs-new",
"startFrame": 20, "endFrame": 180,
"left": { "iconName": "IconClockHour3", "label": "Old way", "subLabel": "Manual review" },
"right": { "iconName": "IconBolt", "label": "New way", "subLabel": "Automated checks" },
"divider": { "label": "vs", "showLine": true }
}hub
A central icon with 2 to 4 satellites around it. The center appears first, then each satellite reveals with a line drawing in from the center.
Use this when one thing is at the centre and other things hang off it. A gateway that controls policy, logging, cost, and swap is a hub.
{ "kind": "hub", "id": "gateway-hub",
"startFrame": 20, "endFrame": 150,
"center": { "iconName": "IconShield", "label": "Gateway" },
"satellites": [
{ "iconName": "IconLock", "label": "Policy" },
{ "iconName": "IconActivity", "label": "Logging" },
{ "iconName": "IconCoin", "label": "Cost" },
{ "iconName": "IconRefresh", "label": "Swap" }
]
}icon, text, lottie
The escape hatches. Drop a single Tabler icon anywhere on the canvas, a free-position text block, or a pre-animated Lottie animation. Use these when the composite components above don't fit.
{ "kind": "icon", "id": "hero", "name": "IconShieldCheck",
"position": { "x": 0.5, "y": 0.45 }, "sizePx": 240,
"startFrame": 10, "endFrame": 150 }Most users never read the full field reference for these. The agent reads the schema for you. If you want every field listed out, jump to the reference section.
Customize the look
The kit ships with the Wednesday Solutions palette. Lavender accent on a warm off-white canvas. Every scene also gets an ambient bloom gradient behind the tracks and a sunset gradient on the title text by default. This is what "polished" looks like out of the box.
Everything is configurable through the scene spec. You don't edit JSON, you ask the agent in plain language.
Tell the agent | What happens in the spec |
"Render it in dark mode" |
|
"Use a black background" |
|
"Flat background, no bloom" |
|
"Solid colour title, no gradient" |
|
"Put the team photo behind it" |
|
"Make the accent red instead of lavender" |
|
"Transparent background, I'll composite it myself" |
|
The codec auto-switches. Solid backgrounds render as H.264 MP4. The transparent setting renders as ProRes 4444 MOV with a real alpha channel.
If you want to change the default theme for every scene without saying so each time, edit src/scene/theme.ts. The palette is one object. Change the hex values and every component picks them up.
Manual setup
Skip this if you used the one-shot prompt above.
git clone git@github.com:alichherawalla/video-overlay-kit.git
cd video-overlay-kit
npm installAdd the kit to your project's .mcp.json or your global ~/.claude/mcp_settings.json:
{
"mcpServers": {
"video-overlay-kit": {
"command": "node",
"args": ["/absolute/path/to/video-overlay-kit/bin/mcp.mjs"]
}
}
}Restart Claude Code. Three tools appear under video-overlay-kit:
list_icons(query?, limit?)searches the Tabler library by substring. About 5,000 line icons.validate_scene(spec)runs the schema check before render.render_scene(spec, outPath?)renders to an MP4 (or.movif the background is transparent) and returns the file path.
First render downloads a headless Chrome (about 93 MB) one time.
CLI
Skip the MCP entirely if you want.
npm run render examples/list-reveal.json
# -> examples/list-reveal.mp4
npm run render path/to/spec.json /where/to/save.mp4For live iteration on a spec with auto-reload as you edit the JSON:
npm run preview
# opens Remotion Studio at http://localhost:3000Why this exists
Most short-form B2B video is a talking head with overlay graphics. A title at the top. A list of three points on cue. An icon or two. Done well, the overlays carry as much of the message as the speaker.
The three paths today: hire an editor (₹500-2000 per reel, slow loop, dependency on a person), subscribe to a SaaS like Submagic ($20/month, fixed style, AI-generated quality varies), or learn After Effects (real time investment, not scriptable from your terminal).
This kit is the fourth path. A small library of components keeps the visual language consistent across every reel. The agent writes the scene spec, the renderer produces the MP4, everything runs locally.
Reference
Everything below is the full schema. Keep it open as a lookup when you author specs by hand.
Scene spec, top-level
Field | Type | Default | Description |
|
| required | Slug for the scene. Used as the default output filename. |
|
| required | Total length in frames. Must be 4 to 6 seconds at the given |
|
|
| Frame rate. |
|
|
| Canvas width in px. |
|
|
| Canvas height in px. Default is 9:16 vertical. |
|
|
| Selects the palette. Light is the Wednesday Solutions default. |
|
| (from theme) | CSS color or |
|
| none |
|
|
| none | Per-scene partial palette override. See Palette. |
|
| required | The list of tracks. |
Common track fields
Field | Type | Default | Description |
| enum | required |
|
|
| required | Unique within the scene. |
|
| required | Frame at which the track becomes visible. |
|
| required | Frame at which the track is removed. |
|
|
| Entry animation. |
|
|
| Exit animation. |
Motion (enter and exit)
{ kind, durationFrames, ease }. Available kind values:
| Behavior |
| Opacity ramp. |
| Enters translating from 80px in the named direction. |
| Scale-in from 0.85 to 1.0 with opacity. |
| No motion. |
ease: linear, easeIn, easeOut, easeInOut. Default easeOut.
Position
All track position fields are { x, y } as 0..1 fractions of the canvas. The track's geometric center is placed at that point.
Palette
Tokens defined in src/scene/theme.ts. The light palette (default):
Token | Color | Used for |
|
| Canvas |
|
| Primary text and icon strokes |
|
| Secondary text |
|
| Tertiary text |
|
| Lavender, used for connectors and the title accent bar |
|
| Deeper lavender, reserved for pressed states |
|
| Hairline borders |
Dark palette inverts these. Per-scene override via palette: { accent: "#E74C3C", ... }.
Per-track field reference
Each track kind below lists the fields it accepts beyond the common fields above.
title-overlay
Field | Type | Description |
|
| The title text. |
Position is fixed at the top of the frame. There is no position field.
list-reveal
Field | Type | Description |
|
| Center of the list block. |
|
| The list rows. |
|
| Row label. |
|
| Optional Tabler icon name. |
|
| Frame (relative to |
flow
Field | Type | Description |
|
| Center of the flow block. |
|
| The sequence. |
|
| Tabler icon. |
|
| Label below the icon. |
|
| Only horizontal in v1. |
|
| Frames between successive nodes. Default 35. |
comparison
Field | Type | Description |
|
| Center of the comparison block. |
|
| Each: |
|
| Center text. Default |
|
| Whether to draw the vertical line. Default |
|
| Frames between left, right, and divider reveal. Default 25. |
hub
Field | Type | Description |
|
| Center of the hub. |
|
| The central node. |
|
| Each: |
|
| Frames between center and each satellite reveal. Default 22. |
Layout is automatic by count. 2 satellites sit top and bottom. 3 form a triangle pointing up. 4 sit at cardinal positions.
icon
Field | Type | Default | Description |
|
| required | Tabler icon name. |
|
| required | Position on the canvas. |
|
|
| Icon size. |
|
| (theme | CSS color. |
|
|
| Stroke width. |
text
Field | Type | Default | Description |
|
| required | The text. Supports |
|
| required | Position on the canvas. |
|
|
| Font size. |
|
| (theme | CSS color. |
|
|
| Weight. |
|
| (kit's Aeonik stack) | CSS font stack. |
|
|
| Alignment. |
|
| unbounded | Wrap width. |
lottie
Field | Type | Default | Description |
|
| required | URL or path relative to |
|
| required | Position. |
|
|
| Width and height (square). |
|
|
| Loop the animation. |
|
|
| Speed multiplier. |
backgroundImage
Field | Type | Default | Description |
|
| required | URL, |
|
|
| 0..1. |
|
|
| CSS |
|
| none | CSS color drawn over the image. |
|
|
| Opacity of the tint layer. |
Layers stack as background color, then image, then tint, then tracks.
Constraints
Duration is 4 to 6 seconds. Validated.
Aspect is 9:16, 1080×1920. Default.
Frame rate is 30 fps.
Only Tabler icons and line-style Lottie are supported.
Theme is the Wednesday Solutions palette. Editable in
src/scene/theme.ts.
Output formats
Background | Codec | Container | Use case |
Any CSS color | H.264 |
| Full-frame b-roll cut into your reel. |
| ProRes 4444 |
| Compositing over talking-head footage with alpha. |
Project structure
video-overlay-kit/
├── bin/mcp.mjs # MCP launcher
├── mcp/server.ts # MCP server: list_icons, validate_scene, render_scene
├── scripts/render.ts # CLI entry (npm run render)
├── src/
│ ├── Root.tsx, index.ts # Remotion entry
│ ├── scene/
│ │ ├── types.ts # Zod schema for the whole spec
│ │ ├── theme.ts # Palette and font family
│ │ └── Scene.tsx # Top-level renderer
│ ├── components/ # One file per track kind
│ ├── motion/ # Enter and exit transforms
│ └── lib/render.ts # Shared by CLI and MCP
└── examples/ # Sample specs with their rendered MP4s and GIFsExtending
To add a new track kind (quote for example):
Add
QuoteTrackSchemainsrc/scene/types.ts, include it inTrackSchema, export the type.Build
src/components/Quote.tsx. UseuseCurrentFrame()from Remotion andtrackStylefrom../motion/primitives. Read colors fromusePalette()and the font fromFONT_FAMILYinsrc/scene/theme.ts.Register the case in
src/scene/Scene.tsx.Update the schema hint in
mcp/server.tsso the agent knows the new kind exists.
The renderer and MCP tool handlers do not need changes. Copy Flow.tsx or Hub.tsx as a starting point for choreographed components.
Cost
Zero per render. Local CPU and disk only. Free for individual use and small teams. Check each dependency's license if you are shipping commercially.
Credits
Remotion is the React-based video rendering engine.
Tabler Icons is the icon library.
LottieFiles is the Lottie animation marketplace.
Model Context Protocol is the standard used to expose the kit to Claude Code.
Support the project
VideoOverlayKit is free and MIT-licensed. If the kit saves you time or render budget, the easiest way to give back is to sponsor the project on GitHub. Sponsorships fund new components, better defaults, and bug fixes that ship faster than I can do them in evenings.
Wednesday Solutions (wednesday.is) is the studio behind the design system. If you want a custom build, a theme that matches your brand, or production help shipping AI features for a regulated industry, that's the way to reach the team.
License
MIT.
Issues, contributions
File issues at github.com/alichherawalla/video-overlay-kit. The schema in src/scene/types.ts is the contract. Propose the spec shape first when adding a new track kind, then the component.
Available Tools
5 toolsget_exampleA
Fetch the full JSON spec of a named example (from list_examples). Use the returned spec as a starting template — change icons, labels, title text, and durations, but keep the track structure that matches your content shape.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Example name (without .json). Use list_examples to discover. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It states the tool returns a full JSON spec and that the name comes from list_examples, but it does not mention potential errors, authentication requirements, or whether the operation is read-only. This is adequate for a basic fetch but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the purpose, followed by concise usage guidance. Every word serves a purpose with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no output schema, the description sufficiently explains what is returned (full JSON spec) and how to use it (as a template, preserving track structure). It references list_examples for discovery, making the tool self-contained in context. Missing details like exact return format or error cases are minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers the 'name' parameter completely with a clear description, and the tool description reinforces the source (list_examples) but adds little beyond the schema. Baseline of 3 is appropriate because the schema already documents the parameter well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches a full JSON spec for a named example, distinguishing it from list_examples (which lists examples) and other sibling tools. The verb 'Fetch' and resource 'full JSON spec of a named example' are specific and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on how to use the returned spec (as a starting template, with specific modifications like icons and labels) and implies the discovery flow via list_examples. It does not explicitly state when not to use this tool, but the context is sufficient for a simple fetch operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_examplesA
List the canonical scene examples bundled with the kit. Returns an array of { name, kinds, orientation } entries — one per spec in examples/. ALWAYS call this before authoring a new scene so you can pick the closest example to clone instead of writing from scratch. PICK THE TRACK KIND BY CONTENT SHAPE, not by default. Do not reach for 'list-reveal' unless the content is genuinely a flat enumeration of >=3 peer items. Use 'flow' when describing a pipeline / sequence / before→after path (A → B → C). Use 'hub' when one central concept connects to 2-4 related satellites. Use 'comparison' for a two-sided contrast (old vs new, before vs after). Use 'title-overlay' for a hero text card with no diagram. Call list_examples first to see a canonical spec for each kind before authoring. Both portrait (1080x1920, default — reels / shorts / TikTok) and landscape (1920x1080 — YouTube / LinkedIn / web embeds) are supported; ask the user or infer from context which they want. Layouts auto-flip (e.g. 'flow' is vertical in portrait, horizontal in landscape).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavior disclosure burden. It reveals the return structure (array of { name, kinds, orientation }), the data source (examples/), and dynamic layout behavior (auto-flip based on orientation), going far beyond a bare 'list' claim.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical for a no-parameter list tool, but it is dense with useful guidance (return shape, cloning workflow, track-kind selection, orientations, auto-flip). It loses a point for slight redundancy, repeating 'ALWAYS call' and the call-first advice twice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity, no parameters, and no output schema, the description is remarkably complete: it states what is listed, what each entry contains, where it comes from, how to use it, and both supported orientations. An agent has all needed context to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema coverage is 100%, so there is no parameter ambiguity. The baseline for no-parameter tools is 4, and the description adds no unnecessary parameter details—correctly focusing on the tool's output and usage context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('canonical scene examples bundled with the kit'), immediately differentiating it from siblings like list_icons and get_example. It also clarifies the return shape and source directory, making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to 'ALWAYS call this before authoring a new scene' and explains how to pick the closest example to clone. It provides detailed contextual guidance on selecting track kinds by content shape and covers orientation decisions, making it clear when and how to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_iconsA
Search the Tabler icon library by name substring. Returns icon names usable in scene specs (e.g. 'IconShield', 'IconAlertTriangle'). All Tabler icons are line-style and use a consistent visual language.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 30). | |
| query | No | Substring to match against icon names (case-insensitive). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It adds useful context about the icons' line-style and consistent visual language, but it does not disclose behaviors like case-insensitivity, no-match handling, or limit enforcement beyond what the schema already states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise at two sentences, front-loaded with the primary purpose, and includes an example and a generalizable insight about the icon set. Every sentence contributes value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with two optional parameters and no output schema, the description adequately covers purpose, result format (icon names), and stylistic consistency. It omits edge-case behavior like empty results or pagination, but these are minor for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds example icon names, which clarifies the expected format, but does not significantly enhance the meaning of the parameters beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches the Tabler icon library by name substring, using a specific verb and resource. This distinguishes it from sibling tools like list_examples, validate_scene, and render_scene, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context that the tool is for finding icon names usable in scene specs, implying when to use it. However, it does not explicitly mention alternatives or when not to use it, stopping short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_sceneA
Render a scene spec to an MP4 (or .mov if background is 'transparent'). Returns { ok, outPath, durationSeconds, codec }. Defaults to 9:16 portrait (1080x1920) at 30fps; set width=1920, height=1080 for landscape. Duration must be 4-6 seconds. PICK THE TRACK KIND BY CONTENT SHAPE, not by default. Do not reach for 'list-reveal' unless the content is genuinely a flat enumeration of >=3 peer items. Use 'flow' when describing a pipeline / sequence / before→after path (A → B → C). Use 'hub' when one central concept connects to 2-4 related satellites. Use 'comparison' for a two-sided contrast (old vs new, before vs after). Use 'title-overlay' for a hero text card with no diagram. Call list_examples first to see a canonical spec for each kind before authoring. Both portrait (1080x1920, default — reels / shorts / TikTok) and landscape (1920x1080 — YouTube / LinkedIn / web embeds) are supported; ask the user or infer from context which they want. Layouts auto-flip (e.g. 'flow' is vertical in portrait, horizontal in landscape).
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | A scene spec. Top-level: { id, durationFrames, fps?, width?, height?, theme?, background?, backgroundImage?, palette?, tracks[] }. durationFrames/fps MUST be between 4 and 6 seconds. Default fps=30, width=1080, height=1920. theme='light' (default) or 'dark' selects the Wednesday Solutions palette. background overrides the theme's canvas color; set 'transparent' for an alpha-channel .mov render. backgroundImage={source(URL or public/ path), opacity?=1, fit?='cover'|'contain', tint?, tintOpacity?=0} renders behind tracks. palette={background?, ink?, inkMuted?, inkDim?, accent?, accentDeep?, hairline?} overrides individual theme colors. Each track has { kind, id, startFrame, endFrame, enter?, exit? } plus kind-specific fields. Kinds: 'title-overlay' (text), 'list-reveal' (rows[].{text, iconName?, revealAtFrame}, position{x,y}), 'flow' (nodes[].{iconName, label}, position{x,y}, direction='horizontal', revealCadenceFrames=35 — left-to-right icon flow with arrows drawing between them), 'comparison' (left{iconName,label,subLabel?}, right{iconName,label,subLabel?}, divider{label='vs', showLine=true} — side-by-side contrast with a center divider), 'hub' (center{iconName,label}, satellites[2-4].{iconName,label}, position{x,y}, revealCadenceFrames=22 — central icon with N satellites connecting in via lines), 'icon' (name, position, sizePx?, color?), 'text' (text, position, fontSizePx?, color?), 'lottie' (source, position, sizePx?, loop?). Position x,y are 0..1 fractions of canvas. | |
| outPath | No | Absolute or repo-relative path to write the rendered file. If omitted, writes to <kit>/output/<spec.id>.<mp4|mov>. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility. It discloses return values, default resolution, fps, duration constraints, transparent background behavior, and auto-flipping layout, giving a thorough view of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and returns, followed by essential guidance on track kinds and orientation. It is lengthy but each sentence serves a purpose; however, it could be condensed and organized for even quicker consumption.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the spec object and no output schema, the description covers return format, constraints, orientation choices, and references list_examples for canonical specs. It is complete for an agent to use the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% description coverage, so baseline is 3. The description adds value by explaining track-kind selection rules and orientation flipping, which are semantic nuances beyond the schema's field definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool renders a scene spec to an MP4 (or .mov) and returns a structured result. It distinguishes itself from siblings like list_examples and validate_scene by focusing on the actual rendering output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit, detailed guidance on when to use each track kind based on content shape, and directs agents to call list_examples first. It also covers orientation selection and how to ask the user or infer from context, making usage conditions very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_sceneA
Validate a scene spec against the schema without rendering. Returns { ok, errors? }. Useful to check structure before render_scene. PICK THE TRACK KIND BY CONTENT SHAPE, not by default. Do not reach for 'list-reveal' unless the content is genuinely a flat enumeration of >=3 peer items. Use 'flow' when describing a pipeline / sequence / before→after path (A → B → C). Use 'hub' when one central concept connects to 2-4 related satellites. Use 'comparison' for a two-sided contrast (old vs new, before vs after). Use 'title-overlay' for a hero text card with no diagram. Call list_examples first to see a canonical spec for each kind before authoring. Both portrait (1080x1920, default — reels / shorts / TikTok) and landscape (1920x1080 — YouTube / LinkedIn / web embeds) are supported; ask the user or infer from context which they want. Layouts auto-flip (e.g. 'flow' is vertical in portrait, horizontal in landscape).
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | A scene spec. Top-level: { id, durationFrames, fps?, width?, height?, theme?, background?, backgroundImage?, palette?, tracks[] }. durationFrames/fps MUST be between 4 and 6 seconds. Default fps=30, width=1080, height=1920. theme='light' (default) or 'dark' selects the Wednesday Solutions palette. background overrides the theme's canvas color; set 'transparent' for an alpha-channel .mov render. backgroundImage={source(URL or public/ path), opacity?=1, fit?='cover'|'contain', tint?, tintOpacity?=0} renders behind tracks. palette={background?, ink?, inkMuted?, inkDim?, accent?, accentDeep?, hairline?} overrides individual theme colors. Each track has { kind, id, startFrame, endFrame, enter?, exit? } plus kind-specific fields. Kinds: 'title-overlay' (text), 'list-reveal' (rows[].{text, iconName?, revealAtFrame}, position{x,y}), 'flow' (nodes[].{iconName, label}, position{x,y}, direction='horizontal', revealCadenceFrames=35 — left-to-right icon flow with arrows drawing between them), 'comparison' (left{iconName,label,subLabel?}, right{iconName,label,subLabel?}, divider{label='vs', showLine=true} — side-by-side contrast with a center divider), 'hub' (center{iconName,label}, satellites[2-4].{iconName,label}, position{x,y}, revealCadenceFrames=22 — central icon with N satellites connecting in via lines), 'icon' (name, position, sizePx?, color?), 'text' (text, position, fontSizePx?, color?), 'lottie' (source, position, sizePx?, loop?). Position x,y are 0..1 fractions of canvas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It clearly discloses that the tool does not render (side-effect-free validation), states the exact return shape, and reveals behavioral nuances like default orientation (portrait) and auto-flipping of layouts. It could go further by disclosing potential errors or side effects, but for a validation-only tool this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though the description is long, it is well-structured and front-loaded with the core purpose and return type, followed by actionable guidance. Every sentence earns its place by providing decision rules (track kinds, orientation, list_examples) or clarifying behavior. No fluff or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (nested schema, multiple track kinds), but the description covers all essential context: what the tool does, when to use it, how to choose track kinds, how to get canonical examples, and supported orientations. It also mentions the return shape, which is sufficient given no output schema. The guidance to call list_examples fills potential gaps in schema understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the baseline is 3. The tool description adds value by explaining how to choose the track 'kind' based on content shape (flow, hub, comparison, etc.) and how orientation affects layout, which goes beyond the schema's field-level definitions. This extra guidance materially improves an agent's ability to construct a valid spec.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Validate a scene spec against the schema without rendering.' It also defines the return shape (`Returns { ok, errors? }`) and explicitly distinguishes itself from the sibling `render_scene` by stating it is for checking structure before rendering, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Useful to check structure before render_scene.' It then gives detailed instructions on choosing track kinds based on content shape, including 'Do not reach for list-reveal unless...' and 'Use flow when...' for each relevant kind. It also instructs to 'Call list_examples first' and clarifies orientation options, fully covering usage alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v1.0.0- First observed
get_example - First observed
list_examples - First observed
list_icons - First observed
render_scene - First observed
validate_scene
TDQS
Scored across 5 tools
Each tool serves a distinct function: searching icons, listing example templates, fetching a specific template, validating a scene spec, and rendering to video. There is no overlap in purpose, so an agent can unambiguously select the right tool for each step.
All tool names follow a clear verb_noun snake_case pattern: list_icons, list_examples, get_example, validate_scene, render_scene. The convention is consistent and predictable, with no mixed styles or vague verbs.
The server exposes 5 tools, which is well-scoped for its purpose: discovering assets, using templates, validating, and rendering. Each tool earns its place, and the count is neither too thin nor excessive.
The tool set covers the full authoring workflow: find icons, choose an example template, fetch its spec, customize it (externally), validate the result, and render to video. There are no obvious dead ends or missing steps for the stated purpose of creating video overlays.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Google Veo AI video generation
MCP server for Wan AI video generation
MCP server for Luma Dream Machine AI video generation
MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that interfaces with the Creatomate API, turning LLMs into autonomous motion designers that can generate social media videos, ads, and shorts programmatically.1MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that automates short-form video production for TikTok, Instagram Reels, and YouTube Shorts, using AI agents and behavioral science to generate production-ready videos from a topic and vibe.1-
- AlicenseNot gradedqualityBmaintenanceAn MCP server that turns a script into a Hyperplexed-style motion-graphics MP4. Plug the URL into Claude Desktop, Cursor, or any MCP-compatible agent and it gains a render_video tool.MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server for creative generation and video production, letting AI agents author declarative animations, render deterministic frames, and measure output quality with perception instruments for brand and accessibility conformance.Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/alichherawalla/video-overlay-kit'
If you have feedback or need assistance with the MCP directory API, please join our Discord server