mcpField
S
Screencast MCP

Screencast MCP

ローカル
tmhsdigital.github.ioメディア・デザイン11 日前に更新

Screencast MCP について

Screencast MCPは、エージェントが画面を録画し、抽出したフレームを確認して、ffmpegで動画を編集できるWindows向けMCPサーバーです。情報のマスキング、注釈、書き出しにも対応します。

主な機能

  1. 01画面、モニター、ウィンドウ、領域を録画
  2. 02動画からフレームを抽出して確認
  3. 03画面変化の検出と表示テキストの読み取り
  4. 04動画のトリミング、クロップ、マスキング、注釈
  5. 05GIF、WebMなどのメディアを書き出し

活用シーン

  1. 01ソフトウェアの不具合再現を録画して確認
  2. 02Pull Request用に情報を隠したデモを作成
  3. 03UI変更が想定どおり表示されるか検証
  4. 04READMEやSNS向けの短い動画を作成

MCP 対応

Screencast MCPはstdioで通信し、録画、確認、編集、制作の型付きツールをMCPクライアントに提供します。画面録画はWindows専用で、確認・編集・制作ツールはffmpegが動作する環境で利用できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"tmhsdigital-screencast": {
"command": "npx",
"args": [
"-y",
"@tmhs/screencast-mcp"
],
"env": {
"SCREENCAST_HOME": "<SCREENCAST_HOME>",
"SCREENCAST_ALLOWED_DIRS": "<SCREENCAST_ALLOWED_DIRS>",
"FFMPEG_PATH": "<FFMPEG_PATH>",
"FFPROBE_PATH": "<FFPROBE_PATH>",
"SCREENCAST_WHISPER_MODEL": "<SCREENCAST_WHISPER_MODEL>",
"SCREENCAST_MAX_RECORDING_SEC": "<SCREENCAST_MAX_RECORDING_SEC>",
"SCREENCAST_JOB_TIMEOUT_MS": "<SCREENCAST_JOB_TIMEOUT_MS>",
"SCREENCAST_RETENTION_DAYS": "<SCREENCAST_RETENTION_DAYS>",
"SCREENCAST_PS_TIMEOUT_MS": "<SCREENCAST_PS_TIMEOUT_MS>",
"SCREENCAST_CONFIRM_CAPTURE": "<SCREENCAST_CONFIRM_CAPTURE>",
"SCREENCAST_TOOLSETS": "<SCREENCAST_TOOLSETS>"
}
}
}
}
起動コマンドnpx -y @tmhs/screencast-mcp
設定が必要な環境変数
SCREENCAST_HOMEWhere recordings, frames, screenshots, and edits are written (default <homedir>/.screencast-mcp)
SCREENCAST_ALLOWED_DIRSSemicolon-separated folders outputs may be written to besides SCREENCAST_HOME; when set (or when the client sends roots), outputs elsewhere are refused
FFMPEG_PATHPath to ffmpeg if it is not on PATH (ffmpeg and ffprobe are required)
FFPROBE_PATHPath to ffprobe if it is not on PATH
SCREENCAST_WHISPER_MODELwhisper.cpp model file (ggml-*.bin) used by transcribe when a call passes no model
SCREENCAST_MAX_RECORDING_SECDefault recording cap in seconds when a call sets no maxDurationSec (default 3600; 0 disables it)
SCREENCAST_JOB_TIMEOUT_MSOverride the edit job timeout in milliseconds (default scales with the media length)
SCREENCAST_RETENTION_DAYSAt startup, delete screenshots, frames, and leftover raw event logs older than this many days (never recordings or edits; off by default)
SCREENCAST_PS_TIMEOUT_MSLimit in milliseconds for the PowerShell helpers that list monitors and windows and run OCR (default 20000; OCR 60000)
SCREENCAST_CONFIRM_CAPTURESet to 1 to ask the user to confirm every live capture through MCP elicitation; clients without elicitation are refused (off by default)
SCREENCAST_TOOLSETSComma-separated toolsets to load: capture, watch, edit, produce, audio (doctor and get_media_info are always on; default all)

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@tmhs/screencast-mcp0.47.0

ツール

41

掲載時のツール一覧 · 1 日前に更新

パラメーター型必須説明
fpsintegerいいえフレームレート(デフォルトは 30)。
keysenumいいえevents を有効にした場合:masked(デフォルト)は入力をバースト単位(0.5 秒刻みで開始時刻と長さ)でのみ記録し、キーの種類や個々のキーを押した時刻は記録しません。shortcuts は Ctrl、Alt、Win を使ったキーの組み合わせ(例:Ctrl+S)とその時刻も記録します。入力テキストは記録されません。masked | shortcuts
audioobjectいいえ音声キャプチャ(デフォルトはなし、映像のみ)。source 'system' にはループバックデバイスが必要です。マイク録音には対応していません。
audio.devicestringいいえ任意の dshow ループバックデバイス名(list_audio_devices から取得)。省略するとループバックデバイスが自動検出されます。
audio.sourceenumはいsystem はマシンで再生中の音声をキャプチャし、none は映像のみを意味します。system | none
eventsbooleanいいえマウスクリック、スクロール、カーソル位置、入力内容も <recording>.events.jsonl に記録し、動画の時間と同期させて動画ピクセル座標で保存します(デフォルトは false)。read_events で読み取ります。開始に約 1 秒余分にかかります。
outputstringいいえ出力先の .mp4 パス(任意)。デフォルトでは SCREENCAST_HOME/recordings 内のファイルに保存します。
targetstringはいキャプチャ対象:'full' | 'monitor:<index>'(0 = プライマリ)| 'window:<title>'(または window:exe=<app.exe> / window:hwnd=<handle>。タイトルに依存しません)| 'region:<x>,<y>,<w>,<h>'(絶対ピクセル座標)。window: は画面上でウィンドウが占める矩形を記録し、開始時に一度だけ特定します(ウィンドウは表示され、前面にあり、最小化されていない必要があります)。録画中にウィンドウを移動またはサイズ変更しても追従しません。
backendenumいいえgdigrab(デフォルト)は画面の矩形領域を録画します。wgc(window: 対象用、FFmpeg 8+)は Windows Graphics Capture を通じてウィンドウ自体のサーフェスを録画します。ウィンドウが覆われたり、移動したり、バックグラウンドにあったりしても録画を続け、クライアント領域のみをフレームに含めます。wgc では音声を録音しません。gdigrab | wgc
qualityenumいいえエンコーダーのプリセット(デフォルトは standard)。draft | standard | high
overwritebooleanいいえ出力パスに既存のファイルがある場合、置き換えを許可します(デフォルトは false)。
exactTitlebooleanいいえwindow: 対象では、タイトルが指定タイトルと完全に一致するウィンドウのみを照合します(大文字と小文字を区別しません)。部分文字列による照合にはフォールバックしません。デフォルトは false です。
maxDurationSecintegerいいえ指定した秒数後に自動停止し、ファイルを完成させます(デフォルトは 3600、または SCREENCAST_MAX_RECORDING_SEC。上限は 604800、つまり 7 日)。0 = 上限なし。録画が停止されないままになるのを防ぐ安全策です。

詳細

Screencast MCP

エージェントが画面を録画し、映像を 確認 して、最小限の ffmpeg 編集を行える MCP サーバーです。Windows 上で stdio 経由で動作します。

デスクトップ、モニター、ウィンドウ、または領域をキャプチャし、録画をエージェントが実際に確認できるフレームにサンプリングします。トリミング、クロップ、マスキング、注釈の追加、クリック位置へのズームを行い、GitHub やソーシャルメディア向けにエクスポートできます。クラウドもストリーミングも不要です。ffmpeg と ffprobe を使う、型定義済みの 41 個のツールを備えています。


ドキュメント


npm MCP Registry CI ライセンス:CC BY-NC-ND 4.0 最終コミット

TypeScript Node.js Model Context Protocol ffmpeg Capture


screencast-mcp で録画した設定ウィンドウ。カーソルがクリックすると、カメラが[保存]ボタンに向かって滑らかにズームインし、赤いリングがクリックを示します。その後、緑色の「保存済み」バナーが表示されると、画面がゆっくりとズームアウトします。

ツールを使って作成:start_recording に events: true を指定し、1 回クリックしてから、zoom { highlightClicks: true } と export_gif を実行します。作成方法 · その他のワークフロー

クイックスタート

必要なもの: Windows 10 または 11、Node.js 22 以降、そして PATH 上の ffmpeg(winget install Gyan.FFmpeg)。キャプチャは Windows 専用ですが、確認、編集、制作ツールは ffmpeg が動作する環境であればどこでも使えます。

クライアントに追加する:

クライアント方法
Claude Codeclaude mcp add screencast -- cmd /c npx -y @tmhs/screencast-mcp
Claude Desktop最新リリースから .mcpb をダウンロードして開きます(ワンクリック)
Cursor、VS Code など下記の JSON 設定を使うか、クライアントを接続の手順に従ってください
{
  "mcpServers": {
    "screencast": { "command": "npx", "args": ["-y", "@tmhs/screencast-mcp"] }
  }
}

エージェントに次のように依頼します:

バグを再現している間、私の VS Code ウィンドウを 5 秒間録画し、何かが変化したフレームを見せてください。

ワークフローでは、PR 用のバグ再現 GIF、README のデモ、UI の検証ループ、ソーシャルメディア向けの動画、長時間録画を手軽に確認する方法、クリック位置へのズーム、編集全体を 1 回の呼び出しで行う方法などを紹介しています。

概要

Screencast MCP は、エージェントが操作し、内容を把握できるスクリーンレコーダーを提供します。stdio 経由で Model Context Protocol を使用し、ffmpeg をフラグだらけのインターフェースではなく、小規模で型付けされたツール群として公開します。中心となる機能はウォッチループです。エージェントが映像を録画し、PNG フレームにサンプリングして、そのフレームを表示することで、画面上で実際に何が起きたかを確認できます。

設計上の選択は、偶然ではなく意図的なものです。

  • キャプチャは常に明示的に行います。 録画やスクリーンショットはツール呼び出し時にのみ実行され、自動で開始されることも、バックグラウンドやスケジュールに従ってキャプチャされることもありません。
  • 映像を表示できるようにします。 sample_frames は動画を画像に変換してモデルに直接返すため、「何が起きたかを見る」ことが後回しではなく、第一級の操作として扱われます。
  • 生のフラグよりプリセットを優先します。 品質は draft / standard / high から選択でき、エージェントがコーデック、CRF、ピクセル形式について判断する必要はありません。
  • デフォルトで安全です。 出力は SCREENCAST_HOME の下に保存され、プロジェクトのチェックアウト先には保存されません。また、公開リポジトリの .gitignore により、キャプチャしたメディアがコミットされないようになっています。
  • 録画は終了します。 クライアントが切断されると(またはサーバーが SIGINT/SIGTERM を受け取ると)、アクティブな録画はすべて確定され、サーバーが終了します。また、すべての録画には maxDurationSec の上限(デフォルトは1時間)があります。ハードクラッシュによって中断された録画は、次回の起動時に処理されます(孤立ファイルの回収)。

録画と確認以外にできること:

  • クリックした箇所を拡大します。 events: true を指定して録画すると、各クリックに合わせてズームし、その箇所をリングで囲みます。Screen Studio 風の動作です。
  • 共有前に確認します。 MCP Apps に対応するクライアントでは、stop_recording によってインラインプレーヤーが開き、人が映像をトリミングし、墨消しボックスを描画できます。
  • 秘密情報を見つけて覆い隠します。 find_text は Windows OCR で画面を読み取り、redact_region 用の矩形を返します。
  • 1回の呼び出しでエンコードします。 pipeline は、トリミング、クロップ、墨消し、コールアウト、エクスポートを1回の ffmpeg パスとして実行します。
  • 隠れたウィンドウを録画します。 backend: "wgc" を指定すると、Windows Graphics Capture を介してウィンドウ自体のサーフェスを録画します。

ツール

6つのグループに41個のツールがあります。mcp-tools.json のマニフェストが正規のツール一覧です。テストでは、src/tools/ を基準に、マニフェスト、README、ドキュメントサイトの内容が一致していることを確認します。

キャプチャ
ツール用途
start_recordingバックグラウンド録画を開始します。target = full | monitor:<index> | window:<title> | region:<x>,<y>,<w>,<h>。任意のパラメーターとして、fps、quality、audio(ループバック音声もキャプチャするには audio.source = system を設定)、maxDurationSec(自動停止の上限。デフォルトは3600、0 = 上限なし)、および events(クリック、スクロール、カーソル、キー押下を <recording>.events.jsonl に記録。デフォルトでは keys = masked、または shortcuts)を指定できます。セッション ID と出力パスを返します。
stop_recordingID を指定してセッションを停止します。ffmpeg に正常終了を指示するため、ファイルは切り詰められず、確定されます。最終パスと録画時間を返します。
list_sessionsアクティブなセッションと終了済みセッションを一覧表示します。
get_sessionID を指定して、単一のセッションの情報を確認します。
review_recordingMCP Apps に対応するクライアントでは、レビュー用プレーヤーを表示します。インラインプレーヤーで、人が録画内をシークし、トリミングハンドルをドラッグして、墨消しボックスを描画し、トリミングと墨消しを適用したコピーをエクスポートできます(pipeline を1回呼び出します)。stop_recording の結果からも開けます。それ以外の環境では、動画の詳細を返します。
player_framesレビュープレーヤー用の JPEG フレームをプレビューします。エージェントではなく、プレーヤー(アプリ専用)が呼び出します。
read_events動画の時間軸に沿った録画の入力イベントログ(クリック、スクロール、カーソル、キー押下)を読み取ります。start_recording で events: true を指定すると有効になります。
screenshottarget の PNG を1枚キャプチャし、モデルが表示できる画像としてインラインで返します。
list_audio_devicesffmpeg から見える DirectShow オーディオデバイスを一覧表示し、start_recording で使用できるシステム音声のループバックデバイスと思われるものを示します。
監視
ツール目的
sample_frames動画からフレームを抽出します。固定の fps、明示的な timestamps、または画面が変化した箇所のみ(mode: "scenes")を指定でき、エージェントが何が起きたかを確認できます。フレームのパスを返し、最初の数フレームは画像としてインライン表示します。
contact_sheetタイムスタンプ付きのフレームを1枚の画像にタイル状に並べます(等間隔、またはシーンの変化箇所)。エージェントは録画全体を一目で確認でき、結果はインライン表示されます。代わりに、poster: true を指定すると代表的なフレームを1枚書き出します。
screen_diff2枚のスクリーンショット/フレームを比較します。SSIM スコア、変化した範囲の割合、変化した部分のバウンディングボックスを表示し、変更箇所を輪郭で示した画像をインライン表示します。UI の変更が発生したことと、想定した箇所だけに変更があることを確認できます。
wait_for_change対象を監視し、時間を推測して待つ代わりに、対象が変化した(ダイアログが開いた)とき、または安定した(ビルドやページの処理が完了した)ときに結果を返します。経過時間、変化した領域、最終状態をインラインで報告します。
find_textWindows に組み込まれた OCR エンジン(インストール不要)を使い、画面またはフレーム上のテキストを読み取ります。すべての行と一致箇所を、それぞれのバウンディングボックスとともに返します。ラベルからボタンを探したり、画面に表示された内容を確認したり、シークレット(`regex: "sk-
get_media_infoffprobe のラッパーです。再生時間、解像度、fps、コーデック、コンテナ形式、サイズを取得します。
最小限の編集
ツール目的
trimstart と(end または duration)を指定して、動画から短いクリップを切り出します。高速化のため、ストリームをコピーします。
concat2つ以上の動画を1つに結合します。
convertmp4、gif、webm 間で変換します。
export_gifPR、Issue、README 向けに、サイズ制限内に収まるアニメーション GIF または WebP を作成します(デフォルトでは GitHub の画像サイズ上限 10 MB)。GIF では2段階のパレット処理を行います。サイズに収まるまで fps、幅、パレット/品質を段階的に下げ、使用した設定を報告します。
編集機能

これらのツールは再エンコードします(フィルターがピクセルを書き換えるため、ストリームコピーは適用されません)。キャプチャと同じdraft/standard/highプリセットを使用します。

ツール目的
cropピクセル単位の矩形(x、y、width、height)で切り抜きます。フレームからはみ出す矩形は、黙って範囲内に収めるのではなく、拒否されます。
scalewidthやheightを指定してサイズを変更します。片方だけ指定すると縦横比が維持され、両方を指定すると正確なサイズになります。
speedfactorで再生速度を変更します(1より大きいと速く、1より小さいと遅くなります)。音声がある場合は、音声のテンポも変更します。
overlayロゴ、透かし、またはピクチャー・イン・ピクチャーを、位置を指定してベース動画に合成します。サイズ変更や表示時間の制限も指定できます。
callout時間指定の注釈:任意の角度のボックス、テキストラベル、矢印を、それぞれ2つのタイムスタンプの間に表示します。バグを囲んだり、ボタンを指し示したり、手順に説明を付けたりできます。
compresslight/medium/heavyのCRF段階と、縮小のみを行う任意のmaxWidthを使って、再エンコードによりファイルサイズを小さくします。
extract_audio音声トラックを独立したファイル(mp3、aac、wav、またはcopy)に書き出します。
normalize_audio納品目標に合わせたラウドネス調整(2パスのEBU R128 loudnorm):youtubeは−14 LUFS、podcastは−16、broadcastは−23、または任意のLUFS値を指定できます。動画はコピーされ、調整前後のラウドネスが報告されます。
denoiseファイルで測定したノイズフロアに合わせたafftdnを使い、一定して続く背景ノイズ(ファン音、ハム音、ヒスノイズ)を低減します。動画はコピーされます。
transcribeFFmpeg 8のwhisperフィルターを使って、音声をローカルでSRTファイルに書き起こします(whisper.cppのモデルが必要です。modelを渡すか、SCREENCAST_WHISPER_MODELを設定してください)。字幕キューは番号を振り直し、重なりを解消します。
burn_subtitles同梱フォントを使ってSRT/ASSを動画に焼き込みます。cleanは縁取り付きの1行表示、socialはミュート再生向けの暗いボックス上に大きな太字で表示します。
clip1つ以上のフレーム単位で正確な部分区間を抽出し、それぞれ別ファイルにします。trimとは異なり再エンコードするため、指定した時刻どおりにカットできます。
cut_idle無音部分を削除:画面が停止し、(音声がある場合は)無音になっている区間をカットし、両端に短い余白を残します。まずdryRunで結果を報告します。静止画面上の音声は、useAudio: falseを指定しない限り保持されます。
マスキング
ツール目的
redact_region動画内で指定した矩形を覆います。styleはbox(デフォルト。単色で塗りつぶすため元に戻せません)、blur、またはpixelateです。各領域にはstart/endで時間範囲を設定でき、padで範囲を拡張できます。

重要

redact_regionは、指定した領域を覆います。秘密情報を自動検出する機能ではないため、指定していない秘密情報を見つけることはできません。デフォルトのboxスタイルは単色で塗りつぶすため元に戻せません。blurとpixelateは効果が弱く、一部復元される可能性があるため、実際の秘密情報にはboxを推奨します。フレーム外にはみ出す領域は、何もせず黙って無視するのではなく、拒否されます。

制作

制作レイヤーでは、未加工のクリップから完成品を作ります。クリップを組み合わせるツールは、異なるソースをきれいに合成できるよう、まず各入力を共通の解像度、fps、音声レートに自動で正規化します。

ツール目的
xfade_transition2 つの動画を xfade トランジション(fade、wipeleft、slideup、…)でクロスフェードして 1 つにします。両方のクリップに音声トラックがある場合は、音声もクロスフェードします。
assemble_highlights2 つ以上のクリップをハードカット(transition: "cut")または各クリップ間の xfade トランジションでつなぎ、1 つにします。
title_card単独のタイトルカード(中央揃えのテキストと単色背景。合成できるよう無音のトラック付き)を生成します。テキストには同梱のフォントを使用するため、システムフォントは不要です。
music_bed動画に音楽トラックを追加します。動画の長さに合わせてループまたはトリミングし、フェードイン/フェードアウト、音量調整を行い、既存の音声とミックスします(オプションでダッキング可能)。
reframepad(レターボックス表示。コンテンツは失われません)または crop(画面いっぱいに表示し、はみ出した部分をトリミング)を使って、16:9、9:16、1:1、4:5 のアスペクト比に変更します。
zoom操作箇所に滑らかにズームイン/パンし、ズームアウトします(Screen Studio 風)。キーフレーム(時間ごとの矩形)を指定するか、入力イベントログ(start_recording の events: true。highlightClicks を指定すると各クリックをリングで強調表示します)のクリック位置、または画面の変化からキーフレームを自動計画させます。dryRun を指定すると、調整可能な計画が返されます。
export_presetプラットフォームに適したファイル(youtube、instagram_reel、tiktok、x、square、steam_trailer、vertical_reel)をエンコードします。アスペクト比を調整し、fps の上限を設定して、プラットフォームのビットレートで H.264 にエンコードし、faststart を有効にします。steam_trailer は、5.5 Mbps のパディング付き CBR(Steam の下限である 5 Mbps を上回ります)で 1080p H.264 High にエンコードし、音声を 48 kHz、-14 LUFS にします。vertical_reel は、映像をぼかした同じ映像の上に中央配置し、音声を -14 LUFS にします。
pipeline複数の編集を 1 回の ffmpeg プロセスで実行します。各ツールのオプションを指定した trim、crop、scale、speed、redact、callout、reframe、zoom(キーフレーム)の steps を実行し、最後に export_preset または export_gif を任意で追加できます。再エンコードは 1 回のみで中間ファイルは作成されません。また、レシピを保存して次の録画に再利用できます。dryRun を指定すると、実行予定のコマンドが返されます。
ターゲット

すべてのキャプチャツールは単一の target 文字列を受け取るため、エージェントは引用符の扱いに悩む必要がありません。

ターゲットキャプチャ対象
full仮想デスクトップ全体
monitor:<index>1 台のディスプレイ。0 は常にメインディスプレイです
window:<title>ウィンドウが画面上で占める矩形(大文字と小文字を区別しない完全一致。該当しない場合は部分一致。最前面のウィンドウを優先)
window:exe=<app.exe>タイトルに依存せず、そのアプリの最前面のウィンドウ
window:hwnd=<handle>ハンドルで指定した特定のウィンドウ(16 進数の 0x1A2B または 10 進数)
region:<x>,<y>,<w>,<h>絶対座標で指定したピクセル矩形

window: ターゲットでは、screenshot と start_recording の両方が matchedWindow、matchCount、matchKind(exact、substring、exe、または hwnd)、およびキャプチャした region を報告します。タイトルが部分一致のみだった場合、または複数のウィンドウが一致した場合、結果には候補のタイトルを列挙した windowWarning が含まれます。そのため、window:Code のような一般的なタイトルでも、別のウィンドウが気付かないうちに録画されることはありません。部分一致へのフォールバックを完全に拒否するには、exactTitle: true を指定します。

出力は SCREENCAST_HOME(デフォルトは <homedir>/.screencast-mcp)の recordings/、frames/、screenshots/、edits/ に書き込まれます。各ツールでは、明示的な出力パスも指定できます。

編集および制作ツールは、出力先と同じ場所にある <name>.partial.<ext> ファイルに書き込み、ffmpeg が成功した場合にのみ出力先へリネームします。そのため、失敗、タイムアウト、キャンセルが発生しても、output に不完全なファイルが残ることはありません。ジョブのタイムアウトはメディアの長さに応じて変わります(最低 10 分、または動画の長さの 4 倍)。上書きするには SCREENCAST_JOB_TIMEOUT_MS を設定します。進行状況トークンを送信するクライアントには、ジョブの実行中に notifications/progress の更新が送信され、リクエストをキャンセルすると ffmpeg が停止します。

設定

ffmpeg と ffprobe が PATH 上にあるか、FFMPEG_PATH/FFPROBE_PATH で指定されている必要があります。サーバーは呼び出しごとに確認し、いずれかが見つからない場合はインストール方法を案内します(macOS:brew install ffmpeg、Linux:apt install ffmpeg。録画以外のツールの場合)。

変数デフォルト用途
SCREENCAST_HOME<homedir>/.screencast-mcp録画、フレーム、スクリーンショット、編集済みファイルの保存先
SCREENCAST_MAX_RECORDING_SEC3600録画時間のデフォルト上限(0 で無効)
SCREENCAST_JOB_TIMEOUT_MS長さに応じて変動編集ジョブのタイムアウトを上書きします
SCREENCAST_WHISPER_MODELなしtranscribe 用の whisper.cpp モデル
FFMPEG_PATH / FFPROBE_PATHPATH を検索ffmpeg/ffprobe の実行ファイルを明示的に指定します

使い方

ワークフロー: ツール呼び出しと実際の出力を含むコピー&ペースト用のレシピは、ドキュメントサイトにあります:PR 用のバグ再現クリップ、README 用デモ GIF、エージェントによる UI 検証ループ、ソーシャルメディア用クリップ、長時間録画のレビュー、クリックのたびにズーム、1 回の呼び出しで編集をすべて実行。

一般的な確認ループ — 録画、サンプリング、確認:

// 1. record a region for a few seconds
start_recording { "target": "region:0,0,1280,720", "quality": "draft" }
//    -> { "sessionId": "rec-…", "outputPath": "…/recordings/rec-….mp4" }

// 2. finalize the file
stop_recording { "sessionId": "rec-…" }
//    -> { "durationSec": 4.2, "finalizedGracefully": true }

// 3. look at it: the frames come back inline, so the model sees them directly
sample_frames { "input": "…/recordings/rec-….mp4", "timestamps": [0.5, 2, 3.5] }
//    -> { "frames": ["…/frames/…/frame_000_0.5s.png", …], "inlineImages": 3 }
//       + 3 image blocks the client shows to the model

どこを見ればよいかわからない場合は、sample_frames { "input": "…", "mode": "scenes" } を使うと、画面が実際に変化したフレーム(および冒頭のフレーム)のみが返され、frameTimes も含まれます。画面録画はほとんど静止しているため、通常は固定レートより大幅に効率的です。sceneThreshold(デフォルトは 0.1)で変化と見なす大きさを設定します。また、fps モードで dedupe: true を指定すると、ほぼ同一のフレームが除外されます。

静止画を 1 枚だけ取得する場合は screenshot { "target": "window:My App" } を使います。画像もインラインで返されます。

インライン画像は縮小された JPEG(maxImageWidth のデフォルトは 1280)で、呼び出しごとに上限があります(maxInlineImages のデフォルトは 8、最大 20)。フル解像度の PNG はディスクに保存されます。パスのみを取得するには、returnImage: false/returnImages: false を渡します。

sample_frames が 1 回の呼び出しで書き出すフレーム数は、最大 maxFrames 枚です(デフォルトは 100、最大 1000)。fps モードでは最初に動画を解析します。レートが上限を超える場合は、フレームが動画全体にわたるよう低いレートでサンプリングし、実行内容を結果の capNote で通知します。

プロンプトとリソース

ツールに加えて、サーバーはプロンプトも提供します。Claude Code や VS Code などのクライアントでは、すぐに使えるワークフローとしてスラッシュコマンドで表示されます。

プロンプト内容
bug-repro-clip録画し、バグが発生した箇所を見つけ、秘密情報がないか確認して、トリミングと注釈を行い、課題用の GIF を書き出します。
demo-gif機能の操作を録画し、README や PR に使えるサイズの GIF を書き出します。
verify-ui-change変更前にスクリーンショットを撮り、変更を加え、画面が落ち着くまで待ってから差分を確認し、テキストを検証します。
review-recordingタイムスタンプ付きで録画の内容を要約します。

また、ファイルシステムツールを使わずにクライアントが録画を一覧表示して添付できるよう、リソースも提供します:screencast://sessions(すべてのセッション)、screencast://sessions/{id}(個別のセッション)、screencast://sessions/{id}/poster(プレビュー用の JPEG フレーム)。録画の開始時または停止時には、クライアントに通知されます。

Windows に関する注意事項

  • マルチモニターのオフセット。 gdigrab には「モニター N をキャプチャする」セレクターがないため、モニターを指定すると仮想デスクトップ全体をキャプチャし、対象ディスプレイのピクセル境界(System.Windows.Forms.Screen.AllScreens から取得)に合わせてクロップします。monitor:1 は実際のオフセット位置にある 2 台目のディスプレイをキャプチャし、monitor:0 は常にメインディスプレイをキャプチャします。
  • ウィンドウキャプチャでは、ウィンドウ自体のサーフェスではなく、画面上でウィンドウが占める矩形を特定してキャプチャします。GPU または DirectComposition で合成されるウィンドウ(Chrome、Electron、UWP)では、gdigrab のネイティブな title= キャプチャは空のフレームを返すためです。タイトルで指定するか、タイトルに依存せず window:exe=Code.exe(そのアプリの最前面のウィンドウ)または window:hwnd=0x1A2B(特定のウィンドウ)で指定します。結果には一致したタイトルが報告されます。ウィンドウは表示され、最前面にあり、最小化されていない必要があります(最小化されたウィンドウは明確なエラーとともに拒否されます)。キャプチャには、その矩形に重ねて描画されたものも含まれます。また、start_recording では矩形は開始時に一度だけ固定されます。代わりにウィンドウ自体をキャプチャするには、backend: "wgc"(後述)を使用します。
  • Windows Graphics Capture(backend: "wgc"、FFmpeg 8 以降)。 他のウィンドウに覆われていても、ハンドルを使ってウィンドウの独自のサーフェスをキャプチャします。screenshot と find_text では約 0.2 秒ではなく 1~2 秒かかるため、オプトイン方式です。start_recording では、ウィンドウが覆われているとき、移動中、またはバックグラウンドにあるときも、ウィンドウのクライアント領域を記録します。gfxcapture はウィンドウが描画を更新したときだけフレームを出力するため、小さなレコーダープロセスが 200 ms ごとにウィンドウの 1 ピクセルを再描画し、最新のフレームを要求された fps で繰り返します。ffmpeg と同様に q で停止するため、stop_recording と maxDurationSec は同じように機能します。最初のフレームの取得には 1~2 秒かかり、start_recording はその取得後に応答します。現時点では wgc で音声を扱えません。
  • フルスクリーン専用アプリでは、gdigrab の使用時に黒いフレームが生成されることがよくあります。確実にキャプチャするには、ソースをボーダーレスウィンドウモードで実行してください。
  • システム音声にはループバックデバイスが必要です。 gdigrab は動画専用のため、audio.source = system を指定した start_recording は、別の dshow 入力からキャプチャします。Windows にはネイティブのループバック機能がないため、仮想オーディオデバイスが必要です(Stereo Mix を有効にするか、screen-capture-recorder の virtual-audio-capturer や VB-CABLE などのドライバーをインストールしてください)。list_audio_devices を実行すると、デバイスを確認できます。マイクのキャプチャには意図的に対応していません。

脅威モデル

警告

画面キャプチャでは、キャプチャ時に画面に表示されているあらゆるものが記録される可能性があります。パスワード、トークン、プライベートメッセージ、その他の秘密情報も含まれます。window: はウィンドウが占める画面上の矩形領域をキャプチャするため、その上に表示されたオーバーレイ、通知、別のウィンドウも記録されます。録画、スクリーンショット、サンプリングされたフレームは、デフォルトで機密情報として扱ってください。

  • キャプチャは常に明示的に実行されます。 自動で開始されることはなく、明示的なツール呼び出しがない限りキャプチャは実行されません。
  • 出力はローカルにとどまります。 ファイルはローカルファイルシステムにのみ書き込まれ、アップロード、ストリーミング、外部への送信は一切行われません。
  • リポジトリは公開、キャプチャは非公開です。 .gitignore によって、録画、フレーム、スクリーンショット、一般的な動画・画像の出力が除外されているため、テスト用メディアを誤ってコミットすることはありません。
  • 共有する前に確認してください。 ファイルを別のツールや人に渡す前に、サンプルフレームを確認するか録画を調べ、内容を把握してください。MCP Apps に対応したクライアントでは、stop_recording と review_recording によってインラインプレーヤーが開き、人が録画全体をスクラブして、マシンから何かが外部に出る前に墨消しボックスを描画できます。プレーヤーは MCP 接続を通じてフレームを取得し、ローカルのウェブサーバーは起動しません。
  • 墨消しの対象は指定した範囲のみです。 redact_region は、指定した矩形領域のみを対象とします。find_text を使うと、対象を見つけやすくなります。regex: "sk-|ghp_|api.?key" のようなクエリを指定して OCR を実行し、redact: true を設定すると、そのまま使用できる矩形領域が返されます。ただし、OCR はベストエフォートであり、小さな文字や装飾された文字を見逃す場合があるため、保証ではなく補助として扱ってください。塗りつぶしを不可逆にするにはデフォルトの box スタイルを使用し、共有前には必ず出力を確認してください。
  • 入力イベントログには入力した内容は記録されません。 start_recording の events: true は、その録画に限ってマウスとキーボードの入力をフックします。この処理は録画終了時(またはサーバー終了時)に終了するヘルパー内で行われます。キーはデフォルトで masked され、ログにはキーが押されたことだけが記録され、どのキーかは記録されません。keys: "shortcuts" を指定すると、Ctrl、Alt、Win と同時に押されたキーの組み合わせ(Ctrl+S)も記録されます。通常の文字入力、Shift と文字の組み合わせ、AltGr 文字は引き続きマスクされ、どのモードでもテキストは記録されません。カーソル位置やクリックからは、どこを指していたかが分かるため、.events.jsonl も隣接する録画ファイルと同様に慎重に扱ってください。
  • システム音声も機密情報です。 audio.source = system の場合、録画にはマシン上で再生されるすべての音声(通話音声、通知、メディア)が含まれます。音声を含む録画も、動画と同様に慎重に扱ってください。

プロジェクト構成

.
├── src/
│   ├── index.ts          # MCP server entry (stdio); registers every tool, reaps orphans
│   ├── prompts.ts        # MCP prompts (workflows as slash commands)
│   ├── resources.ts      # MCP resources (sessions, posters)
│   ├── wgcRecorder.ts    # recorder process for backend: "wgc"
│   ├── tools/            # one file per tool
│   ├── utils/            # pure builders and helpers (ffmpeg args, targets, sessions, ...)
│   └── __tests__/        # vitest: unit, ffmpeg integration, guarded local-capture harness
├── assets/               # bundled fonts and the review player (assets/ui)
├── docs/                 # GitHub Pages site (scripts/build-docs-pages.mjs writes the recipe pages)
├── scripts/              # Claude Desktop bundle (.mcpb) and docs page builders
├── mcp-tools.json        # canonical tool manifest (kept in sync with src/tools)
├── server.json           # MCP Registry listing (name matches package.json mcpName)
├── .github/workflows/    # CI, release, npm publish, Pages, ecosystem drift check
├── ROADMAP.md · CONTRIBUTING.md · SECURITY.md · LICENSE
└── package.json

開発

git clone https://github.com/TMHSDigital/screencast-mcp.git
cd screencast-mcp
npm install
npm run build      # tsc -> dist/
npm test           # vitest: unit tests, plus the ffmpeg integration suite when ffmpeg is on PATH
npm run dev        # tsx watch

クライアントからビルドを実行するには、dist/index.js を指定します。"command": "node"、"args": ["C:/path/to/screencast-mcp/dist/index.js"] と設定してください。

統合テストスイート(src/__tests__/integration)は、lavfi で生成したフィクスチャに対して ffmpeg を通じて実際の編集ビルダーと生成ビルダーを実行し、プローブした結果(時間、寸法、ストリーム、ラウドネス)を検証します。ffmpeg がない場合はスキップされます。ffmpeg がない場合に失敗させるには REQUIRE_FFMPEG=1 を設定してください。CI の Linux ジョブではこの設定が使用されています。

キャプチャ処理は CI のヘッドレス Linux ランナーでは実行できないため、エンドツーエンドのハーネスはフラグを介して実行するようになっており、デフォルトではスキップされます。

RUN_LOCAL_CAPTURE_TESTS=1 npm test   # Windows + ffmpeg + a real display

貢献

Issue とプルリクエストを歓迎します。CONTRIBUTING.md と行動規範をご覧ください。セキュリティに関する報告は SECURITY.md を通じてお寄せください。

ライセンス

CC-BY-NC-ND-4.0 ライセンスのもとで公開されています。非営利目的であれば、クレジット表記を行い、改変せずに自由に使用・共有できます。それ以外の用途については、Issue を作成してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。