Skip to content

dev.clipkit/clipkit

by clipkit.dev · remote · no sign-in to list tools · v1.0.0 · published by dev.clipkit

MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.

Deletes · 4Changes · 6

15 tools: 4 can delete or cancel things, 6 change things and 5 only read.

Scanned Oct 21, 2026

5 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http clipkit https://www.clipkit.dev/mcp

Findings

Matches of fixed checks, with the text they matched.

5 warn
  • The server marks "validate_project" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}; The name "validate_project" says "validate": a word for reading.

    What this check looks for
  • The input schema at properties.scenes.items.anyOf[1].properties.color.$ref contains a 49-character base64 string.

    Matched text

    inputSchema.properties.scenes.items.anyOf[1].properties.color.$ref: "#/properties/scenes/items/anyOf/0/properties/color"

    What this check looks for
  • The input schema at properties.scenes.items.anyOf[1].properties.duration.$ref contains a 52-character base64 string.

    Matched text

    inputSchema.properties.scenes.items.anyOf[1].properties.duration.$ref: "#/properties/scenes/items/anyOf/0/properties/duration"

    What this check looks for
  • The input schema at properties.scenes.items.anyOf[2].properties.color.$ref contains a 49-character base64 string.

    Matched text

    inputSchema.properties.scenes.items.anyOf[2].properties.color.$ref: "#/properties/scenes/items/anyOf/0/properties/color"

    What this check looks for
  • The server marks "ingest_asset" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The description's first verb is "fetch": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

15 tools

Deletes or cancels 4Claude Code: deny
  • create_promoAssemble a designed-looking promo/intro/product/data video from the Clipkit pattern library: give an ordered list of SCENES and the words, and it bakes in the camera, glass, lighti…3 findings

    Why it is in this group

    • The name "create_promo" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Warn

      The input schema at properties.scenes.items.anyOf[1].properties.color.$ref contains a 49-character base64 string.

      Matched text

      inputSchema.properties.scenes.items.anyOf[1].properties.color.$ref: "#/properties/scenes/items/anyOf/0/properties/color"

      What this check looks for
    • Warn

      The input schema at properties.scenes.items.anyOf[1].properties.duration.$ref contains a 52-character base64 string.

      Matched text

      inputSchema.properties.scenes.items.anyOf[1].properties.duration.$ref: "#/properties/scenes/items/anyOf/0/properties/duration"

      What this check looks for
    • Warn

      The input schema at properties.scenes.items.anyOf[2].properties.color.$ref contains a 49-character base64 string.

      Matched text

      inputSchema.properties.scenes.items.anyOf[2].properties.color.$ref: "#/properties/scenes/items/anyOf/0/properties/color"

      What this check looks for
    Description, as the server wrote it
    Assemble a designed-looking promo/intro/product/data video from the Clipkit pattern library: give an ordered list of SCENES and the words, and it bakes in the camera, glass, lighting, motion blur, timing, and layout, then returns an editor link. This is a FAST option when a conventional promo structure fits — it is NOT the only way to make a video and NOT a default; for anything specific or original, author the JSON yourself and call set_project (the full creative range). When you do use this, MIX scene types to fit the brief and vary the structure — a video can be a single kinetic headline, three title cards, a showcase montage, or a data explainer; you do NOT need a hero or a cta. Scene types: hero (glass-orb logo reveal: wordmark, tagline?), kinetic (letter-fly headline: text, subtitle?), showcase (a screenshot tilted in 3D: screenshot URL), title (full-frame title card: headline, kicker?, subtitle?), cta (closing card with a glass button: wordmark, tagline?, cta), stats (hero numbers: stats[{label,current,previous?}], title?), bars (bar chart: bars[{label,value,previous?}], title?), ranking (top-N list: items[{label,value}], title?), pie (pie cards: cards[{label,value,total,previous?}], title?). The data scenes (stats/bars/ranking/pie) look best with theme "mux".

    Annotations the server declares

    • title: Compose a designed promo from prebuilt scenes (one fast option)
    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • delete_elementDelete the element with the given id, anywhere in the tree (including one nested inside a group or its mask) — a tweak to an existing composition.No findings

    Why it is in this group

    • The name "delete_element" says "delete": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Delete the element with the given id, anywhere in the tree (including one nested inside a group or its mask) — a tweak to an existing composition. (The project must keep at least one top-level element.)

    Annotations the server declares

    • title: Delete one element by id
    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
  • load_projectImport a previously shared project as the current project, by its share id or its editor URL (e.g.No findings

    Why it is in this group

    • The description's first verb is "import": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Import a previously shared project as the current project, by its share id or its editor URL (e.g. https://clipkit.dev/editor?id=…), returning its project_id. Use this to continue working on a project the user opened in the editor or shared earlier — the round-trip for open_in_editor. Pass an existing project_id to load into that project; omit it to load into a new one.

    Annotations the server declares

    • title: Load a shared project back into the session
    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • set_projectReplace the entire project with the given source JSON, returning its project_id.No findings

    Why it is in this group

    • The name "set_project" says "set": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Replace the entire project with the given source JSON, returning its project_id. This is the PRIMARY way to build: use it to create a composition or to add/change many elements at once. (To tweak a single element in an existing project, use edit_element / add_element / delete_element instead.) REVISION RULE: if you are iterating on a video that already exists in this conversation — the user asked for changes, you are fixing your own work — you MUST pass its project_id so the project is updated in place and keeps one editor link and its version history. Omitting project_id creates a NEW, unrelated project and strands the old one; only omit for a genuinely different video. The input is validated against the @clipkit/protocol before being accepted; invalid inputs return an error. Shape: { width, height, duration, frame_rate, output_format, background_color?, defaults? (house easing, e.g. a spring), fonts?, camera?, lights?, elements:[…] }; every element has a `type` plus base fields (id, layer, x, y, width, height, time, duration, opacity, rotation, animations, keyframe_animations) and type-specific fields. CKP/1.1: keyframe easings accept a spring object {type:"spring", duration?, bounce?}; channels take stagger {each, from, ease, split, seed} to spread across text units / set copies / group children; groups take layout {direction, gap, align} (stack — no hand-computed positions); text takes a count-up {expr, format}. For exact field names + types call get_schema (optionally with an element_type) — the runtime ignores unrecognized keys, and this tool flags any it does not recognize.

    Annotations the server declares

    • title: Replace the entire Clipkit project
    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
Changes things 6Claude Code: ask
  • add_elementAppend a single element to an existing project — a TWEAK, e.g.No findings

    Why it is in this group

    • The name "add_element" says "add": a word for a change.
    Description, as the server wrote it
    Append a single element to an existing project — a TWEAK, e.g. dropping in one more caption or shape. By default it is added at the top level; pass parent_id to add it INTO a group (nested). The element is any valid schema element: video, image, text, shape, audio, group, caption, or particles. To create a composition or add several elements at once, build the JSON and use set_project instead. The new element is validated as part of the project as a whole before being added. Call get_schema(element_type) for the exact per-type fields; unrecognized keys are flagged.

    Annotations the server declares

    • title: Add an element to the current project
    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
  • create_projectCreate a new, blank Clipkit project with the given dimensions and duration, and return its project_id.No findings

    Why it is in this group

    • The name "create_project" says "create": a word for a change.
    Description, as the server wrote it
    Create a new, blank Clipkit project with the given dimensions and duration, and return its project_id. Defaults: 1920×1080, 10 seconds, 30 fps, output_format "mp4". Call this first when starting a new video. Pass an existing project_id to reset that project to blank; omit it to start a fresh project (note the returned id for subsequent tools).

    Annotations the server declares

    • title: Create a new Clipkit project
    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
  • edit_elementChange fields on the element with the given id by merging in a partial element — only the keys you include change.No findings

    Why it is in this group

    • The name "edit_element" says "edit": a word for a change.
    Description, as the server wrote it
    Change fields on the element with the given id by merging in a partial element — only the keys you include change. The id may be any element ANYWHERE in the tree, including one nested inside a group (or its mask). Pass a whole nested value (e.g. a new `keyframe_animations` array) to replace that key; set a key to null to remove it. This is for TWEAKING an existing composition. To create a composition or change many elements at once, edit the JSON and call set_project instead. The result is re-validated before being accepted.

    Annotations the server declares

    • title: Tweak one existing element (merge changed fields)
    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
  • ingest_assetFetch a remote media URL (image/video/audio) and HOST it on Clipkit, returning a stable asset_url to put in an element's `url`.1 finding

    Why it is in this group

    • The description's first verb is "fetch": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    Findings

    • Warn

      The server marks "ingest_asset" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The description's first verb is "fetch": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Fetch a remote media URL (image/video/audio) and HOST it on Clipkit, returning a stable asset_url to put in an element's `url`. Use this so the project's media survives — the original link may rot, be private, or block hotlinking. Anonymous projects allow up to 5 hosted assets / 100 MB total / 50 MB per file; when the limit is hit, tell the user to open the project (open_in_editor) and sign in to add more. Requires project_id.

    Annotations the server declares

    • title: Host a remote image/video/audio so a project can use it
    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: true
  • open_in_editorValidate the current project and create a link that opens it in the Clipkit web editor, where the user can preview and refine it.No findings

    Why it is in this group

    • The name "open_in_editor" says "open": a word for a change.
    Description, as the server wrote it
    Validate the current project and create a link that opens it in the Clipkit web editor, where the user can preview and refine it. This shares the PROJECT (nothing is rendered — that's render_video). Use after composing or editing. Returns a URL.

    Annotations the server declares

    • title: Create a shareable link that opens the current project in the editor
    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: true
  • validate_projectRun the @clipkit/protocol validator against the current project AND surface render-time warnings even when the JSON is valid — things that pass the schema but the runtime will sile…1 finding

    Why it is in this group

    • The name "validate_project" says "validate": a word for reading.
    • The description's first verb is "run": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "validate_project" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}; The name "validate_project" says "validate": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Run the @clipkit/protocol validator against the current project AND surface render-time warnings even when the JSON is valid — things that pass the schema but the runtime will silently drop or clip: emoji / non-ASCII text (the runtime font atlas is ASCII-only), elements that run past the composition end, a missing top-level duration. Run it before you share or render the project. For a fuller timeline read-back, use describe_project.

    Annotations the server declares

    • title: Validate the current project (schema + render-time warnings)
    • readOnlyHint: true
    • openWorldHint: false
    • destructiveHint: false
Only reads 5Claude Code: allow
  • describe_projectReturn a compact, human-readable summary of the current project — dimensions, fps, duration, an element breakdown by type, a per-track timeline (paint order low→high), and render-t…No findings

    Why it is in this group

    • The name "describe_project" says "describe": a word for reading.
    Description, as the server wrote it
    Return a compact, human-readable summary of the current project — dimensions, fps, duration, an element breakdown by type, a per-track timeline (paint order low→high), and render-time warnings. Much cheaper to read than get_project's full JSON; use it to orient yourself or sanity-check structure without dumping the whole source.

    Annotations the server declares

    • title: Describe the current project in plain language
    • readOnlyHint: true
    • openWorldHint: false
    • destructiveHint: false
  • get_projectReturn the full current Clipkit source as JSON.No findings

    Why it is in this group

    • The name "get_project" says "get": a word for reading.
    Description, as the server wrote it
    Return the full current Clipkit source as JSON. Use this to inspect the project, pass it to a render pipeline, or compose follow-up edits.

    Annotations the server declares

    • title: Get the current Clipkit project JSON
    • readOnlyHint: true
    • openWorldHint: false
    • destructiveHint: false
  • get_schemaReturn the authoritative JSON Schema for a Clipkit Source — exact field names, types, and enums, generated from the protocol.No findings

    Why it is in this group

    • The name "get_schema" says "get": a word for reading.
    Description, as the server wrote it
    Return the authoritative JSON Schema for a Clipkit Source — exact field names, types, and enums, generated from the protocol. Call with no argument for the full Source schema, or with element_type (e.g. "text", "shape", "particles") for just that element's fields (much smaller). Use this when authoring with set_project / add_element so you never guess a field.

    Annotations the server declares

    • title: Get the Clipkit JSON Schema (exact fields)
    • readOnlyHint: true
    • openWorldHint: false
    • destructiveHint: false
  • preview_stillRender a single frame of the current project to a PNG and return it as an image you can look at.No findings

    Why it is in this group

    • The name "preview_still" says "preview": a word for reading.
    Description, as the server wrote it
    Render a single frame of the current project to a PNG and return it as an image you can look at. This is how you check your work — in chat there is no other way to see what a composition actually looks like. Use it liberally: after composing, after edits, and at different times to inspect motion. Stills are FREE (credits are only spent by render_video). Pass `time` (seconds) to choose the frame; defaults to 0.

    Annotations the server declares

    • title: Render one frame of the current project so you can SEE it
    • readOnlyHint: true
    • openWorldHint: true
    • destructiveHint: false
  • read_docsReturn a canonical Clipkit doc as text.No findings

    Why it is in this group

    • The name "read_docs" says "read": a word for reading.
    Description, as the server wrote it
    Return a canonical Clipkit doc as text. topic "card" = the ~8KB compact authoring card — the recommended context for authoring; "pattern-lighting" = the shine/neon/glow technique rigs; "pattern-data-viz" / "pattern-cinematic-ui" / "pattern-ui-screencast" / "pattern-promo-teaser" = ~4-5KB pattern cards (proven idioms: count-ups and bar rows; product hero shots with camera rigs; faked app UI with typing/cursor/clicks) — load ONE alongside the card when the brief matches its archetype; "agents" = the full authoring guide (fetch only when the card doesn't cover a need); "protocol" = the formal field spec; "brand" = brand reference. (Same docs offered as MCP resources, exposed as a tool so you can read them directly — resources are not always model-readable.)

    Annotations the server declares

    • title: Read the Clipkit authoring docs
    • readOnlyHint: true
    • openWorldHint: false
    • destructiveHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http clipkit https://www.clipkit.dev/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__clipkit__read_docs",
      "mcp__clipkit__get_schema",
      "mcp__clipkit__get_project",
      "mcp__clipkit__describe_project",
      "mcp__clipkit__preview_still"
    ],
    "ask": [
      "mcp__clipkit__create_project",
      "mcp__clipkit__add_element",
      "mcp__clipkit__edit_element",
      "mcp__clipkit__validate_project",
      "mcp__clipkit__open_in_editor",
      "mcp__clipkit__ingest_asset"
    ],
    "deny": [
      "mcp__clipkit__set_project",
      "mcp__clipkit__delete_element",
      "mcp__clipkit__create_promo",
      "mcp__clipkit__load_project"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as clipkit. Review it before you use it.