# Takes for Mac (mcpb · takes-mcp.mcpb)

Tools for the Takes Mac app: scripts, takes, edits and posts for talking-head videos

- Trust score: 40/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-17

## Components

- mcpb · `takes-mcp.mcpb`: 40/100 (this document), [markdown](https://verifymcp.io/servers/marvtub-takes/takes-mcp.md), [page](https://verifymcp.io/servers/marvtub-takes/takes-mcp)

## Channel facts

- Registry: `mcpb`
- Package: `https://github.com/marvtub/takes-public/releases/download/v2026.10.15/takes-mcp.mcpb`
- Version: `2026.10.15`
- Transport: `stdio`
- SHA-256: `20e105b74f466d1f85116b3564394342f928b80410cbabc76a6c27e3e55c67ef`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-17.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
- **Provenance & Transparency**: 48/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 1 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 60/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 16297 tokens (~220/item across 74 items; 74 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 13/100
  - Stability observed for 4 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 75 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the Takes for Mac MCP server?

Takes for Mac ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 20e105b74f466d1f85116b3564394342f928b80410cbabc76a6c27e3e55c67ef; the commands to do that are on this page. If it does not match, do not open it.

- Download bundle: `https://github.com/marvtub/takes-public/releases/download/v2026.10.15/takes-mcp.mcpb`
- SHA-256: `20e105b74f466d1f85116b3564394342f928b80410cbabc76a6c27e3e55c67ef`

### Verify on macOS / Linux

```bash
echo "20e105b74f466d1f85116b3564394342f928b80410cbabc76a6c27e3e55c67ef  takes-mcp.mcpb" | shasum -a 256 -c
```

### Verify on Windows (PowerShell)

```powershell
(Get-FileHash -Algorithm SHA256 .\takes-mcp.mcpb).Hash -eq "20e105b74f466d1f85116b3564394342f928b80410cbabc76a6c27e3e55c67ef"
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-17 (score 40, +1)

- [functional improvement] Security disclosure: fail → pass

### 2026-10-15 (score 39, +4)

- [security regression] Tool safety: pass → unverified
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Schema quality: 192 → 220
- [functional regression] Schema quality: 192 → 218
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional improvement] Tool coverage: 74% → 100%
- [functional improvement] Stability: unverified → 0.07
- [functional] Destructive annotations: All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
- [functional] Package version: 2026.10.9 → 2026.10.15
- [functional] Package version: 2026.10.9 → 2026.10.13

### 2026-10-13 (score 35, +26)

- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 74
- [functional] First check of Destructive annotations: 0
- [functional] First check of Schema quality: good

### 2026-10-12 (score 9)

First indexed and scored.

## MCP tools (74)

### `list_projects` (~21 tokens)

List Takes projects and how many sessions each has. Start here.

### `create_project` (~31 tokens)

Create a project (a folder in the Takes library).

Input parameters:

- `name` (string, required): Name of the new project.

### `list_sessions` (~35 tokens)

List sessions in a project, newest first, with take and keeper counts.

Input parameters:

- `project` (string, required): Project name from list_projects.

### `get_session` (~183 tokens)

Get a session: its id, title, full script, and every take with file path, duration, keeper flag, name and start time (camera and screen files of one take share a number), plus every asset file (edits/, thumbnails/, stills/, assets/), the folder rules ('folders') and 'warnings' about files in the wrong place: fix those. Each take shows edit_ready (word times are ready). Cut takes with cut_take and rough_cut by default: they fix the audio offset and frame rate. checks: the check_edit state of each newest edit. rules: the rules for the session's next step that this chat has not seen yet; follow them.

Input parameters:

- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `create_session` (~120 tokens)

Create a recording session with a title and the script to read on the teleprompter, optionally with variants. Offers it in the Takes app unless open=false (see open_in_app).

Input parameters:

- `open` (boolean): Offer the session in the app. Default true.
- `project` (string): Project name. Created if missing. Default Inbox.
- `script` (string): Markdown script shown on the teleprompter.
- `title` (string, required): The session's title.
- `variants` (array): Optional [{name, script, note}].

### `update_session` (~147 tokens)

Change a session's title (renames its folder) and/or replace its main script. Script changes are saved to history on both sides, so they can be undone. Give a short note. After a rename, use the returned path or the session id; the old path still works.

Input parameters:

- `note` (string): What changed, e.g. 'Tighter hook'.
- `script` (string): The new main script, in markdown.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `title` (string): New title. Renames the folder.

### `set_hooks` (~147 tokens)

Offer several hooks (opening lines) for a session. Replaces earlier hook options. The app shows them above the teleprompter; picking one puts it in the script's first paragraph (the hook slot), and each take records which hook it opened with (take field 'hook'). Write script.md with your best hook as its own first paragraph. Use this for hook options; use variants for different whole scripts.

Input parameters:

- `hooks` (array, required): The hook options, best first: [{text, note}].
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `set_storyboard` (~558 tokens)

Write the session's storyboard: the video as a row of shots that the user sees as a horizontal timeline of sketches on the Storyboard tab, each with its script lines. Use it with the storyboard skill when the user brainstorms a video idea. Replaces the earlier storyboard. Each shot covers one or two script paragraphs: 'say' is those lines word for word from script.md, 'do' is how to film or build it in one short line, 'sketch' is what the frame shows (people, props, framing, the camera move or the motion as arrows; never text in the frame). A sketch already drawn is kept; a new or changed sketch is drawn in the background, about 30 s. redraw=true draws a shot again with the same sketch text. With no image key, nothing is drawn and the answer says so: ask the user for a key, or pass your own sketch as the shot's 'image'. 'video' puts a real clip on the shot instead of a sketch (a file from list_broll, or a file in the session such as edits/x.mp4 or a still such as generated/x.png); the app shows its frame and plays it on hover. 'variants' puts several clips or stills on one shot (A, B, C... in that order) for the user to choose from: the shot shows as a stack; the user flips through them and picks one; 'video' is the one in the video (default the first). Left out, the shot keeps its variants. A new Higgsfield or Replicate clip for a shot keeps the old one as a variant. The user records takes per shot and comments on shots: get_session's 'storyboard' lists each shot's id, section, takes and open comments. 'format' is the video's shape: the cards and sketches use it.

Input parameters:

- `format` (string): The video's shape as W:H, any shape: 16:9 (YouTube, a landscape launch video), 9:16 (Reels, Shorts, TikTok), 4:5 (LinkedIn feed), 1:1, 21:9 (cinema), 4:3, 3:4... Set it on the first call; later calls…
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `shots` (array, required): The shots in order: [{id, section, kind, say, do, sketch, seconds, video, variants, image, redraw}].

### `set_post` (~709 tokens)

Write the session's post for LinkedIn (default, posts/linkedin.md) or X (platform=x, posts/x.md). One session holds one post per platform, so the LinkedIn post and its X version sit together. LinkedIn: the app shows a real LinkedIn feed post with the video, cut after three lines with '…more', so put the hook in the first two lines. Max 3000 characters. X: the app shows a real X post, or a thread when you pass several tweets (tweets=[...], or text with a line holding only '---' between tweets). The media goes on the first tweet. The timeline cuts a tweet over 280 characters with 'Show more' (the user has Premium, so longer is allowed). The user edits the post in the app and comments on selected text; fix those comments with set_post. YouTube (platform=youtube): the long wide video. Pass title (max 100) and the description as text (chapters as '0:00 Intro' lines). Vertical (platform=vertical, also for tiktok/reels/shorts): one caption for TikTok, Instagram Reels and YouTube Shorts with the 9:16 edit; hook in the first line, max 2200 characters, at most 5 hashtags; title is the Shorts title, on picks the places. The old text stays in history. get_session returns them as 'post', 'x_post', 'youtube_post', 'vertical_post'. Posts are plain text only: they show no markdown. No video? The post works without one (text only, or pass an image). For other versions use create_post_variants; for opening options set_post_hooks. With variant=<slug> it edits that variant instead of the main post.

Input parameters:

- `first_comment` (string): LinkedIn only. Optional: the first comment the user posts under it (links, resources, a question). The app shows it under the post as the user's comment. One per session, shared by the variants. Empt…
- `media` (string): Optional: the video or image to show, e.g. 'edits/hook-v3.mp4'. Default: the newest edit.
- `name` (string): With variant: rename it.
- `note` (string): What changed, e.g. 'Shorter hook'.
- `on` (array): vertical only: where it goes. Default all three.
- `platform` (string): Which post of the session: linkedin (default, posts/linkedin.md), x (posts/x.md), youtube (the long wide video: title + description, posts/youtube.md) or vertical (one vertical video and caption for…
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `text` (string): The whole post, as it will appear.
- `title` (string): youtube: the video title. vertical: the Shorts title (empty: YouTube uses the caption's first line). Max 100 characters.
- `tweets` (array): X only, instead of text: the tweets of a thread in order (one item = one tweet).
- `variant` (string): Optional: edit this post variant (slug) instead of the main post.

### `create_post_variants` (~227 tokens)

Add other versions of the session's LinkedIn or X post (e.g. 'Story first', 'Shorter', 'Single tweet'). The app shows them as tabs above the post preview; the user compares, edits, comments and picks one with 'Use as main'. Only the main post is scheduled. Write the main post with set_post first. Edit a variant later with set_post variant=<slug>. For different openings of the same post use set_post_hooks.

Input parameters:

- `platform` (string): Which post of the session: linkedin (default, posts/linkedin.md), x (posts/x.md), youtube (the long wide video: title + description, posts/youtube.md) or vertical (one vertical video and caption for…
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `variants` (array, required): The versions: [{name, text, tweets, note}].

### `use_post_variant` (~168 tokens)

Make a post variant the main post (the one that is scheduled). The old main goes to post history and the variant tab closes. Only when the user asks; the user usually does it in the app.

Input parameters:

- `platform` (string): Which post of the session: linkedin (default, posts/linkedin.md), x (posts/x.md), youtube (the long wide video: title + description, posts/youtube.md) or vertical (one vertical video and caption for…
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `variant` (string, required): Post variant id from get_session.

### `delete_post_variants` (~143 tokens)

Move post variants to the macOS Trash (their text stays in post history).

Input parameters:

- `platform` (string): Which post of the session: linkedin (default, posts/linkedin.md), x (posts/x.md), youtube (the long wide video: title + description, posts/youtube.md) or vertical (one vertical video and caption for…
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `variants` (array, required): Post variant ids from get_session.

### `set_post_hooks` (~206 tokens)

Offer several hooks for the LinkedIn or X post: opening lines (LinkedIn: the part above '…more', about two lines; X: the first tweet's opening). Replaces earlier hooks for that platform. The app lists them above the post; picking one replaces the post's first paragraph. Write the post with your best hook as its own first paragraph.

Input parameters:

- `hooks` (array, required): The hook options, best first: [{text, note}].
- `platform` (string): Which post of the session: linkedin (default, posts/linkedin.md), x (posts/x.md), youtube (the long wide video: title + description, posts/youtube.md) or vertical (one vertical video and caption for…
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `post_history` (~196 tokens)

Every saved version of the post and its variants, newest first: version, draft ('main' or a variant slug), author (user or claude), note, created, preview. Pass version to get its full text, e.g. to compare with the current post. A version is saved on every change by Claude and while the user edits.

Input parameters:

- `platform` (string): Which post of the session: linkedin (default, posts/linkedin.md), x (posts/x.md), youtube (the long wide video: title + description, posts/youtube.md) or vertical (one vertical video and caption for…
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `version` (string): Optional: one version's full text.

### `restore_post_version` (~154 tokens)

Put an old version back (into its variant if it still exists, else the main post). The current text is saved to history first.

Input parameters:

- `platform` (string): Which post of the session: linkedin (default, posts/linkedin.md), x (posts/x.md), youtube (the long wide video: title + description, posts/youtube.md) or vertical (one vertical video and caption for…
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `version` (string, required): Version id from the history list.

### `get_post_queue` (~187 tokens)

The posting plan: every LinkedIn and X post the user marked ready or that is scheduled, across all projects, sorted by time. Each has platform, session, title, text (X: also 'tweets'), media_path (the video to upload), status, at (iso, utc, local in the chosen tz, this_mac = the Mac's zone, which LinkedIn's scheduler uses) and 'action': what to do on that platform now (schedule, move, replace text, delete, or nothing). The user sets the times with [schedule] on the post tab, or asks you to pick them.

Input parameters:

- `drafts` (boolean): Also list drafts (not marked ready yet), e.g. for a pipeline overview. Default false.
- `platform` (string): Optional: only this platform.
- `posted` (boolean): Also list posts already live. Default false.

### `get_plan` (~96 tokens)

The user's posting plan: the weekdays to post, the slots in the next 14 days, which are empty (next_gap), the buffer (covered slots before the first empty one) and ready posts with no time yet. Use it to tie a new take or edit to the slot it can fill, and to suggest a time when the user marks a post ready. No plan yet: ask the user which days, then set_plan.

### `set_plan` (~112 tokens)

Save the posting days the user picked. Overwrites the plan. Returns get_plan.

Input parameters:

- `days` (array, required): Weekdays: mon, tue, wed, thu, fri, sat, sun.
- `platforms` (array): Which posts fill a slot. Default [linkedin].
- `time` (string): Usual posting time, HH:MM 24-hour. Default 09:00.
- `weeks` (integer): How many weeks the Plan board shows, 2 to 12. Default: unchanged.

### `plan_video` (~197 tokens)

Put a session's video card on a day of the user's Plan board (the calendar in Takes), move it to another day, or take it off (day empty). Use it when the user asks you to plan videos; one call per video. A card shows the session's title and thumbnail; the user drags cards to reorder them. A card covers that day's posting slot as planned; a post with a time fills it. The board grows to show the card's week. Returns get_plan.

Input parameters:

- `before` (string): Optional: another planned session on that day; the card goes before it. Default: last on that day.
- `day` (string): YYYY-MM-DD, up to 12 weeks ahead. Empty: take the card off.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `set_post_status` (~378 tokens)

Record what you did on LinkedIn or X (platform=x) for a session's post. status=scheduled after you scheduled it (records the time and text you scheduled, so later changes show up as an action); status=posted with url once it is live (also marks the session published); ready to undo. The user marks posts ready in the app; only set ready or draft when asked. A post you were asked to schedule that has no time: pass at, the time you picked on the platform.

Input parameters:

- `at` (string): The time it goes out (or went out), ISO 8601 with offset, e.g. 2026-09-29T09:32:00-07:00. Pass it with status=scheduled when the post has no time yet or you scheduled it for another time: the post ta…
- `first_comment_posted` (boolean): true after you posted first_comment under the live post.
- `platform` (string): Which post of the session: linkedin (default, posts/linkedin.md), x (posts/x.md), youtube (the long wide video: title + description, posts/youtube.md) or vertical (one vertical video and caption for…
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `status` (string, required): draft, ready, scheduled or posted.
- `tz` (string): Optional IANA zone for at, e.g. America/Los_Angeles. Default: the post's zone, else this Mac's.
- `url` (string): Link to the live post (status=posted).

### `get_comments` (~257 tokens)

The user's review comments in a session or a library (pass library, not session). Video: 'when' (start/end s), an optional rect (x,y,w,h fractions from top left) and a 'frame' PNG with the area outlined in orange: read it to see what the comment means; 'said' quotes the words spoken then (from the video's transcript). Image: rect + frame. Text (script, variant, README.md, tokens.json): 'quote' is the selected text. Default: open comments.

Input parameters:

- `file` (string): Optional: only this file, e.g. 'edits/hook-v2.mp4'.
- `library` (string): A library: 'style:<Name>' for one of the user's styles (e.g. 'style:Magazine'; a new name makes a new style), a project name for that project's own additions, or 'comments' for the comment copilot's…
- `session` (string): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `status` (string): open (default), resolved or all.

### `reply_comment` (~387 tokens)

Reply to review comments and resolve them. After a round of fixes, send ONE call with replies=[{id, text, resolve, fixed_in, fixed_at, lesson}] for every comment. fixed_in: the new version's file; fixed_at: the second in it where the fix shows (a click on the reply jumps there). text: one line ('Caption 20% smaller'). Unclear comment: ask a question, resolve omitted. In a session each resolved comment needs a lesson: a rule id from get_rules, with missed=true when the edit broke that rule (the same mistake again) or missed=false for a new ask or taste near it; 'new' with rule={area, text} (it applies to the next videos too); else 'one-off'.

Input parameters:

- `fixed_at` (number): As in replies.
- `fixed_in` (string): As in replies.
- `id` (string): Single reply: comment id. Prefer replies=[...].
- `lesson` (string): As in replies.
- `library` (string): A library: 'style:<Name>' for one of the user's styles (e.g. 'style:Magazine'; a new name makes a new style), a project name for that project's own additions, or 'comments' for the comment copilot's…
- `missed` (boolean): As in replies.
- `replies` (array): One reply per comment: [{id, text, resolve, fixed_in, fixed_at, lesson, rule}].
- `resolve` (boolean): As in replies.
- `rule` (object): As in replies.
- `session` (string): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `text` (string): As in replies.

### `get_rules` (~161 tokens)

The rules learned from the user's comments, one file per step: plan (storyboard, script), make (sound, cut, picture, captions, graphics), package (thumbnail), publish (post-all, post-linkedin, post-x, post-youtube, post-vertical), engage (comments) and other. Read and follow the steps you work on before you write, edit or design. get_session and next_path show new ones once per chat; a write tool shows unseen ones once. Without area: the steps with rule counts (full=true at 10).

Input parameters:

- `area` (string): Steps, comma separated ('cut,sound'). 'post' = every post step, 'edit' = the five make steps, 'all' = every rule.

### `set_rule` (~359 tokens)

Add, change, turn off or remove one learned rule. text is one sentence (at most 220 characters); put the rest in details. Keep each area small (10 rules): sharpen a rule before you add one. When an area is full, add the new rule with merge_into (the closest rule) and merged (one sentence for both): The user approves the merge on the Feedback board. Both rules are on until the user decides. Never change a rule the user wrote (by_user) without asking first. A check makes check_edit measure the rule: length: At most {max} seconds long. loudness: Integrated loudness in LUFS: {target, tolerance} (default -14 ± 1). pauses: No silence longer than {max} seconds (default 0.4), quieter than {floor} dB (default -35). peak: True peak in dBTP: {max} (default -1).

Input parameters:

- `area` (string): The area the rule is for.
- `check` (object): {kind, target, tolerance, max, floor}. null removes it.
- `details` (string): Longer words for the rule, at most 600 characters. '' removes them.
- `id` (string): The rule to change. Omit to add a new rule.
- `merge_into` (string): With a new rule in a full area: the id of the closest rule in the same area.
- `merged` (string): With merge_into: one sentence that holds both rules.
- `on` (boolean): false turns the rule off, true on.
- `remove` (boolean): true removes the rule.
- `text` (string): The rule, one short sentence.

### `check_edit` (~201 tokens)

Check each new edit before you show it. It compares the edit with its take: sound, picture, sync, cut words, undone fixes, rules with a check. Fix each failure in a new version and check that. pass null: did not run (skip says why). A failure looks wrong: tell the user its say. review: with a Gemini key, Gemini watches the edit with the rules (about 5 cents, cached per version); without one, a frame sheet for you to look at. Follow review.note.

Input parameters:

- `file` (string, required): E.g. 'edits/hook-v4.mp4'.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `source` (string): Optional take file, when not the keeper.
- `watch` (boolean): false: skip Gemini's review (default true).

### `make_image` (~510 tokens)

Make or change an image straight from Google or OpenAI (much cheaper than a Higgsfield image: never use higgsfield for images). Drafts first, final last: while the user finds the direction, draw with GPT Image (fast, 1536 px at most): flare (GPT Image 2.5 Flare, the default for a new image) or sunburst (GPT Image 2.5 Sunburst, the default for a change or with references). When the user likes a draft, make its final: from=<that draft> redraws it with Nano Banana 2.1 at 4K, the newest and sharpest, with the draft and its references as the guide and the same prompt (add one only for a change). Never make a final before the user picks. When one model fails the next one draws. Waits about 10-60 s and returns the file, <session>/generated/<name>-vN.png, and the model that drew it; the Assets tab shows both. Change an image: images=[session files] (a thumbnail, a still, 'sketch' with shot=<id>) and say what to change. One image per ask.

Input parameters:

- `final` (boolean): Draw the final now with Nano Banana 2.1 at 4K, without a draft. Prefer a draft, then from.
- `format` (string): Shape, e.g. 16:9, 9:16, 4:5, 1:1. Default 1:1, or the input's shape.
- `from` (string): The draft the user picked: make its final (Nano Banana 2.1, 4K, same picture).
- `images` (array): Session images to change or use as references (paths, or 'sketch' with shot).
- `model` (string): For a draft: default flare, or sunburst with images.
- `name` (string): Short file name. Default: the prompt's first words.
- `prompt` (string): What the image shows, or what to change in the given images. Optional with from.
- `quality` (string): Default medium.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `shot` (string): With images=['sketch']: the shot whose sketch to use.

### `voices` (~251 tokens)

ElevenLabs voices: the account's own voices (the user's clone, designed and saved voices), the default voice, the plan and characters left. search=<words> searches the ElevenLabs voice library (with gender, accent, language, age, use_case); add=<add id from search> with name saves one to the account; set_default=<voice> makes a voice the default. Not set up: tell the user to open Plugins › Voices.

Input parameters:

- `accent` (string): With search: e.g. american, british.
- `add` (string): '<public_owner_id>/<voice_id>' from a search result.
- `age` (string): With search: young, middle_aged or old.
- `gender` (string): With search: male, female or neutral.
- `language` (string): With search: language code, e.g. en.
- `name` (string): With add: the name the voice gets in the account.
- `search` (string): Words to search the ElevenLabs voice library for.
- `set_default` (string): A voice name or id to make the default.
- `use_case` (string): With search: e.g. narrative_story, conversational.

### `design_voice` (~203 tokens)

Design a new ElevenLabs voice from a description ('warm German woman, 40s, calm, slow'): writes three samples (generated/voice-<name>-1..3.mp3 with session, else _library/voices/) for the user to hear on the Assets tab. Then save the pick: save=<the sample's save id> with name.

Input parameters:

- `description` (string): Age, gender, accent, tone, pace, use.
- `name` (string): Name of the voice (save) or of the sample files.
- `save` (string): A sample's save id: keep that voice.
- `session` (string): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `set_default` (boolean): With save: make it the default voice.
- `text` (string): Optional sample text, 100-1000 characters.

### `voiceover` (~300 tokens)

Make a voice-over with ElevenLabs: reads text (default: the session's script.md) in a voice (default: The user's default voice, usually a clone) and writes generated/<name>-vN.wav (48 kHz mono, -14 LUFS), shown on the Assets tab with the voice's name. Write the text as spoken words only. Costs ElevenLabs characters (about one per letter): one voice-over per ask.

Input parameters:

- `model` (string): ElevenLabs model id. Default eleven_multilingual_v2; eleven_v3 is more expressive.
- `name` (string): Short file name. Default voiceover-<voice>.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `similarity` (number): 0-1. How close to the original voice.
- `speed` (number): 0.7-1.2. Default 1.
- `stability` (number): 0-1. Lower = more emotion, higher = steadier.
- `style` (number): 0-1. Style exaggeration.
- `text` (string): The words to say. Leave out for script.md.
- `voice` (string): A voice name or id from the ElevenLabs account (voices). Leave out for the default voice (the user picks it in Plugins › Voices).

### `fix_words` (~438 tokens)

Correct what was said in a take or clip: ElevenLabs says the new words in the voice (default: The user's default voice, often a clone) with the sentences around them for the same tone, and Takes cuts them in at the word edges with the take's cleaned voice when there is one. old = the words as said (from the transcript; Takes transcribes the file first when it has no <stem>.words.json), or start/end in seconds. Writes generated/<file>-fix-vN.wav, plus an .mp4 with the video when the new words fit the old time (speed 0.8-1.25x), so the take's times still hold. The lips do not move with the new words: say so when the fix is on camera.

Input parameters:

- `end` (number): End, in seconds.
- `file` (string): Or a session file (an edit, an audio file).
- `model` (string): ElevenLabs model id. Default: the best one for the job.
- `near` (number): When old is said more than once: about where, in seconds.
- `new` (string, required): The words to say instead.
- `old` (string): The words to replace, as said.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `similarity` (number): Similarity to the voice 0-1. Default: the voice's own.
- `speed` (number): Speech speed 0.7-1.2. Default 1.
- `stability` (number): Voice stability 0-1. Default: the voice's own.
- `start` (number): Start, in seconds.
- `style` (number): Style exaggeration 0-1. Default: the voice's own.
- `take` (string): Take number.
- `voice` (string): A voice name or id from the ElevenLabs account (voices). Leave out for the default voice (the user picks it in Plugins › Voices).

### `change_voice` (~217 tokens)

Say a clip again in another voice with the ElevenLabs voice changer: same words, timing and emotion. The user acts the line, a character voice comes out. Whole file or start/end (at most 5 minutes); writes generated/<file>-<voice>-vN.wav, and an .mp4 with the video for a video.

Input parameters:

- `end` (number): End, in seconds.
- `file` (string): Or a session file.
- `model` (string): Default eleven_multilingual_sts_v2.
- `remove_noise` (boolean): Remove background noise first.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `start` (number): Start, in seconds.
- `take` (string): Take number.
- `voice` (string): A voice name or id from the ElevenLabs account (voices). Leave out for the default voice (the user picks it in Plugins › Voices).

### `higgsfield` (~583 tokens)

Make or change a video with Higgsfield (Seedance, Kling, Veo and 30+ more video models) from inside Takes. Video only: images go to make_image. Returns at once; the job runs in the background and the file lands in <session>/generated/<name>-vN, where the Assets tab shows it. With shot=<id> the storyboard shot shows 'Generating' and then plays the clip (aspect ratio = the storyboard format, length = the shot's length, 4-15 s). For a shot, write a real-footage prompt from the shot's do and say (subject, setting, light, camera move); pass image='sketch' to use the sketch only as a composition reference with params {mode: omni_reference}, and say in the prompt that the result is real footage, not a drawing. Change a video: video=<session file> with params {mode: video_edit} (Seedance), or workflow=reframe with aspect_ratio for a new shape. Default model: the one the user picked on Plugins › Higgsfield (higgsfield_status default_model); other models by id (`higgsfield model list` in Bash; `higgsfield model get <id>` for params). Each job costs the user's Higgsfield credits: one job per ask, never a batch nobody asked for. Not installed or not signed in: tell the user to open Plugins › Higgsfield.

Input parameters:

- `aspect_ratio` (string): e.g. 16:9, 9:16, 4:5, 1:1.
- `duration` (number): Seconds (video).
- `end_image` (string): Last frame (session file).
- `image` (string): A reference image: a session file, or 'sketch' for the shot's sketch.
- `model` (string): A Higgsfield model id. Leave out for the default.
- `name` (string): Short file name. Default: shot-<id> or the prompt's first words.
- `params` (object): More model params, e.g. {"mode": "omni_reference", "resolution": "1080p"}.
- `prompt` (string): What the result shows. Not needed for workflow=reframe.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `shot` (string): A storyboard shot id: the clip becomes that shot's video.
- `start_image` (string): First frame (session file or 'sketch').
- `video` (string): A session video to change or reframe (take number or path).
- `workflow` (string): reframe (new aspect ratio) or draw_to_video.

### `higgsfield_status` (~77 tokens)

Is Higgsfield installed and signed in, and how many credits are left; with session, its Higgsfield jobs (running, done, error).

Input parameters:

- `session` (string): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `replicate` (~591 tokens)

Make or change a video on Replicate: the same models as Higgsfield (Seedance 2.5, Kling, Veo, ...) at a price per second of video, no plan. Returns at once; the job runs in the background and the file lands in <session>/generated/<name>-vN.mp4, where the Assets tab shows it. model: owner/name; leave it out for the user's default (replicate_status lists the default models, the first is the default; pick another of them when it fits better). Takes maps prompt, image (the FIRST FRAME), end_image, video, duration, aspect_ratio, resolution and audio to the model's own input names; anything else goes in params by the model's names (call replicate_model first to see its inputs, defaults and allowed values). File inputs, in those fields or params, take a session file, a take number or 'sketch' (the shot's sketch); Takes uploads them. With shot=<id> the storyboard shot shows 'Generating' and then plays the clip (aspect ratio = the storyboard format, length = the shot's length, 4-15 s). For a shot, write a real-footage prompt from the shot's do and say; never use the sketch as the first frame (the video would look drawn): pass it only to a reference-image input if the model has one. Each job costs the user money: one job per ask, never a batch nobody asked for. No token: tell the user to open Plugins › Replicate.

Input parameters:

- `aspect_ratio` (string): e.g. 16:9, 9:16, 1:1.
- `audio` (boolean): Make sound with the video, when the model can.
- `duration` (number): Seconds.
- `end_image` (string): Last frame (session file).
- `image` (string): First frame: a session file or take still. Not a sketch.
- `model` (string): owner/name (or owner/name:version). Leave out for the default.
- `name` (string): Short file name. Default: shot-<id> or the prompt's first words.
- `params` (object): More inputs by the model's own names (replicate_model lists them).
- `prompt` (string): What the clip shows and how the camera moves.
- `resolution` (string): e.g. 480p (cheap drafts), 720p, 1080p.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `shot` (string): A storyboard shot id: the clip becomes that shot's video.
- `video` (string): A session video to change (take number or path), for models that take one.

### `replicate_model` (~67 tokens)

A Replicate model's inputs (type, default, allowed values, what each does), so a job can set what the user asks for. Leave model out for the default.

Input parameters:

- `model` (string): owner/name, e.g. bytedance/seedance-2.5.

### `replicate_status` (~74 tokens)

Is a Replicate token set, which account, the user's default video models; with session, its Replicate jobs (running, done, error).

Input parameters:

- `session` (string): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `next_path` (~310 tokens)

The path for a new file: the right folder and the next version. kind=edit: <session>/edits/<name>-vN.mp4. kind=thumbnail: <session>/thumbnails/<name>-vN.png (the edit's name, plus an option word for several). kind=library: <library>/assets/<group>/<name>-vN.<ext>. Call it before you write any of these. For edit and thumbnail it also gives the user's rules for that step once per chat: follow them.

Input parameters:

- `ext` (string): File extension. Default .mp4 for edit, .png for thumbnail; required for library.
- `group` (string): kind=library: Logos, Icons, Images, Motion, or another one-word group.
- `kind` (string, required): edit, thumbnail or library.
- `library` (string): A library: 'style:<Name>' for one of the user's styles (e.g. 'style:Magazine'; a new name makes a new style), a project name for that project's own additions, or 'comments' for the comment copilot's…
- `name` (string, required): Short name, e.g. 'webmcp-short' or 'logo-mark'. A -vN suffix is ignored.
- `session` (string): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `get_library` (~169 tokens)

Read the style a video uses: The user picks one of the named styles per video or per project (e.g. Magazine), and the project library adds to it. Returns the style's name and 'template', the style library and the project library (README.md style guide, tokens.json colours/type/spacing/radius, assets by group with every version, fonts, open comment counts) and the merged tokens. Without project: the list of styles. Read it before you design anything: a thumbnail, captions, a motion graphic, a slide.

Input parameters:

- `project` (string): Project name, when there is no session.
- `session` (string): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `set_style` (~116 tokens)

Set the style of one video (session) or of a whole project. The user usually picks it on the app's Assets tab. Only when asked.

Input parameters:

- `project` (string): Project name, to set the style of every session in it.
- `session` (string): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `style` (string, required): A style name from get_library. With session, empty = use the project's.

### `save_to_library` (~317 tokens)

Keep a reusable part of an edit in the style library: a title card, lower third, caption look, transition, cover layout, sound. It becomes the next version of assets/<group>/<name>, with your note, and shows on the app's Styles board, where the user comments on it. Do it after each edit for every part a later video could use again. Save a playable preview (.mp4 or .png), and pass source_dir to keep the HyperFrames composition that makes it.

Input parameters:

- `file` (string, required): The rendered part: absolute, or relative to session.
- `group` (string, required): Motion, Titles, Captions, Covers, Logos, Sounds, or another one-word group.
- `library` (string): A library: 'style:<Name>' for one of the user's styles (e.g. 'style:Magazine'; a new name makes a new style), a project name for that project's own additions, or 'comments' for the comment copilot's…
- `name` (string, required): Short slug, e.g. 'lower-third'. Same name = a new version.
- `note` (string, required): One line: what it is and when to use it.
- `session` (string): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `source_dir` (string): Optional folder that makes it (e.g. the HyperFrames composition).

### `create_style` (~149 tokens)

Start a new style from an example the user gives: a link, a video, an image, or words. Makes the style folder (status new) and returns the steps: study the source, write the guide and tokens, build the parts, render the preview. The user compares it with the other styles on the Styles board and keeps or trashes it.

Input parameters:

- `description` (string, required): One line: the look.
- `name` (string, required): Style name, 1-3 words, e.g. 'Bold Notes'.
- `source` (string): What it is made from: the link, file path or words.
- `template` (string): Optional video-edit template it goes with.

### `copy_library` (~264 tokens)

Copy library files from one library to another: 'style:<Name>' or a project name (copy to a new 'style:<Name>' to start a new style from an old one). items are paths inside the library (README.md, tokens.json, assets/Logos/mark-v2.svg); omit for everything. tokens.json merges by token name; other existing files are skipped, never overwritten. move=true trashes the copied files in the source.

Input parameters:

- `from` (string, required): A library: 'style:<Name>' for one of the user's styles (e.g. 'style:Magazine'; a new name makes a new style), a project name for that project's own additions, or 'comments' for the comment copilot's…
- `items` (array): Paths inside the library. Omit for everything.
- `move` (boolean): Move instead of copy. Default false.
- `to` (string, required): A library: 'style:<Name>' for one of the user's styles (e.g. 'style:Magazine'; a new name makes a new style), a project name for that project's own additions, or 'comments' for the comment copilot's…

### `create_variants` (~120 tokens)

Add alternative versions of the script (e.g. 'Punchy hook', 'Story first'). Each shows up as a tab above the teleprompter; the user can read any of them and pick one as main. Use this instead of overwriting the main script when offering options.

Input parameters:

- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `variants` (array, required): The variants: [{name, script, note}].

### `update_variant` (~124 tokens)

Edit or rename a variant: its script, its name (the tab label) or its note. History keeps the old text.

Input parameters:

- `name` (string): New tab label, 1-4 words.
- `note` (string): One line: what changed or why.
- `script` (string): The variant's new script.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `variant` (string, required): Variant id from get_session.

### `set_favorite_script` (~87 tokens)

Mark one script as the favorite (star on its tab): 'main' or a variant id. Omit draft to clear it.

Input parameters:

- `draft` (string): 'main' or a variant id.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `promote_variant` (~70 tokens)

Make a variant the main script. The old main stays in history.

Input parameters:

- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `variant` (string, required): Variant id from get_session.

### `delete_variants` (~71 tokens)

Move variants to the macOS Trash (their text stays in history).

Input parameters:

- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `variants` (array, required): Variant ids from get_session.

### `script_history` (~64 tokens)

List saved versions of the script and variants, newest first, with author, note and a preview.

Input parameters:

- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `get_script_version` (~67 tokens)

Get the full text of one saved version.

Input parameters:

- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `version` (string, required): Version id from the history list.

### `restore_script_version` (~73 tokens)

Put an old version back (the current text is saved to history first).

Input parameters:

- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `version` (string, required): Version id from the history list.

### `rename_take` (~91 tokens)

Name a take. Its files become take-NN-<name>-camera.mov / -screen.mov. Empty name resets.

Input parameters:

- `name` (string): New name. Empty resets it.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `take` (integer, required): Take number.

### `import_take` (~273 tokens)

Add recordings that already exist (e.g. from QuickTime, a phone, a download, or files placed in the session folder) to a session as takes. Never edit session.json by hand: this names the file take-NN-[name-]camera.<ext>, gives it the next take number, reads its length and lists it. One take: path (+ screen_path for its screen recording). Several: takes=[{path, screen_path, name, keeper}], one take each, in order. Files outside the session are copied (move=true moves them); files already in the session folder are renamed in place.

Input parameters:

- `keeper` (boolean): true stars the take as the keeper.
- `move` (boolean): Move files instead of copying them. Default false.
- `name` (string): Name for the take.
- `path` (string): The camera (or only) video file of one take.
- `screen_path` (string): Optional: the screen recording of the same take.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `takes` (array): Several takes: [{path, screen_path, name, keeper, kind}], one take each, in order.

### `phone_videos` (~165 tokens)

The videos the user AirDropped from an iPhone that wait in ~/Downloads (AirDrop or iPhone recordings only; all=true for every video), oldest first, with length, recording time and, with listen=true, the first words said (Whisper, about 10 s per video). Also lists the newest sessions with the start of each script, so you can match each video to its session and import_take it with move=true.

Input parameters:

- `all` (boolean): Every video in the folder, not only AirDrop/iPhone ones.
- `days` (integer): Only files from the last N days. Default 14.
- `folder` (string): Default ~/Downloads.
- `listen` (boolean): Transcribe the first 40 s of each video. Default false.

### `set_keeper` (~77 tokens)

Star or unstar a take as the keeper.

Input parameters:

- `keeper` (boolean): true stars the take as the keeper.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `take` (integer, required): Take number.

### `set_published` (~170 tokens)

Mark a session as published once its video is live on social media, so the user and other agents know it is done (the app shows it on the session). One entry per platform; call again for each platform. published=false unmarks (with platform: only that one). The user then cleans up the session's files in the app; do not trash them yourself.

Input parameters:

- `platform` (string): Where it went live: LinkedIn, X, YouTube, Instagram, TikTok, …
- `published` (boolean): false to unmark. Default true.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `url` (string): Link to the post.

### `list_broll` (~154 tokens)

List the user's own b-roll (_library/broll/<folder>/): self-filmed clips at the desk, hands typing, reactions, lifestyle, outdoor. Each has title, folder, filmed (YYYY-MM), orientation, duration, description, keywords and path. Use it for B-ROLL shots in a storyboard or an edit before asking the user to film new b-roll. The user browses the same clips on the app's B-roll tab.

Input parameters:

- `folder` (string): e.g. Desk work, Hands close-up, Reactions, Lifestyle, Outdoor.
- `orientation` (string): Only vertical or only horizontal clips.
- `query` (string): Words that must all be in the title, description or keywords.

### `search_media` (~197 tokens)

Find footage by meaning across the whole library, on this Mac: clips by what they show ('hands typing', 'walking outside at night', 'close-up of a phone'), stills and thumbnails, and the words said in transcripts and scripts ('where I talk about pricing'). Each hit has path, kind (video, image, speech, script) and, for video and speech, 'at' (seconds into the file). A b-roll clip found by its description has 'about' (that description). Best hit first. Use it to find b-roll for a storyboard shot or an edit before asking the user to film it, and to find an old take or clip the user describes. Same search as ⌘K in the app.

Input parameters:

- `kinds` (array): Only these kinds. Omit for all.
- `limit` (integer): Default 12.
- `query` (string, required): What to find, in plain words.

### `add_broll` (~124 tokens)

Put b-roll clips into a session's broll/ folder (an APFS clone: no extra disk space), so they show on its Assets tab next to the takes. Use the file from list_broll.

Input parameters:

- `files` (array, required): From list_broll, e.g. '1 Desk work/2023-11 High-Angle Typing at Desk (V).mov'.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `list_music` (~158 tokens)

List the user's music and sound effects (_library/audio/Music, SFX, ...): file, title, artist, genre, bpm, duration, path. New downloads in the source folder (Epidemic Sound) are copied in first. Use for picking a song or an SFX for an edit. SFX are short effects (whoosh, pop, typing, notification). Mix songs and effects into a new version of the edit with ffmpeg, under the voice: the app plays only the file, never a song or an effect beside it. The app's Use button asks you for this.

Input parameters:

- `group` (string): Music or SFX. Omit for all.
- `query` (string): Words in the file name.

### `trash_takes` (~101 tokens)

Move takes to the macOS Trash (recoverable). Pass take numbers, or non_keepers=true to trash every take without a star.

Input parameters:

- `non_keepers` (boolean): true trashes every take without a star.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `takes` (array): Take numbers to trash.

### `trash_sessions` (~33 tokens)

Move whole sessions to the macOS Trash (recoverable).

Input parameters:

- `sessions` (array, required): Sessions as 'Project/folder'.

### `move_sessions` (~40 tokens)

Move sessions to another project (created if missing).

Input parameters:

- `project` (string, required): Target project.
- `sessions` (array, required): Sessions as 'Project/folder'.

### `clean_voice` (~273 tokens)

Make a take's voice sound like a proper mic (the user's voice-cleanup: room echo, noise, clipping, hum, then EQ, compressor and loudness). The first call starts it in the background (about 15-60 s per minute of audio); get_session then shows 'voice' under the take, with 'file' when it is done: use that WAV as the take's voice in edits instead of the audio in the .mov. Later calls only change the settings (instant). The user sets the same in the app's player.

Input parameters:

- `kind` (string): camera (default) or screen: the file with the voice.
- `loudness` (string): normal = -14 LUFS (default), quiet = -18 LUFS (under music).
- `on` (boolean): false = use the original audio (keeps the cleaned files).
- `rerun` (boolean): Clean again from the raw take.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `strength` (number): 0-1. How much of the cleanup: 1 = full (default), lower keeps some room.
- `take` (integer, required): Take number.

### `set_best_cut` (~232 tokens)

Set the best cut of a storyboard take after you checked it. The best_cut from Gemini (or from the transcript, without a key) is only a first suggestion: compare it with the transcript and the frames, then write the range you use here (by=agent; the first range stays under gemini). The user sees it on the take in the Storyboard tab. This only marks a range. To make the clip, call cut_take with that range.

Input parameters:

- `clean` (boolean): Every word of the shot's lines is there. Default true.
- `end` (number, required): Seconds from the start of the take.
- `said` (string): What the user says in the range, word for word.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `start` (number, required): Seconds from the start of the take.
- `take` (integer, required): Take number.
- `why` (string, required): One short sentence: what you checked, and what you changed.

### `cut_take` (~282 tokens)

Cut takes into one clip: video at a constant frame rate, the voice in sync, and word times for the clip. It is the default for a cut of a take: it fixes the take's audio offset and frame rate, moves a cut point that falls inside a word to the word's edge (listed in 'moved'), and uses the take's clean voice when clean_voice is done. For what it cannot do (a J/L cut, a speed change, a cut inside a word, an effect), use your own ffmpeg on its clip and .wav, or on the take with get_session's audio_offset_s, and tell the user what you did. set_best_cut only marks a range; cut_take makes the video. Writes _work/<name>-vN.mp4, .wav (voice only) and .words.json in the session. A short cut comes back done; a long one returns a job.

Input parameters:

- `segments` (array, required): The parts to keep, in order: [{take, in, out}], seconds of the take. Add kind: 'screen' to cut a take's screen file. rough_cut's cut has this shape.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `rough_cut` (~203 tokens)

Make a first cut of the takes against script.md: each script line once (the last full try), without false starts, stutters, ums and pauses longer than gap. A take with a best cut uses only that range. Returns the clip (like cut_take) plus dropped (each with why) and missing (script lines no take has). Show the user the clip and tell them what you dropped and what is missing. It is only a first draft: improve it freely (edit cut and call cut_take; see cut_take for your own ffmpeg).

Input parameters:

- `gap` (number): The longest pause kept, in seconds. Default 0.25.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `takes` (array): Take numbers in the order to use. Default: the keeper takes in session order, else all.

### `render_edit` (~497 tokens)

Build an edit from a recipe, as a job, and check it. First version: recipe={name, cut} (cut = rough_cut's cut) plus what you need: frame {shape '9:16'|'16:9'|'1:1'|'4:5'|'source', crop}, over (picture layers: alpha graphics or b-roll, with at/in/out), music and sfx (file, at, gain_db), steps (commands that make the layers, run in _edit/<name>/), cover (a thumbnail). Next version: base=<name> and changes (a JSON merge patch on the newest recipe; a list replaces the whole list; {"name": "hook-vertical"} starts a new line). Takes uses the clean voice once and never uses a finished edit as an input. One render of a name runs at a time: to compare two options, give the second a new name. Returns a job; then publish_edit.

Input parameters:

- `base` (string): The edit to start from: 'hook' (its newest version), 'hook-v4' or 'edits/hook-v4.mp4'. Required when the session has more than one edit name with a recipe.
- `changes` (object): A JSON merge patch on the base recipe. A list replaces the whole list, so repeat the whole entry: {"music": [{"file": "@library/audio/Music/Calm.mp3", "at": 0, "in": 14, "gain_db": -21, "duck_db": 8,…
- `go_back` (boolean): true to build on an older version on purpose. Without it, an old base is refused.
- `recipe` (object): A whole recipe. For a first version, or to rebuild an edit that has no recipe. Times in over, music and sfx are seconds of the cut (a cover adds its own).
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `wait_s` (integer): Wait up to this many seconds (max 120) and return the finished result inline. Default 0.

### `publish_edit` (~354 tokens)

Save a checked render as the next version, edits/<name>-vN.mp4, with its recipe. In one call: reads the checks the render ran (it refuses on a failed check; accept=[{rule, why}] for a fail you meant), puts the version on the posts that follow this edit (a version the user picked stays), answers the review comments it fixes (replies: like reply_comment; fixed_in and resolve are set for you) and saves note as the changelog line. Call it once per version. To show another file on a post, call set_post media=... after. Its review (Gemini watched it, or a frame sheet when there is no key) is for the next version: follow review.note.

Input parameters:

- `accept` (array): [{rule, why}]: failed checks you keep on purpose. rule is a rule id or a check id. Saved in the recipe.
- `go_back` (boolean): true to save even when a newer version was saved while this render ran.
- `note` (string, required): One short line the user reads under the edit, at most 60 characters. Say what the viewer will notice, in plain words. No field names or numbers in dB. Example: 'Music softer. Cut the restart at 0:41.'
- `render` (string, required): The job id from render_edit, or its render path.
- `replies` (array): Comments this version fixes: [{id, text, lesson, rule?}], as in reply_comment.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `get_edit_recipe` (~128 tokens)

The recipe of an edit: how it was made (cut list, voice, layers, music, sfx, cover, checks, the exact commands) and the versions before it. get_session shows a short form of the newest one.

Input parameters:

- `edit` (string): 'hook-v4', 'edits/hook-v4.mp4' or 'hook' for its newest. Default: the newest edit.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `save_broll` (~178 tokens)

Save a video of a session into the user's b-roll library (_library/broll/<folder>/, an APFS clone), so every session can use it (list_broll, add_broll). Gemini describes it in the background and writes the description and keywords into the clip. Only on the user's ask.

Input parameters:

- `file` (string, required): Take number, file in the session ('take-03-camera.mov', 'edits/x.mp4'), or absolute path.
- `folder` (string, required): A folder from list_broll ('1 Desk work'), or a new one.
- `name` (string): A short name; without it the description names the clip.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `open_in_app` (~95 tokens)

Offer the user a project, session or file (e.g. a new edit) in the Takes app. It never takes focus or plays anything: the session gets a dot and opens only on a click. Once per finished result, not for drafts or in-between steps.

Input parameters:

- `path` (string, required): Project name, 'Project/folder', 'Project/folder/edits/x-v2.mp4', or absolute path.

### `run_job` (~209 tokens)

Run slow work (a render, Demucs, Whisper, matting, any command over about 30 s) in Takes, never as a background Bash job or with sleep. Returns a job id at once. The job outlives the chat and Takes, and shows its progress in the session's Jobs row. cmd runs in zsh in the session folder. The result's note says how to wait.

Input parameters:

- `cmd` (string, required): The shell command. Print 'TAKES_PROGRESS 0.4' lines for a progress bar (ffmpeg and N% lines work too).
- `label` (string, required): A few words the user sees, e.g. Render edit v3.
- `outputs` (array, required): New files the job writes, relative to the session (paths from next_path). [] if none.
- `session` (string, required): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

### `get_job` (~159 tokens)

A job's status (starting, running, done, failed, stopped, lost), progress, time left, last log lines, exit code and files. wait_s waits for the end in this call (other takes tools wait too); call again to keep waiting. With session and no id: the running jobs and those that ended in the last day.

Input parameters:

- `id` (string): Job id from run_job, higgsfield or replicate.
- `session` (string): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.
- `wait_s` (number): Seconds to wait for the job to end, 0 to 50. Default 0.

### `stop_job` (~94 tokens)

Stop a running job and every process it started. Files it wrote so far leave the session (they go to its .jobs folder). Higgsfield and Replicate clips cannot be stopped.

Input parameters:

- `id` (string, required): Job id from run_job.
- `session` (string): Session as 'Project/folder', an absolute path, or its id (from get_session). An old path still works after a rename or move.

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/marvtub-takes/takes-mcp#diagnostics

## Score history

- 2026-10-17: 40
- 2026-10-16: 39
- 2026-10-15: 39
- 2026-10-14: 35
- 2026-10-13: 35
- 2026-10-12: 9

## Common questions

### What is the Takes for Mac MCP server?

Takes for Mac is an MCP server listed in the public MCP registry as io.github.marvtub/takes. Tools for the Takes Mac app: scripts, takes, edits and posts for talking-head videos. This page covers its MCPB bundle (https://github.com/marvtub/takes-public/releases/download/v2026.10.15/takes-mcp.mcpb).

### Is the Takes for Mac MCP server safe to use?

Takes for Mac scores 40 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Takes for Mac MCP server expose?

Takes for Mac exposes 74 tools: list_projects, create_project, list_sessions, get_session, create_session, and 69 more. Their descriptions and schemas cost roughly 14,979 tokens of context every time the server is loaded.

### What licence is the Takes for Mac MCP server under?

Takes for Mac declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- Repository: https://github.com/marvtub/takes-public
- Website: https://gettakes.app/
- Changelog RSS feed: https://verifymcp.io/servers/marvtub-takes/takes-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/marvtub-takes/takes-mcp.json
- HTML version of this page: https://verifymcp.io/servers/marvtub-takes/takes-mcp
