ffmpeg-micro について
MCP クライアントを FFmpeg Micro REST API に接続し、動画変換や定義済みワークフローを実行する MCP サーバーです。ジョブ管理、アップロード、状態確認、署名付きダウンロードリンクに対応します。
主な機能
- 01変換ジョブの作成と管理
- 02定義済み動画ワークフローの実行
- 03署名付き URL によるローカルファイルのアップロード
- 04ジョブのポーリングと状態確認
- 05署名付き出力ダウンロードリンクの生成
活用シーン
- 01品質や解像度のプリセットを使った動画変換
- 02字幕、リサイズ、透かしのワークフロー実行
- 03処理するローカル動画のアップロード
- 04完了したジョブの出力取得
MCP 対応
変換、アップロード、定義済みワークフローなどの FFmpeg Micro API 操作を、MCP クライアント向けのツールとして公開します。OAuth 対応のストリーミング HTTP とローカル stdio の設定を利用できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://mcp.ffmpeg-micro.comclaude mcp add --transport http com-ffmpeg-micro https://mcp.ffmpeg-micro.com{"mcpServers":{"com-ffmpeg-micro":{"type":"http","url":"https://mcp.ffmpeg-micro.com"}}}Cursor で開く{"servers":{"com-ffmpeg-micro":{"type":"http","url":"https://mcp.ffmpeg-micro.com"}}}VS Code で開く{"mcpServers":{"com-ffmpeg-micro":{"type":"http","url":"https://mcp.ffmpeg-micro.com"}}}{"mcpServers":{"com-ffmpeg-micro":{"serverUrl":"https://mcp.ffmpeg-micro.com"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
@ffmpeg-micro/mcp-server
Model Context Protocol サーバーです。AI エージェント — Claude Code、Claude Desktop、Cursor、Windsurf、VS Code、その他の MCP 互換クライアント — が、FFmpeg Micro REST API を通じて動画のトランスコードを作成、監視、ダウンロードできます。
できること
FFmpeg Micro の公開 API に対応するツールを提供します。
| ツール | 機能 |
|---|---|
transcode_video | 1つ以上の入力動画(gs:// または https://)からトランスコードジョブを作成します。品質/解像度のプリセットと、FFmpeg オプションの直接指定に対応しています。 |
get_transcode | 単一ジョブの現在の状態を取得します。 |
list_transcodes | 任意の status、page、limit、since、until フィルターを指定してジョブを一覧表示します。 |
cancel_transcode | 保留中または処理中のジョブをキャンセルします。 |
get_download_url | 完了したジョブの出力ファイル用に、有効期間10分の署名付き HTTPS URL を生成します。 |
transcode_and_wait | 便利な一括処理です。ジョブを作成し、完了するまでポーリングして、署名付きダウンロード URL を1回の呼び出しで返します。 |
request_upload_url | ダイレクトアップロードフローのステップ1です。ホストがファイルのバイトデータを PUT するための、事前署名付き HTTPS URL を返します。 |
confirm_upload | ダイレクトアップロードフローのステップ2です。トランスコード/文字起こしの入力としてすぐに使える、最終的な gs:// URL とプローブメタデータを返します。 |
run_blueprint | ブループリントの実行を開始します。ブループリントは、あらかじめ構築された動画ワークフロー(字幕付け、サイズ変更、ウォーターマーク、広告など)です。 |
get_blueprint_run | ブループリント実行のステータス、ステップ、出力 URL を取得します(複数出力のブループリントでは、ラベル付きの outputs が返されます)。 |
run_blueprint_and_wait | 便利な一括処理です。ブループリントの実行を開始し、完了、失敗、またはトランスクリプトの確認待ちで一時停止するまでポーリングします。 |
continue_blueprint_run | awaiting_review で一時停止している caption-video の実行を、承認済みの SRT トランスクリプトを送信して再開します。 |
ブループリント
ブループリントは、POST /v1/blueprints/{slug}/runs で実行できる、あらかじめ構築されたワークフローです。各ブループリントの入力フィールドについては、ツールの説明を参照してください。注意事項:
- ほとんどのブループリントは FFmpeg レーンで実行され、プランのコンピューティング時間を消費します(トークンは消費しません)。生成系ブループリント(
product-ad)はトークンを消費します。402 insufficient_tokensが返された場合は、アカウントにトークンパックが必要です(ダッシュボード)。 caption-videoはトランスクリプト(srt_text)を含むawaiting_review状態で一時停止するため、エージェントはレンダリング前に内容を確認・編集できます。continue_blueprint_runで再開してください。- 複数出力のブループリント(
listing-kit、hook-variants)は、{label, url}の配列であるoutputsを返します。存在する場合はoutput_urlよりこちらを優先してください。 - 出力 URL の署名の有効期間は10分です。新しいリンクを取得するには、実行情報を再取得してください。
ローカルファイルのアップロード
request_upload_url と confirm_upload の組み合わせを使うと、生の API キーや gs:// URL を扱わずに、MCP ホストから FFmpeg Micro のストレージバケットへローカルファイルをアップロードできます。
- ホストが
{filename, contentType, fileSize}を指定してrequest_upload_urlを呼び出すと、有効期間の短い事前署名付き HTTPS URL が返されます。 - ホストが同じ
Content-Typeを指定して、その URL にファイルのバイトデータを PUT します。 - ホストが
{filename: <storage filename from step 1>, fileSize}を指定してconfirm_uploadを呼び出すと、最終的なgs://...のfileUrlが返されます。 - ホストはその
fileUrlをtranscribe_audio/transcode_video/transcode_and_waitに渡します。
クイックスタート
プロジェクトの .mcp.json(または MCP クライアントの設定)に次を追加します。
{
"mcpServers": {
"ffmpeg-micro": {
"type": "http",
"url": "https://mcp.ffmpeg-micro.com"
}
}
}
これで完了です。AI ツールが初めて接続すると、ブラウザーウィンドウが開き、OAuth を使って FFmpeg Micro アカウントにサインインするよう求められます。承認すると、トークンがキャッシュされ、次回以降は求められません。
コピーする API キーも、設定する環境変数もありません。
認証
OAuth(推奨)
MCP サーバーは、PKCE と動的クライアント登録に対応した OAuth 2.1 をサポートしています。MCP クライアントが一連のフローを自動的に処理します。
- クライアントが
/.well-known/oauth-authorization-server経由で OAuth エンドポイントを検出します - クライアントが動的に自身を登録します
- サインインしてアクセスを承認するために、ブラウザーが開きます
- トークンが交換されてキャッシュされます。以降の接続はすぐに完了します
上記の設定を headers ブロックや env ブロックなしで使用すると、これがデフォルトになります。
API キー(代替手段)
API キーを直接使用する場合(自動化や CI など)は、Bearer トークンとして渡せます。
{
"mcpServers": {
"ffmpeg-micro": {
"type": "http",
"url": "https://mcp.ffmpeg-micro.com",
"headers": {
"Authorization": "Bearer your_api_key_here"
}
}
}
}
API キーは ダッシュボード から取得できます。
stdio(ローカルインストール)
npx を使ってサーバーをローカルプロセスとして実行します。Node.js 22.14 以降が必要です。
{
"mcpServers": {
"ffmpeg-micro": {
"command": "npx",
"args": ["-y", "@ffmpeg-micro/mcp-server"],
"env": {
"FFMPEG_MICRO_API_KEY": "your_api_key_here"
}
}
}
}
npx -y は実行するたびに最新バージョンを取得します。stdio サーバーに対応する MCP クライアントであれば、この設定で動作します。
対応ツール
HTTP 設定(OAuth)は、ストリーミング可能な HTTP トランスポートに対応するすべての MCP クライアントで使用できます。
- Claude Code(CLI)
- Claude Desktop
- Cursor
- Windsurf
- VS Code(GitHub Copilot MCP)
stdio 設定は、stdio トランスポートに対応するすべての MCP クライアントで使用できます。
プロンプトの例
接続したら、次のように尋ねることができます。
- 「この動画を 720p の MP4 にトランスコードして、完了したらダウンロード URL を教えてください。」
- 「この横長の動画を正方形にクロップしてください。」
- 「動画に『エピソード 12』というテキストをオーバーレイで追加してください。」
- 「今週失敗したジョブを一覧表示してください。」
- 「ジョブ
b5f5a9c0-9e33-4e77-8a5b-6a0c2cd9c0b3をキャンセルしてください。」
開発
git clone https://github.com/ffmpeg-micro/ffmpeg-micro-mcp.git
cd ffmpeg-micro-mcp
./scripts/setup.sh
setup.sh は依存関係をインストールし、ビルドを実行して、git フックを設定します。
ローカルのビルドを MCP クライアントに指定すると、変更をすばやく試せます。
{
"mcpServers": {
"ffmpeg-micro-dev": {
"command": "node",
"args": ["/absolute/path/to/ffmpeg-micro-mcp/dist/index.js"],
"env": { "FFMPEG_MICRO_API_KEY": "…" }
}
}
}
ツールのスキーマや応答を試すには、MCP Inspector を使うのが最も手軽です。
npx @modelcontextprotocol/inspector node dist/index.js
ローカル API ゲートウェイに接続して HTTP サーバーをローカルで実行するには、次のようにします。
FFMPEG_MICRO_API_URL=http://localhost:8081 npm run serve
統合テストをローカルで実行する
FFMPEG_MICRO_API_KEY=your_key npm run test:integration
統合テストは、FFmpeg Micro の本番 API に接続します。読み取り専用のため、ジョブは作成されません。
アップロードツールをエンドツーエンドでスモークテストする
ユニットテストでは fetch をモックしているため、ツールの登録、Zod スキーマ、URL パスは検証できますが、通信データの形式がゲートウェイの実際の応答と一致するかは検証できません。2 つのスモークテストスクリプトでは、実際の API キーを使って、実際の MCP サーバーに対する request_upload_url → PUT → confirm_upload の一連のフローを実行します。順番に実行してください。まず stdio(最も早く状況を確認できます)、次にマージ前またはマージ後にデプロイ済みの HTTP サーバーで実行します。
# 1. stdio (local dist build) — spawns dist/index.js as a subprocess
npm run build
FFMPEG_MICRO_API_KEY=your_key node scripts/smoke-upload-stdio.mjs <local-file>
# 2. HTTP (any deployed server — local `npm run serve`, Vercel preview, or prod)
FFMPEG_MICRO_API_KEY=your_key MCP_URL=https://mcp.ffmpeg-micro.com/ \
node scripts/smoke-upload-http.mjs <local-file>
どちらのスクリプトもデフォルトで本番 API に接続し、課金対象の時間を消費します(stdio スクリプトではエンドツーエンドの確認のため、続けて transcribe_audio を実行します)。コストをわずかに抑えるには、15-second.mp3 のような小さなファイルを渡してください。
3 つ目のスクリプトでは、ブループリントツールをスモークテストします(resize-format で run_blueprint と get_blueprint_run を完了までポーリングし、その後 hook-variants で run_blueprint_and_wait を実行して複数出力を検証します)。FFmpeg レーンのブループリントのみを使用するため、プランのコンピューティング時間は消費しますが、トークンは消費しません。
npm run build
FFMPEG_MICRO_API_KEY=your_key node scripts/smoke-blueprints-stdio.mjs
保護が有効な Vercel プレビューへのアクセス
Vercel のプレビューデプロイでは、デフォルトで Deployment Protection によるアクセス制限が適用されます。プレビュー URL に対して HTTP スモークスクリプトを実行するには、プロジェクトの Vercel 設定で Protection-Bypass-for-Automation トークンを生成し、VERCEL_BYPASS 経由で渡します。
FFMPEG_MICRO_API_KEY=your_key \
MCP_URL=https://your-preview.vercel.app/ \
VERCEL_BYPASS=your_bypass_token \
node scripts/smoke-upload-http.mjs <local-file>
スクリプトは、すべてのリクエストでトークンを x-vercel-protection-bypass ヘッダーとして送信します。x-vercel-set-bypass-cookie: true は送信しません。この形式を使うと、POST で 307 の Cookie 設定リダイレクトが発生しますが、MCP SDK の StreamableHTTPClientTransport はこのリダイレクトを追従しないため、リクエストが失敗します。ヘッダーだけを使えば、リダイレクトを経由せずに直接 200 が返されます。
リリースプロセス
リリースはトラステッドパブリッシングを通じて npm に公開され、Ed25519 DNS TXT レコード(ffmpeg-micro.com)で認証されている com.ffmpeg-micro/mcp-server として MCP Registry に公開されます。対応する秘密鍵は、GitHub Actions シークレットの MCP_PRIVATE_KEY に保存されています。npm 側では OIDC トラステッドパブリッシングを使用しているため、npm トークンは保存されません。
リリースは Changesets によって自動化されています。コントリビューターがバージョンを手動で更新したり、コミットにタグを付けたり、公開コマンドを実行したりする必要はありません。PR に changeset を添付すれば、あとはリリースパイプラインが処理します。
コントリビューターの手順(すべての PR)
リリース対象のコードを変更するすべての PR に changeset を含める必要があります。CI チェックによって適用されます。
# While working on your PR:
npx changeset
CLI がバージョン更新の種類(major/minor/patch)と短い概要を尋ねます。.changeset/ の下に Markdown ファイルが作成されるので、そのファイルを PR と一緒にコミットしてください。
リリースを伴わない PR の例外措置(ドキュメント、CI、内部リファクタリング、動作に影響しないテストの変更):
- PR に
no-changesetラベルを追加する、または npx changeset --emptyを実行して「リリース不要」と明示する。
メンテナーの手順(リリースの実施)
リリースを手動で実施する必要はありません。パイプラインが処理します。
- PR が
mainにマージされ、changeset ファイルが追加されます。 .github/workflows/release.ymlがmainへのプッシュごとに実行されます。未処理の changeset がある場合、アクションが作成者となり、chore(release): version packagesPR を作成(または更新)します。この PR では次の処理を行います。changeset versionを実行し、未処理の changeset を反映するpackage.jsonのバージョンを更新するscripts/sync-server-version.mjsを使ってserver.jsonとsrc/version.tsを再同期するCHANGELOG.mdに項目を追加する- 結果を専用ブランチにコミットする
- 出荷の準備ができたら、Version Packages PR をレビューしてマージします。複数の changeset がたまるまで待つこともできます。
mainにさらに PR がマージされると、この PR は自動で更新されます。 - マージ時にリリースワークフローが再び実行されます。今度は未処理の changeset がないため、
changesets/actionがバージョン更新を検出し、次の処理を行います。changeset publishを実行します。npm にそのバージョンがまだ公開されていない場合に限り、npm publish(プロベナンス証明付きの OIDC トラステッドパブリッシング)が実行されるため、mainへのそれ以外のプッシュではこのステップを通過します。- GitHub Release と git タグを自動作成する
- ワークフローの最後のステップで
mcp-publisherをインストールし、DNS の秘密鍵で認証して、com.ffmpeg-micro/mcp-serverとして MCP Registry に公開します。
バージョン同期のチェック
.github/workflows/release.yml は、main へのプッシュごとにバージョンの一致をチェックします。package.json.version、server.json.version、server.json.packages[0].version に不一致があると、ビルドが明確なエラーとともに失敗します。src/version.ts の SERVER_VERSION は tests/version.test.ts によって検証されます。このテストでは、共有サーバービルダー(両方のエントリーポイントで使用される src/mcpServer.ts)とホストされた HTTP アプリから実際の initialize 応答を取得し、報告されるバージョンを確認します。通常は scripts/sync-server-version.mjs によってバージョンが同期されますが、同期処理を経なかった手動編集も、このチェックで検出できます。
確認
Version Packages PR がマージされ、ワークフローが成功したら:
npm view @ffmpeg-micro/mcp-server version
curl -s "https://registry.modelcontextprotocol.io/v0/servers?search=com.ffmpeg-micro/mcp-server" | jq '.servers[] | {v: .server.version, isLatest: ._meta."io.modelcontextprotocol.registry/official".isLatest}'
例:コントリビューター向けの手順
新しい delete_transcode ツールを追加するとします。PR の流れは次のとおりです。
git switch -c feat/delete-transcode
# ... make the code + test changes ...
npx changeset
# ? Which packages would you like to include? › @ffmpeg-micro/mcp-server
# ? Which type of change is this for @ffmpeg-micro/mcp-server? › minor
# ? Please enter a summary for this change › Add delete_transcode tool
git add .changeset/*.md src/ tests/
git commit -m "feat: add delete_transcode tool"
git push -u origin feat/delete-transcode
gh pr create
CI では次の 3 つのチェックが実行されます。
test— 単体テストcheck(Require changeset)—.changeset/*.mdがあることを確認Vercel— プレビューをデプロイ
マージ後、Version Packages PR が自動で作成されるか更新され、追加した項目が含まれます。リリースの準備ができたら、その PR をマージしてください。
ルール
server.json、package.json、src/version.tsのバージョンフィールドを手動で編集しないでください。 これらは Changesets が管理します。scripts/sync-server-version.mjsがpackage.jsonの内容をserver.jsonとsrc/version.tsに反映します。これらに不整合があると、CI のドリフトチェックによりリリースが失敗します。- リリースに対して手動で
git tagを実行しないでください。changesets/actionが公開処理の一環としてタグと GitHub Release を作成します。手動で作成したタグは新しいワークフローでは検出されません。 .changeset/config.jsonまたは.changeset/README.mdを変更して、Require-changeset チェックを回避しないでください。 これらは変更としてカウントされません。npx changeset、no-changesetラベル、またはnpx changeset --emptyを使用してください。
リリース関連のファイル
package.json— バージョンの信頼できる唯一の情報源です。MCP Registry による npm パッケージの検証に必要なmcpNameも含まれます。changeset versionによって更新されます。server.json— MCP Registry のメタデータです。バージョンフィールドはpackage.jsonから自動的に同期されます。.changeset/config.json— Changesets の設定です(パブリックアクセス、GitHub 対応の変更履歴フォーマッター)。.changeset/*.md— 次回のchangeset versionの実行時に反映される、未処理のリリースノートです。scripts/sync-server-version.mjs—package.jsonのバージョンをserver.jsonとsrc/version.ts(サーバーがinitializeで報告するバージョン)に反映します。.github/workflows/release.yml— 公開パイプラインです(changesets/action と MCP Registry のステップ)。.github/workflows/require-changeset.yml— PR に変更セットが含まれていることを必須にします。
トラブルシューティング
- PR で
Require changesetチェックに失敗する場合 —npx changesetを実行し、生成されたファイルをコミットしてください。ドキュメントのみ、または CI のみを変更する PR では、no-changesetラベルを追加するか、npx changeset --emptyを実行してください。 - CI がバージョン同期ガードのステップで失敗する場合 —
server.jsonが手動で編集されています。ローカルでnode scripts/sync-server-version.mjsを実行し、コミットしてプッシュしてください。このガードはpackage.json.version、server.json.version、server.json.packages[0].versionを比較します。代わりにtests/version.test.tsが失敗する場合は、src/version.tsにずれがあります。同じnode scripts/sync-server-version.mjsを実行すれば修正できます。 - 機能追加の PR がマージされた後、
changesets/actionが Version Packages PR を作成しなかった場合 — PR の.changeset/*.mdファイルに実際に内容があったか(バージョンアップの種類と概要を含む空でないフロントマター)を確認してください。空の変更セットは「リリース不要」を示すため、意図的に無視されます。 mcp-publisher publishが「package not found」エラーで失敗する場合 — npm で新しいバージョンの反映がまだ完了していません。リリースワークフローのDetermine if MCP Registry publish is neededステップは、最大約 50 秒間npm viewを再試行し、バージョンがまだ公開されていなければ待機時間を延ばします。その場合、レジストリへの公開は次回の main へのプッシュまで延期され、ずれは自動的に修正されます。手動実行でこの問題が発生した場合は、30 秒待ってから再公開してください。- MCP Registry のバージョンが npm より 1 つ古いままの場合 —
Determine if MCP Registry publish is neededステップがスキップされたか、needed=falseを返しています。main に任意のコミットをプッシュして再実行してください。このゲートはpackage.json↔ npm ↔ レジストリを比較し、自動的に追いつかせます。スキップが続く場合は、ステップのログ出力で各ソースが報告したバージョンを確認してください。 mcp-publisher publishが「mcpName mismatch」の検証エラーで失敗する場合 —package.jsonのmcpNameはserver.jsonのnameと一致している必要があります(どちらもcom.ffmpeg-micro/mcp-serverである必要があります)。mcp-publisher login dnsが「public key mismatch」エラーで失敗する場合 —MCP_PRIVATE_KEYシークレットがffmpeg-micro.comの TXT レコードと一致しなくなっています。ローカルでキーペアを再生成し、TXT レコードと GitHub シークレットの両方を更新してください。
ライセンス
MIT — LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。