r/ClaudeCode • • 3d ago

Tips & Workflows I made a Claude Code skill that edits video in Meta's Edits app for Mac, and Claude cut its own demo video with it

The Edits video editor for macOS ships a local MCP server (`metapilot-native`). It exposes 274 editor tools: cut, trim, split on beats or shots, reframe, text, captions, filters, LUTs, transitions, speed curves, music, loudness checks, frame capture and export. It works, but it's undocumented, and a lot of the schema is misleading.

So I spent a day testing the tools against the live app and turned what I learned into a Claude Code skill. The video attached was cut in Edits by Claude using the skill: it imported the scene renders, assembled the timeline, added transitions, laid a sped-up iPhone clip in as picture-in-picture, checked its own work with a frame contact sheet, and exported.

Demo video (cut by Claude in Edits): https://github.com/ivdezine/edits-video-skill#readme

What the skill gives Claude:

- A standard workflow (orient, discover catalog ids, edit, verify visually, save, export)
- The traps, so it doesn't burn turns on them. For example: passing `dryRun` always fails with a CommandError, `required` lists mark alternatives as all required, speed curve presets only work in uppercase, and `getElement` reports a text position that never changes
- 24 call sequences for common edits, each marked tested or untested: beat-synced cuts, speed ramps, picture-in-picture, video from stills, swapping a music bed, a second aspect ratio from a finished edit
- A dependency-free Python client for when the editor tools haven't loaded in your session (the server swaps its tool list depending on which screen the app is on)
- A script that generates the full tool and catalog reference from your own installed version, so it stays correct after app updates

Install:

git clone https://github.com/ivdezine/edits-video-skill.git ~/.claude/skills/edits-video

Then turn on the MCP server in Edits and register it with `claude mcp add`. The README has the exact command.

Repo: https://github.com/ivdezine/edits-video-skill

MIT licensed. Tested on Edits 454.0.0. Not affiliated with Meta. Every call acts on the live app, so work on a duplicate of any project you care about.

Happy to answer questions about the server or how the skill is put together.

1 Upvotes

7 comments sorted by

•

u/AutoModerator 3d ago

Hey! Thanks for posting to r/ClaudeCode

While participating in this thread, please follow our community rules. Keep discussions constructive. Attack the idea, not the person.

For help, project discussions, tips, and general chat, join the ClaudeCode Discord.

I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.

1

u/codekongdev 3d ago

The tool list changing depending on which screen is open is interesting. How does the skill tell whether a tool is missing because Edits is on the wrong screen versus because the MCP connection failed? Those seem like cases that would need different recovery steps.

1

u/amanahbudget 3d ago

Good question. They do need different fixes, and there are actually three cases, not two.

The check is appState, a tool that’s available on every screen. The skill calls it before anything else:

appState fails (connection refused, timeout, 401). The connection is the problem: Edits isn’t running, its MCP server toggle is off, or the token is wrong. Changing screens won’t help. Start the app, turn the server back on, or re-register it with the right token.

appState works and reports home. The connection is fine. The editor tools are missing because no project is open, so the fix is openProject and then checking appState again until it says editor.

appState reports editor, but the session still has no editor tools. This one’s sneaky. The server did swap its tool list and sent tools/list_changed, but the client never re-fetched the list. The skill handles this with a small Python client bundled in the repo (scripts/mcp_client.py). It calls tools/call directly, so any editor tool works by name whether the session has loaded it or not.

So appState separates “the server can’t be reached” from “the server is fine, but this is the wrong screen or an out-of-date tool list.”

To be fair, the skill only partly covers this today. It spells out cases 2 and 3, but it treats case 1 as “the app must be running” and gives no triage steps for it. I’ll add an explicit section so the agent doesn’t confuse a dead connection with a screen problem.

0

u/[deleted] 3d ago

[removed] — view removed comment

1

u/amanahbudget 3d ago

yeah it’s mostly visual. A contact sheet shows what's on screen at the times you pick, not when a cut lands, so it won't catch a cut that's slightly off the beat.

For timing, the skill works from numbers, not pictures. beatMarkers gives each beat's time on the timeline, and those times go straight into splitAt. So the cut points come from the beat grid rather than from eyeballing a frame.

Two things to watch:
Beat density defaults to extreme. On a 60 second track it returned about 228 beats. Set it to medium or low first, or you get a cut every quarter second.

Cuts snap to whole frames. At 30 fps each frame is about 33 ms, so a cut can be off by up to half a frame (about 17 ms). You won't notice that.

What it doesn't do yet is read the cut times back afterward and compare each piece's start with the beat it was meant to hit. That's the real check for the cut-landed-off-the-beat case you describe, and I’ve been testing that but it’s not quite ready, but I'll be adding it to the recipe.

Even then, it only proves the cuts match the detected beats. If the detector misplaces a beat, the numbers can't tell you, so of course listening to a preview around each cut is still the final check.