Your model

Let your model knit.

The studio and your model use the same tools against the same store. Nothing is a model-only back door.

Available now

Add it to your model

From the desktop app

Open Settings, Model, and copy the command under Connect Claude Code. Run it in a terminal, or paste it into Claude Code and ask it to connect to knitted. It looks like this, with your own address:

claude mcp add --scope user --transport http knitted http://127.0.0.1:PORT/api/mcp/YOUR-KEY

Other MCP clients take the address on its own. It works while knitted is open, and it holds a key, so keep it to yourself. Settings can make a new one and shut the old.

From a clone

The server also speaks over stdio, so it needs no ports and no account. Clone the repository, run npm install, then add this to your client’s MCP settings with your own path.

{
  "mcpServers": {
    "knitted": {
      "command": "node",
      "args": ["/path/to/knitted-studio/packages/mcp/src/server.mjs"]
    }
  }
}

From a clone, knitting needs Playwright and ffmpeg installed. The other tools do not.

The 33 tools

list_projects

List the projects in this studio: id, name and how many patterns each has. Start here when you do not know a project id.

Takes nothing.

create_project

Create a project. starter: social gives it five ready patterns (Story, Post, Square, Landscape, Banner) with a headline slot each; blank gives one empty pattern.

Takes name, starter (optional).

get_project

A project's patterns, how much Yarn it has, and its brand (colours, fonts and voice).

Takes projectId.

set_project_picture

Show one of a project's images or videos (from its Yarn) on the project's card in the studio, so the person knows it at a glance. A logo or a key photo works well. Leave out yarnId to take the picture away.

Takes projectId, yarnId (optional).

list_yarn

List the files (Yarn) in a project: images, video, audio, fonts and saved copy. Filter by kind, tag or a search word. Use a Yarn name or id when filling an image slot.

Takes projectId, kind (optional), tag (optional), q (optional).

import_yarn

Add a file to a project's Yarn from a public web address: an image, a video, a sound, a font (to use it in a swatch) or a text file. Or save a piece of text as reusable copy. Local files are not accepted here; ask the person to upload them in the studio.

Takes projectId, url (optional), text (optional), name (optional).

tag_yarn

Set the tags on a piece of Yarn. Tags let a batch pick from a group, like tag:product.

Takes yarnId, tags.

rename

Rename a pattern or a piece of Yarn: give its patternId or its yarnId, and the new name. Use it to label a draft of your own, like "Draft: spring post"; only a person deletes, in the studio.

Takes patternId (optional), yarnId (optional), name.

get_brand_guidelines

The brand's colours, fonts and how it writes (voice, do and do-not lists, examples). Read this before writing any copy.

Takes projectId.

propose_swatch

Propose a brand (a swatch) for the person to review: read it from the brand's website (url), give it yourself (colors, fonts, voice), or both, and what you give wins over what the site says. It is saved as a NEW swatch and never made the project's: the person looks it over in the Swatch tab and presses Use for this project. Fonts are matched to the bundled ones and to font files in the project's Yarn, so import_yarn a brand's font file first to use it. A swatch needs a primary, a text and a background colour.

Takes projectId, url (optional), name (optional), colors (optional), fonts (optional), voice (optional), logoYarnId (optional).

list_patterns

The patterns in a project.

Takes projectId.

get_pattern

A pattern as data: every stitch, with slot names, locked or free, and coordinates as fractions of the frame. Large; prefer describe_pattern.

Takes projectId, patternId.

describe_pattern

A short text summary of a pattern: what slots it has, which are locked by the brand and which you may fill, what it says now, any animation, and the brand's voice. The cheapest way to understand a pattern.

Takes patternId.

create_pattern

Add an empty pattern to a project. Sizes: Story 1080x1920, Post 1080x1350, Square 1080x1080, Landscape 1920x1080, Banner 1456x816.

Takes projectId, name (optional), size (optional).

duplicate_pattern

Copy a pattern, locks and all.

Takes patternId.

fill_slots

Write into a pattern's named slots. A text slot takes text. An image or video slot takes a Yarn name or id from list_yarn, or tag:product for the first file with that tag. A slot inside a part is addressed part.slot, like lower_third.name. Locked slots are REFUSED and reported: if you are refused, tell the person, do not look for another way around it. Returns what was filled and what was refused with the reason.

Takes projectId, patternId, slots.

add_stitch

Add a stitch. Coordinates are fractions of the frame (0 to 1). kind: text, image, shape. Give it a slot name so it can be filled later. Text sizes in style.fontSize are fractions of the frame WIDTH (0.05 is a modest body size, 0.1 a headline).

Takes patternId, kind, slot (optional), x, y, w, h, content (optional), yarnId (optional), style (optional).

update_stitch

Change a stitch's text, position, size, image or style. Address it by slot name.

Takes patternId, stitch, patch.

remove_stitch

Remove a stitch. Locked stitches are refused.

Takes patternId, stitch.

set_size

Change a pattern's size. Everything is stored as fractions, so it re-lays out. Check the result with preview_pattern.

Takes patternId, size.

apply_batch

Apply several edit commands as ONE step, so a person can undo it as one. atomic: true applies all or nothing. Each command is {type, ...}: addStitch {stitch}, updateStitch {id, patch}, removeStitch {id}, reorder {id, toIndex}, setSize {size}, fillSlot {slot, content} (text slots only; set an image with updateStitch and a yarnId), setMeta {name, durationMs}, setMotion {stitchId, clips}, setAudio {audio}. setLocked is refused: only a person locks or unlocks.

Takes patternId, commands, atomic (optional).

list_parts

Reusable parts you can insert: lower thirds, quotes, price tags and the project's own. Each lists its slots.

Takes projectId.

insert_part

Put a part into a pattern. Then fill its slots with fill_slots using instance.slot.

Takes patternId, partId, slot (optional), x (optional), y (optional), w (optional), overrides (optional).

list_presets

The animation presets available to set_motion.

Takes nothing.

set_motion

Animate a stitch: give it clips, each {preset, startMs, endMs}. Replaces that stitch's clips. Also set the pattern's length with durationMs if the animation runs past it. Keep text on screen long enough to read (about 3 words a second).

Takes patternId, stitch, clips, durationMs (optional).

list_voices

The voices available for voiceover, and whether the configured voice works right now.

Takes nothing.

synthesize_voiceover

Speak lines and put them on the pattern's timeline as sound, optionally with timed captions. Returns a job id: check it with get_job. The pattern becomes a video long enough for the speech.

Takes patternId, lines, voice (optional), captions (optional).

preview_pattern

Render the pattern and SEE it: returns a PNG. Use it after layout changes to check your own work. time is milliseconds for animated patterns.

Takes patternId, time (optional).

check_pattern

Run the same quality checks Knit runs, without drawing anything: missing files, low contrast, text that will not fit, animation that is too busy. Fix errors before knitting.

Takes patternId, params (optional).

knit_pattern

Make real files (PNG, JPEG, WebP or MP4) from a pattern, through the same job the studio's Knit button uses, with the same checks. params: sizes (array of {name,w,h}), format, scale (1 or 2), rows (an array of objects of slot values, one per post, to make many). A row may only fill free slots. Returns file paths and any issues, or a jobId when wait is false.

Takes projectId, patternId, params (optional), wait (optional).

get_job

Check on a job: a knit or a voiceover.

Takes jobId.

cancel_job

Stop a running job.

Takes jobId.

list_knits

What has been knitted in a project, newest first.

Takes projectId.

The rule that keeps it safe

A locked stitch cannot be changed through this interface. fill_slots refuses it and says so in its reply, so your model never believes it wrote a headline that it did not. Unlocking is a human act in the studio.

Full MCP reference · Using your model