Skip to main content
Glama

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"

theme: "dark"

"Use a black background"

background: "#000000"

"Flat background, no bloom"

bloom: false

"Solid colour title, no gradient"

titleGradient: false

"Put the team photo behind it"

backgroundImage: { source: "team.jpg" }

"Make the accent red instead of lavender"

palette: { accent: "#E74C3C" }

"Transparent background, I'll composite it myself"

background: "transparent"

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 install

Add 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 .mov if 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.mp4

For live iteration on a spec with auto-reload as you edit the JSON:

npm run preview
# opens Remotion Studio at http://localhost:3000

Why 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

id

string

required

Slug for the scene. Used as the default output filename.

durationFrames

int

required

Total length in frames. Must be 4 to 6 seconds at the given fps. Validated.

fps

int

30

Frame rate.

width

int

1080

Canvas width in px.

height

int

1920

Canvas height in px. Default is 9:16 vertical.

theme

"light" | "dark"

"light"

Selects the palette. Light is the Wednesday Solutions default.

background

string

(from theme)

CSS color or "transparent". Overrides the theme's canvas color.

backgroundImage

object

none

{ source, opacity, fit, tint, tintOpacity }. Renders behind the tracks.

palette

object

none

Per-scene partial palette override. See Palette.

tracks

Track[]

required

The list of tracks.

Common track fields

Field

Type

Default

Description

kind

enum

required

title-overlay, list-reveal, flow, comparison, hub, icon, text, lottie.

id

string

required

Unique within the scene.

startFrame

int

required

Frame at which the track becomes visible.

endFrame

int

required

Frame at which the track is removed.

enter

Motion

{ kind: "fade", durationFrames: 8 }

Entry animation.

exit

Motion

{ kind: "none", durationFrames: 8 }

Exit animation.

Motion (enter and exit)

{ kind, durationFrames, ease }. Available kind values:

kind

Behavior

fade

Opacity ramp.

slide-up / slide-down / slide-left / slide-right

Enters translating from 80px in the named direction.

scale

Scale-in from 0.85 to 1.0 with opacity.

none

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

background

#F0EDF8

Canvas

ink

#0B0B0D

Primary text and icon strokes

inkMuted

#3A3A4A

Secondary text

inkDim

#6B6B7E

Tertiary text

accent

#7A5BDC

Lavender, used for connectors and the title accent bar

accentDeep

#5A3DB8

Deeper lavender, reserved for pressed states

hairline

#CCCAE0

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

text

string

The title text.

Position is fixed at the top of the frame. There is no position field.

list-reveal

Field

Type

Description

position

{ x, y }

Center of the list block.

rows

Row[] (1-5)

The list rows.

rows[].text

string

Row label.

rows[].iconName

string?

Optional Tabler icon name.

rows[].revealAtFrame

int

Frame (relative to startFrame) when this row appears.

flow

Field

Type

Description

position

{ x, y }

Center of the flow block.

nodes

Node[] (2-5)

The sequence.

nodes[].iconName

string

Tabler icon.

nodes[].label

string

Label below the icon.

direction

"horizontal"

Only horizontal in v1.

revealCadenceFrames

int

Frames between successive nodes. Default 35.

comparison

Field

Type

Description

position

{ x, y }

Center of the comparison block.

left, right

Side

Each: { iconName, label, subLabel? }.

divider.label

string

Center text. Default "vs".

divider.showLine

boolean

Whether to draw the vertical line. Default true.

revealCadenceFrames

int

Frames between left, right, and divider reveal. Default 25.

hub

Field

Type

Description

position

{ x, y }

Center of the hub.

center.iconName, center.label

string

The central node.

satellites

Satellite[] (2-4)

Each: { iconName, label }.

revealCadenceFrames

int

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

name

string

required

Tabler icon name.

position

{ x, y }

required

Position on the canvas.

sizePx

int

160

Icon size.

color

string

(theme ink)

CSS color.

strokeWidth

number

2

Stroke width.

text

Field

Type

Default

Description

text

string

required

The text. Supports \n.

position

{ x, y }

required

Position on the canvas.

fontSizePx

int

56

Font size.

color

string

(theme ink)

CSS color.

fontWeight

400 | 500 | 600 | 700 | 800

600

Weight.

fontFamily

string

(kit's Aeonik stack)

CSS font stack.

align

"left" | "center" | "right"

"center"

Alignment.

maxWidthPx

int

unbounded

Wrap width.

lottie

Field

Type

Default

Description

source

string

required

URL or path relative to public/.

position

{ x, y }

required

Position.

sizePx

int

400

Width and height (square).

loop

boolean

false

Loop the animation.

playbackRate

number

1

Speed multiplier.

backgroundImage

Field

Type

Default

Description

source

string

required

URL, data:, or public/ path.

opacity

number

1

0..1.

fit

"cover" | "contain"

"cover"

CSS object-fit.

tint

string?

none

CSS color drawn over the image.

tintOpacity

number

0

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

.mp4

Full-frame b-roll cut into your reel.

"transparent"

ProRes 4444

.mov

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 GIFs

Extending

To add a new track kind (quote for example):

  1. Add QuoteTrackSchema in src/scene/types.ts, include it in TrackSchema, export the type.

  2. Build src/components/Quote.tsx. Use useCurrentFrame() from Remotion and trackStyle from ../motion/primitives. Read colors from usePalette() and the font from FONT_FAMILY in src/scene/theme.ts.

  3. Register the case in src/scene/Scene.tsx.

  4. Update the schema hint in mcp/server.ts so 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

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 tools
get_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesExample name (without .json). Use list_examples to discover.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 30).
queryNoSubstring to match against icon names (case-insensitive).

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
specYesA 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.
outPathNoAbsolute or repo-relative path to write the rendered file. If omitted, writes to <kit>/output/<spec.id>.<mp4|mov>.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
specYesA 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

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 5 tool updatesv1.0.0
    • First observedget_example
    • First observedlist_examples
    • First observedlist_icons
    • First observedrender_scene
    • First observedvalidate_scene

TDQS

A4.5/5.0

Scored across 5 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityInactive
ResponsivenessNo issues

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

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An 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
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    An 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

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