Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
b72b663
feat(cli): add clip doctor and an MCP doctor tool
yultyyev Nov 7, 2026
7252717
docs(docs): point setup help at clip doctor
yultyyev Nov 7, 2026
6eb711d
fix(cli): count a whisper-cli that dies on startup as broken in doctor
yultyyev Nov 7, 2026
877fd5a
feat(ffmpeg): find an installed FFmpeg and whisper-cli when none is b…
yultyyev Nov 7, 2026
018adde
feat(mcp): build a Claude Desktop extension (.mcpb) without FFmpeg
yultyyev Nov 7, 2026
a8166c1
ci(ci): build the .mcpb on every PR and attach it to each release
yultyyev Nov 7, 2026
ecbb449
docs(docs): add the Claude Desktop extension install and correct the …
yultyyev Nov 7, 2026
c566a06
fix(ffmpeg): key FFmpeg capability caches by binary; skip non-executa…
yultyyev Nov 7, 2026
5132d3b
test(tools): accept whisper-cli.exe in the resolveWhisper test
yultyyev Nov 7, 2026
19431f3
Merge pull request #56 from MakeMyClip/feat/clip-doctor
yultyyev Nov 7, 2026
211e32a
feat(mcp): describe the server for the official MCP Registry
yultyyev Nov 7, 2026
01d01a6
ci(ci): publish each release to the MCP Registry
yultyyev Nov 7, 2026
81d3617
docs(docs): document the MCP Registry listing and release step
yultyyev Nov 7, 2026
b73956d
fix(mcp): let registry:prepare take the version for a manual retry
yultyyev Nov 7, 2026
8843a36
feat(skill): publish the skill as a Claude Code plugin marketplace
yultyyev Nov 7, 2026
dac1c7a
docs(docs): add the Claude Code plugin install
yultyyev Nov 7, 2026
aaad159
Merge pull request #58 from MakeMyClip/feat/mcpb-bundle
yultyyev Nov 7, 2026
93ccb16
Merge pull request #59 from MakeMyClip/feat/mcp-registry
yultyyev Nov 7, 2026
51aa894
Merge pull request #61 from MakeMyClip/feat/plugin-marketplace
yultyyev Nov 7, 2026
d612b45
ci(ci): release the distribution work as 0.4.1, a patch
yultyyev Nov 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"$schema": "https://json.schemastore.org/claude-code-marketplace.json",
"name": "makemyclip",
"description": "MakeMyClip's Claude Code plugins.",
"owner": {
"name": "MakeMyClip",
"url": "https://github.com/MakeMyClip"
},
"plugins": [
{
"name": "makemyclip-editor",
"source": "./",
"description": "Local video editor Claude drives: remove silence, edit by transcript, add captions, export to Final Cut Pro, DaVinci Resolve or Premiere Pro.",
"category": "media",
"tags": ["video", "video-editing", "ffmpeg", "captions", "transcription"]
}
]
}
23 changes: 23 additions & 0 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "makemyclip-editor",
"displayName": "MakeMyClip Editor",
"description": "Edit videos by chatting: remove silence and repeated takes, edit by transcript with a local whisper.cpp, add captions, render an mp4 or export to Final Cut Pro, DaVinci Resolve or Premiere Pro. Runs FFmpeg on your machine; no API key.",
"author": {
"name": "MakeMyClip",
"url": "https://makemyclip.com"
},
"homepage": "https://github.com/MakeMyClip/editor#readme",
"repository": "https://github.com/MakeMyClip/editor",
"license": "MIT",
"keywords": [
"video",
"video-editing",
"ffmpeg",
"captions",
"subtitles",
"transcription",
"silence-removal",
"fcpxml"
]
}
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,6 @@ jobs:
- run: pnpm test

- run: pnpm build

# The Claude Desktop extension: validates the manifest and packs it.
- run: pnpm build:mcpb
26 changes: 25 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
contents: write # write CHANGELOG, create GitHub releases
issues: write # comment on released issues
pull-requests: write # comment on released PRs
id-token: write # npm Trusted Publishing via OIDC
id-token: write # npm Trusted Publishing and MCP Registry login via OIDC
steps:
- name: Checkout
uses: actions/checkout@v7
Expand Down Expand Up @@ -43,6 +43,30 @@ jobs:
- name: Build
run: pnpm build

# The MCP Registry's CLI, verified against its release signature. The
# release step runs it (as semantic-release's successCmd) once npm has
# the new version and the .mcpb is on the GitHub release.
- name: Install cosign
uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2

- name: Install mcp-publisher
env:
MCP_PUBLISHER_VERSION: v1.8.8
working-directory: ${{ runner.temp }}
run: |
set -euo pipefail
archive="mcp-publisher_linux_amd64.tar.gz"
base_url="https://github.com/modelcontextprotocol/registry/releases/download/${MCP_PUBLISHER_VERSION}"
curl --fail --location --silent --show-error --output "$archive" "$base_url/$archive"
curl --fail --location --silent --show-error --output "$archive.sigstore.json" "$base_url/$archive.sigstore.json"
cosign verify-blob \
--bundle "$archive.sigstore.json" \
--certificate-identity "https://github.com/modelcontextprotocol/registry/.github/workflows/release.yml@refs/tags/${MCP_PUBLISHER_VERSION}" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
"$archive"
tar xzf "$archive" mcp-publisher
echo "$RUNNER_TEMP" >> "$GITHUB_PATH"

- name: Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -141,3 +141,7 @@ dist
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
.vite/

# Claude Desktop extension build (pnpm build:mcpb) and release assets
/build/
/release/
19 changes: 16 additions & 3 deletions .releaserc.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,27 @@
"preset": "angular",
"releaseRules": [
{ "type": "chore", "scope": "deps", "release": "patch" },
{ "type": "chore", "scope": "security", "release": "patch" }
{ "type": "chore", "scope": "security", "release": "patch" },
{ "type": "feat", "release": "patch" }
]
}
],
"@semantic-release/release-notes-generator",
["@semantic-release/changelog", { "changelogFile": "CHANGELOG.md" }],
["@semantic-release/npm", { "tarballDir": "release", "npmPublish": false }],
["@semantic-release/exec", { "publishCmd": "npm publish --provenance --access public" }],
"@semantic-release/github"
[
"@semantic-release/exec",
{
"prepareCmd": "pnpm build:mcpb && pnpm registry:prepare",
"publishCmd": "npm publish --provenance --access public",
"successCmd": "pnpm registry:publish"
}
],
[
"@semantic-release/github",
{
"assets": [{ "path": "release/*.mcpb", "label": "Claude Desktop extension (.mcpb)" }]
}
]
]
}
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ Each tool lives in `src/tools/<name>.ts` and exports:
Rules:
- One tool per file.
- Zod schema is the single source of input truth.
- Handlers return a typed result — `{ path, ... }` for tools that write a file (`ingest.ts`, `inspect.ts`, `split.ts`, `undo.ts` and `delete-op.ts` return other shapes) — never raw FFmpeg output.
- Handlers return a typed result — `{ path, ... }` for tools that write a file (`ingest.ts`, `inspect.ts`, `split.ts`, `undo.ts`, `delete-op.ts` and `doctor.ts` return other shapes) — never raw FFmpeg output.
- Handlers must be idempotent given the same input + workspace state.

## FFmpeg
Expand Down
39 changes: 33 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,13 @@ All of it works from chat (the Claude Code skill or the MCP server), the CLI, an
npx skills add MakeMyClip/editor
```

Or install it as a **Claude Code plugin** from this repo's marketplace, inside Claude Code:

```text
/plugin marketplace add MakeMyClip/editor
/plugin install makemyclip-editor@makemyclip
```

**As a CLI** (for scripts and CI):

```bash
Expand All @@ -68,6 +75,13 @@ clip --help
clip ui # opens http://127.0.0.1:5573
```

**As a Claude Desktop extension** (one click, no Node or config file):

1. Install FFmpeg: `brew install ffmpeg` on macOS, `winget install Gyan.FFmpeg` on Windows.
2. Download [`makemyclip-editor.mcpb`](https://github.com/MakeMyClip/editor/releases/latest/download/makemyclip-editor.mcpb) and double-click it, or drag it into Claude Desktop.

Put your videos in the extension's **Media folder** (by default `Documents/MakeMyClip`); the editor reads and writes only there. The extension doesn't include FFmpeg (see [License](#license)): it finds the one Homebrew, MacPorts, winget, Scoop or Chocolatey installed, or you pick it in the extension's settings, along with the optional whisper model.

**As an MCP server** (drive it from Claude Desktop / Cursor / any MCP client — no API key, on your existing Claude):

```jsonc
Expand All @@ -84,7 +98,7 @@ clip ui # opens http://127.0.0.1:5573
}
```

The Claude Code skill auto-discovers triggers and shells out via `npx -y` on demand. The MCP server exposes the timeline tools (show / edit / check / transcribe / undo / redo / export) over stdio; media stays confined to `MAKEMYCLIP_WORKSPACE`, and `MAKEMYCLIP_WHISPER_MODEL` is only needed for transcription and captions. Everything runs locally and offline — no API key.
It is listed in the [official MCP Registry](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.MakeMyClip/editor) as `io.github.MakeMyClip/editor`, so MCP clients that browse the registry can install it from there. The Claude Code skill auto-discovers triggers and shells out via `npx -y` on demand. The MCP server exposes the timeline tools (show / edit / check / transcribe / undo / redo / export) and a `doctor` setup check over stdio; media stays confined to `MAKEMYCLIP_WORKSPACE`, and `MAKEMYCLIP_WHISPER_MODEL` is only needed for transcription and captions. Everything runs locally and offline — no API key.

**Optional: local transcription** (for editing by transcript, removing retakes, and captions):

Expand All @@ -95,6 +109,14 @@ export MAKEMYCLIP_WHISPER_MODEL=/path/to/ggml-base.en.bin

Download a model such as `ggml-base.en.bin` from [huggingface.co/ggerganov/whisper.cpp](https://huggingface.co/ggerganov/whisper.cpp), and set `MAKEMYCLIP_WHISPER_PATH` if `whisper-cli` isn't on your `PATH`. The editor never downloads a model itself.

**Check your setup:**

```bash
npx -y @makemyclip/editor doctor # add --json for a machine-readable report
```

It checks Node, which FFmpeg runs and whether it can draw text and captions, the workspace, a caption font, and the optional whisper.cpp and model, and prints the fix for anything missing. In Claude Desktop or another MCP client, ask "is my setup OK?" and Claude runs the same check.

---

## Quick start: clean up a talking-head recording
Expand Down Expand Up @@ -258,7 +280,7 @@ Every edit is undoable (`clip timeline undo` / `redo`, `clip timeline log`), and
- **Language:** TypeScript (Node 24+) and React 19 (browser UI)
- **Timeline schema:** [Zod](https://zod.dev/) (shared with the [MakeMyClip.com](https://makemyclip.com) web app)
- **Subprocess:** [execa](https://github.com/sindresorhus/execa) — args as an array, no shell injection
- **FFmpeg:** bundled via `ffmpeg-static`, with `MAKEMYCLIP_FFMPEG_PATH` override or system-binary fallback
- **FFmpeg:** downloaded by `ffmpeg-static` when the npm package installs, with a `MAKEMYCLIP_FFMPEG_PATH` override and an installed FFmpeg as the fallback (the Claude Desktop extension always uses an installed one)
- **Transcription:** optional, user-installed [whisper.cpp](https://github.com/ggml-org/whisper.cpp), run as a subprocess
- **MCP:** [`@modelcontextprotocol/sdk`](https://modelcontextprotocol.io/) — the `clip mcp` server (Claude Desktop / any MCP client)
- **UI:** Hono server + Vite + React, plain CSS
Expand All @@ -271,7 +293,7 @@ Every edit is undoable (`clip timeline undo` / `redo`, `clip timeline log`), and
### Setup & installation

**Do I need FFmpeg installed separately?**
No. MakeMyClip Editor bundles FFmpeg via `ffmpeg-static`, so installing the npm package or running `npx skills add MakeMyClip/editor` is all you need. For your own FFmpeg build (LGPL-only, custom codecs, hardware acceleration), set `MAKEMYCLIP_FFMPEG_PATH` to its path and the bundled binary is ignored.
Not for the npm package, the CLI or the Claude Code skill: `ffmpeg-static` downloads an FFmpeg build for your platform when the package installs. The Claude Desktop extension is the exception: it doesn't include FFmpeg, so install it first (`brew install ffmpeg` or `winget install Gyan.FFmpeg`). For your own FFmpeg build (LGPL-only, custom codecs, hardware acceleration), set `MAKEMYCLIP_FFMPEG_PATH` to its path and the downloaded binary is ignored. `clip doctor` shows which FFmpeg runs.

**What platforms does it run on?**
macOS, Linux, and Windows — anywhere Node 24+ runs. The browser UI binds to `127.0.0.1` and needs no internet connection.
Expand Down Expand Up @@ -317,8 +339,8 @@ Every edit appends to `session.json` and produces a new output file in the works
**Is it free?**
Yes — MIT-licensed, free forever for local editing. No paid tier, no signup, no upsell in the editor. Paid AI-generation features (voice synthesis, music, stock footage) will live on [MakeMyClip.com](https://makemyclip.com) when they ship, behind a separate `@makemyclip/generation` package.

**What's the license situation with the bundled FFmpeg?**
The MakeMyClip Editor source code is [MIT](./LICENSE). The bundled FFmpeg binary (via `ffmpeg-static`) is GPL-licensed because it includes codecs like libx264 and libx265. Subprocess invocation keeps GPL terms confined to the binary, not your application code. For LGPL-only or custom-build requirements (e.g. iOS App Store), set `MAKEMYCLIP_FFMPEG_PATH` to your own binary.
**What's the license situation with FFmpeg?**
The MakeMyClip Editor source code is [MIT](./LICENSE). FFmpeg is a separate program the editor runs as a subprocess, so its license covers the binary, not your application code. The build `ffmpeg-static` downloads is GPLv3 on Intel Macs, Windows and Linux. On Apple Silicon it is a build with nonfree parts that FFmpeg marks as not redistributable, so the Claude Desktop extension ships no FFmpeg at all. For LGPL-only or custom-build requirements (e.g. iOS App Store), set `MAKEMYCLIP_FFMPEG_PATH` to your own binary.

**How is this different from running FFmpeg directly?**
FFmpeg is one binary with a complex CLI; MakeMyClip Editor is 19 named tools with typed inputs, a session log, snapshot/undo, a browser UI, and an agent-callable API. You're still running FFmpeg under the hood — but with a catalog any LLM can call, input validation that prevents bad commands, and a log you can inspect or version-control.
Expand Down Expand Up @@ -407,4 +429,9 @@ Built on the work of [FFmpeg](https://ffmpeg.org/), [whisper.cpp](https://github

## License

[MIT](./LICENSE) for the editor source; GPL for the bundled FFmpeg binary (subprocess-isolated). Use it, fork it, ship it.
[MIT](./LICENSE) for the editor source. FFmpeg is a separate program, run as a subprocess under its own license:

- **npm package, CLI, Claude Code skill:** `ffmpeg-static` downloads an FFmpeg build from its GitHub releases when the package installs. The Intel macOS, Windows and Linux builds are GPLv3. The Apple Silicon build includes nonfree parts and isn't redistributable.
- **Claude Desktop extension (`.mcpb`):** includes no FFmpeg. It runs the one you install.

Set `MAKEMYCLIP_FFMPEG_PATH` to use an FFmpeg of your choice. Use it, fork it, ship it.
9 changes: 8 additions & 1 deletion RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,18 @@ When the workflow publishes, it:
1. Reads commits since the last tag, decides the next version
2. Updates `CHANGELOG.md` for the release notes
3. Publishes to npm at `@makemyclip/editor` with provenance attestation
4. Creates a GitHub Release with auto-generated notes
4. Creates a GitHub Release with auto-generated notes, with the Claude Desktop extension `makemyclip-editor.mcpb` attached (built by `pnpm build:mcpb`)
5. Tags the commit as `v<version>`
6. Lists the version in the official MCP Registry as `io.github.MakeMyClip/editor` (`pnpm registry:publish`, after npm has it and the `.mcpb` is on the release)

The package shows a verified publisher badge on npmjs.com because of provenance.

### MCP Registry

`server.json` holds the listing. At release, `pnpm registry:prepare` stamps it with the version and adds the `.mcpb` (its release URL and SHA-256); that change stays in the release job's checkout. The registry checks that the npm version's `package.json` has `"mcpName": "io.github.MakeMyClip/editor"`, case included, and that the `.mcpb` URL is reachable. The release job logs in with GitHub OIDC (`mcp-publisher login github-oidc`), which grants the `io.github.MakeMyClip/*` namespace; `mcp-publisher` is downloaded and checked against its sigstore signature.

If the registry step fails, npm and the GitHub release are already out, and re-running the job does nothing (semantic-release sees no new commits). List the version by hand from a checkout of the tag (its `package.json` still says `0.0.0-development`, so pass the version): `gh release download v<version> --pattern makemyclip-editor.mcpb --dir release` (the registry entry must match the released file's SHA-256), `pnpm registry:prepare <version>`, then `mcp-publisher login github --token <PAT>` (a token with `read:org`, from an owner of the MakeMyClip organization; the interactive login can't publish to an organization namespace) and `mcp-publisher publish`.

## First-time setup

These steps run **once**, before the first automatic release.
Expand Down
2 changes: 1 addition & 1 deletion SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ These are the recovery loop the council called must-haves. Snapshot before any u
npx skills add MakeMyClip/editor
```

That's it.
That's it. Or, as a Claude Code plugin: `/plugin marketplace add MakeMyClip/editor`, then `/plugin install makemyclip-editor@makemyclip`. If a command fails with a setup error (FFmpeg, its drawtext filter, whisper.cpp, a font, the workspace), or the user asks whether their setup works, run `npx -y @makemyclip/editor doctor`: it lists each check with the fix for anything missing.

## License

Expand Down
2 changes: 2 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
"includes": [
"src/**/*",
"tests/**/*",
"scripts/**/*",
"mcpb/**/*",
"*.json",
"*.md",
"!dist",
Expand Down
3 changes: 3 additions & 0 deletions docs/backlog/apple-silicon-ffmpeg-build.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Redistributable FFmpeg for Apple Silicon

`ffmpeg-static`'s darwin-arm64 binary (FFmpeg 6.0 from osxexperts) is built with `--enable-nonfree`, and `ffmpeg -L` says it is not legally redistributable. npm installs on Apple Silicon download it, and the Claude Desktop extension ships no FFmpeg because of it. Find or build a GPL arm64 FFmpeg with drawtext and vidstab (a pinned CI build from source, with its corresponding source published) so Apple Silicon users get a redistributable build, and so the `.mcpb` could include FFmpeg for one-click setup.
3 changes: 3 additions & 0 deletions docs/backlog/plugin-mcp-server.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# MCP server inside the Claude Code plugin

The `makemyclip-editor` plugin ships only the skill, which drives the `clip` CLI. Declaring the MCP server in `plugin.json` (`mcpServers`) would give Claude Code the timeline tools with image results (frames, cut contact sheets) as well. The plugin directory blocks an unpinned `npx` server, so this needs `npx -y @makemyclip/editor@<version> mcp` kept in step with each release: the release job would have to commit the bump back (for example `@semantic-release/git`), which it doesn't do today.
8 changes: 5 additions & 3 deletions llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

- **Name:** MakeMyClip Editor (npm `@makemyclip/editor`, current release v0.4.0)
- **Type:** Agent-driven video editor (not generative AI)
- **Backend:** FFmpeg (bundled via `ffmpeg-static`); optional user-installed whisper.cpp for transcription
- **Backend:** FFmpeg (downloaded by `ffmpeg-static` at npm install; the Claude Desktop extension uses an installed FFmpeg); optional user-installed whisper.cpp for transcription
- **Surfaces:** Claude Code skill · `clip` CLI · browser UI at `127.0.0.1:5573` · MCP server (`clip mcp`)
- **Agent access:** Claude Code skill + MCP server (`clip mcp`); no API key — the editor embeds no language model, it runs on whichever Claude you already use
- **Tests:** 741 passing
- **License:** MIT (code) + GPL (bundled FFmpeg binary, subprocess-isolated)
- **License:** MIT (code); FFmpeg runs as a subprocess under its own license (GPLv3 builds from `ffmpeg-static`, except a nonfree Apple Silicon build; the `.mcpb` ships no FFmpeg)

## What v0.4.0 does

Expand All @@ -25,11 +25,13 @@

## How to install

- Claude Code skill: `npx skills add MakeMyClip/editor`
- Claude Code skill: `npx skills add MakeMyClip/editor`, or as a plugin: `/plugin marketplace add MakeMyClip/editor` then `/plugin install makemyclip-editor@makemyclip`
- CLI: `npm i -g @makemyclip/editor` then `clip --help`
- Browser UI: `clip ui` (opens http://127.0.0.1:5573)
- MCP server: `npx -y @makemyclip/editor mcp` (stdio), with `MAKEMYCLIP_WORKSPACE` set to the media folder
- Claude Desktop extension: install FFmpeg, then open https://github.com/MakeMyClip/editor/releases/latest/download/makemyclip-editor.mcpb
- Transcription (optional): install whisper.cpp (macOS: `brew install whisper-cpp`), download a model such as `ggml-base.en.bin`, set `MAKEMYCLIP_WHISPER_MODEL` to its path
- Setup check: `npx -y @makemyclip/editor doctor` (or the MCP `doctor` tool) lists what's missing and how to fix it

## Tool catalog (19 tools)

Expand Down
Loading
Loading