Repository navigation
feat(mcp): one-click Claude Desktop extension (.mcpb), without FFmpeg - #58
Merged
Merged
Conversation
…undled When ffmpeg-static's binary isn't on disk (install scripts skipped, or the Claude Desktop extension, which leaves FFmpeg out), FFmpeg resolves to the first ffmpeg on PATH or in Homebrew's, MacPorts', winget's, Scoop's or Chocolatey's folder. whisper-cli uses the same lookup, since an app opened from the Dock lacks Homebrew on PATH. An empty MAKEMYCLIP_FFMPEG_PATH or MAKEMYCLIP_WHISPER_PATH counts as unset, and FFmpeg resolves per run, so one installed while the server runs works. probe uses the shared resolution instead of its own. doctor names the extension's settings when MAKEMYCLIP_BUNDLE=mcpb. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pnpm build:mcpb packs release/makemyclip-editor.mcpb: the built CLI and a flat production install, run by Claude Desktop's built-in Node 24 as `clip mcp`. FFmpeg stays out (the Apple Silicon build ffmpeg-static downloads is not redistributable); the build fails if a binary slips in. Settings: media folder, FFmpeg, whisper model and whisper-cli, each optional. A blank media folder in the extension means Documents/MakeMyClip. The manifest test checks the mcpb 0.3 schema, the tool list against the server, and the launch env through mcpb's own config builder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…FFmpeg license notes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…bles on PATH The filter list and the filtergraph-file option were cached once per process, but FFmpeg now resolves per run: after a switch, captions could stay refused or get the wrong option. Both are now cached per resolved path. The PATH lookup also skips files without the execute bit, as the shell does, instead of picking one execa can't run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Nov 7, 2026
|
🎉 This PR is included in version 0.4.1 🎉 The release is available on:
Your semantic-release bot 📦🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Targets the integration branch
feat/distribution. Nothing releases until that branch merges intomain.What
A one-click Claude Desktop extension:
makemyclip-editor.mcpb, built in CI and attached to every GitHub release. It runsclip mcpon Claude Desktop's built-in Node 24, so the user needs no Node, nonpxand no JSON config.FFmpeg is not in the bundle. ffmpeg-static's Apple Silicon binary is FFmpeg 6.0 built with
--enable-nonfree;ffmpeg -Lsays it "is not legally redistributable". The Intel macOS and Windows builds are GPLv3, so shipping them would make us the distributor, with the full corresponding source to host on every release. The extension instead runs the FFmpeg the user installs. That is onebrew install ffmpegorwinget install Gyan.FFmpeg, and thedoctortool says so. Decided with the maintainer on 2026-11-07. A backlog note covers finding a redistributable arm64 build.Finding an installed FFmpeg (
src/system-binary.ts).PATH=/usr/bin:/bin:…, without Homebrew.findSystemBinary(name)returns the first executable on PATH, then in Homebrew's, MacPorts', winget's, Scoop's or Chocolatey's folder.resolveFfmpeg():MAKEMYCLIP_FFMPEG_PATH→ ffmpeg-static's binary if it's on disk → an installed FFmpeg. The middle step used to return the bundled path even when the install script had never run.probe.tsused its own resolution; it now usesresolveFfmpeg().whisperBinary()).MAKEMYCLIP_FFMPEG_PATH,MAKEMYCLIP_WHISPER_PATHorMAKEMYCLIP_WORKSPACEcounts as unset. The extension passes""for a setting left blank.The extension (
mcpb/manifest.json,pnpm build:mcpb).server.type: node,node ${__dirname}/dist/cli.js mcp,compatibility: { platforms: [darwin, win32], runtimes.node: >=24.0.0 }, the 8 tools, andicon.pngfrom the logo.MAKEMYCLIP_WORKSPACE), FFmpeg, Whisper model and whisper-cli. Each defaults to"", so a blank setting never reaches the server as a literal${user_config.x}.~/Documents/MakeMyClip, chosen in code (MAKEMYCLIP_BUNDLE=mcpb). The spec allows${DOCUMENTS}in a default, but mcpb's own config builder passes it through unexpanded.scripts/build-mcpb.tsstagesdist/, README, LICENSE, the icon and a flatpnpm install --prod --frozen-lockfile --ignore-scripts --config.node-linker=hoisted.mcpb packfollows symlinks, so pnpm's default layout would pack its store.--ignore-scriptskeeps ffmpeg-static from downloading FFmpeg, and the build fails if an ffmpeg binary is in the stage.mcpb validateandmcpb pack. The result is 4.4 MB packed, 13.8 MB unpacked, one bundle for both platforms.releases/latest/download/makemyclip-editor.mcpbis a stable link.mcpb signproduces bundles Claude Desktop rejects (mcpb#194, fixed only on mcpb's main branch). Unsigned bundles install.@anthropic-ai/mcpb2.1.2 is a pinned devDependency (MIT, build-time only).Doctor in the extension. With
MAKEMYCLIP_BUNDLE=mcpb:howToSetfield maps each env var to the extension setting that sets it (outside the extension, it points at the shell profile or MCP client config).CI and release.
ci.ymlrunspnpm build:mcpbon every PR..releaserc.json:@semantic-release/execgetsprepareCmd: pnpm build:mcpb, which runs after@semantic-release/npmwrites the version into package.json.@semantic-release/githubuploadsrelease/*.mcpb.Docs.
.mcpb)..mcpbships none.llms.txtupdated to match.docs/backlog/apple-silicon-ffmpeg-build.md.Why
Distribution slice 2 of 4. The finish line: a new user installs the editor in one step from Claude Desktop, the official MCP Registry or a Claude Code plugin marketplace, and
clip doctorsays what's missing. Claude Desktop users mostly don't have Node, and the JSON-config route needsnpx, which an app opened from the Dock often can't find.How to test
Double-click the
.mcpbwith Claude Desktop installed and ask "is my setup OK?".Checks
pnpm test: 772 passed, 24 skipped.pnpm type-checkis clean.pnpm linthas 0 errors (the 7 warnings were already there).pnpm buildandpnpm build:mcpbpass.tests/system-binary.test.ts: PATH before install folders, winget's.exeon Windows, the bare name when nothing is installed, and a non-executable file on PATH being skipped (real files).tests/mcpb-manifest.test.ts: the manifest passes mcpb's 0.3 schema, and its tool list equals the MCP server's. Through mcpb's owngetMcpConfigForManifest, the launch config isnode /ext/dist/cli.js mcp, blank settings become"", and picked settings pass through.tests/doctor.test.ts: Homebrew's FFmpeg and whisper-cli found for the extension; the extension's "doesn't include FFmpeg" fix;howToSet; the newresolveFfmpegorder, including a bundled binary that isn't on disk and an empty override.tests/require-drawtext.test.ts: a newly resolved FFmpeg gets its own filter listing.tests/workspace.test.ts: an emptyMAKEMYCLIP_WORKSPACEfalls back, to~/Documents/MakeMyClipin the extension.mcpb unpackthe built bundle, then startnode dist/cli.js mcpfrom it as Claude Desktop would. The env hadPATH=/usr/bin:/bin, blank settings andMAKEMYCLIP_BUNDLE=mcpb, and the MCP SDK client ran over stdio.doctorfinds/opt/homebrew/bin/ffmpeg7.1.1 with drawtext and vidstab, and/opt/homebrew/bin/whisper-cli.timeline_edit(add_media + a caption track) andtimeline_exportrender a 3 s mp4 with burned-in text.open -a Claude release/makemyclip-editor.mcpb) installed with all settings blank.initializeandtools/listsucceeding.~/Documents/MakeMyClipwas created.0.0.0-development, as expected for a local build. The release build gets the semantic-release version.doctoranswer inside a Claude Desktop chat.codex review --base feat/clip-doctor, gpt-6.1-sol), 4 passes:listFilters()andfilterGraphFileOption()were cached once per process, but FFmpeg now resolves per run, so after a switch captions could stay refused or get the wrong option. Fixed in c566a06: cached per resolved binary.resolveWhispertest didn't allowwhisper-cli.exe. Fixed in 5132d3b.