can-see について
can-see は、AI エージェントが仮想ターミナルで CLI アプリを起動し、PNG スクリーンショットで確認できる MCP サーバーです。入力や出力の読み取り、プロセス状態の確認にも対応し、TUI や対話型 CLI のデバッグに使えます。
主な機能
- 01仮想ターミナルで CLI アプリを起動
- 02全体または範囲指定の PNG 撮影
- 03キー入力とテキスト送信
- 04ターミナルとスクロールバックの読み取り
- 05テキスト、色、プロセス状態の待機
- 06ターミナル画面を GIF で記録
活用シーン
- 01TUI のレイアウトと色の確認
- 02対話型 CLI ウィザードの操作
- 03ターミナル状態の変化の比較
MCP 対応
can-see は stdio で MCP サーバーとして動作し、ターミナルの起動、撮影、入力、読み取り、セッション管理のツールを MCP クライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y can-seeDEFAULT_COLSTerminal width in columns (default: 120)DEFAULT_ROWSTerminal height in rows (default: 30)IDLE_TIMEOUT_MSAuto-close idle sessions after this many milliseconds (default: 300000)ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
can-see
仮想ターミナルと PNG スクリーンショットを通じて、AI エージェントがターミナル/CLI アプリケーションを見て、操作できる MCP サーバーです。
Claude Code および MCP 互換のあらゆるエージェント向けに構築されています。
その理由
説明するより、見せるほうが簡単なこともあります。TUI アプリや対話型 CLI ウィザード、あるいは視覚的なターミナル出力を伴うものをデバッグする際、can-see を使えば、色、レイアウト、カーソル位置など、実際に見えている状態をエージェントがそのまま確認できます。
仕組み
- 起動:仮想ターミナルで CLI アプリを起動します(node-pty + @xterm/headless)
- スクリーンショット:ターミナルを PNG 画像として撮影します(node-canvas でレンダリング)
- キー/テキストを送信:アプリを操作します
- 再度スクリーンショットを撮影:結果を確認します
- セッションを終了:操作が終わったらセッションを終了します
インストール
npm install -g can-see
前提条件
can-see は node-canvas(Cairo)と node-pty に依存しており、ネイティブコンパイルが必要です。ほとんどのシステムでは、以下が必要です。
- Windows: Visual Studio Build Tools(C++ ワークロード) —
npm install --global windows-build-toolsを実行するか、Visual Studio Installer からインストールします - macOS: Xcode Command Line Tools —
xcode-select --install - Linux:
sudo apt install build-essential libcairo2-dev libjpeg-dev libpango1.0-dev libgif-dev librsvg2-dev
設定
Claude Code
プロジェクトの .mcp.json に追加します。
{
"mcpServers": {
"can-see": {
"command": "npx",
"args": ["-y", "can-see"]
}
}
}
グローバルにインストールしている場合は、次のようにします。
{
"mcpServers": {
"can-see": {
"command": "can-see"
}
}
}
その他の MCP クライアント
can-see は stdio トランスポートを使用します。MCP クライアントから can-see バイナリまたは npx -y can-see を指定してください。
ツール
| ツール | 説明 |
|---|---|
launch | 仮想端末で CLI アプリを起動します。sessionId を返します。環境変数を設定するための任意の env を受け付けます。 |
screenshot | 端末を PNG 画像としてキャプチャします。 |
screenshot_region | 端末の特定の矩形領域をキャプチャします。 |
screenshot_text_region | ビューポート内のテキストを検索し、その周辺領域を PNG としてキャプチャします。 |
capture_baseline | 後で差分比較できるよう、端末の状態をスナップショットします。 |
diff_screenshot | 現在の状態をベースラインと比較し、変更箇所を強調表示します。 |
get_cell_info | 指定したセルの文字、色、属性を取得します。出力を減らす compact モードに対応しています。 |
read_text | 端末バッファーをプレーンテキストとして読み取ります。 |
read_scrollback | 表示中のビューポートより上にスクロールしたテキストを読み取ります。 |
wait_for_text | 端末バッファーに特定のテキストが表示されるまで待機します。 |
wait_for_idle | 指定した時間、端末出力が安定するまで待機します。タイマーやスピナーがあるアプリ向けのコンテンツ比較モード用の stableMs、無視する行を指定する excludeRows、動的な行を除外するための excludePattern(正規表現)に対応しています。 |
wait_for_color | 指定した位置に特定の色が表示されるまで待機します。 |
wait_for_exit | プロセスが終了するまで待機し、終了コードとシグナルを返します。 |
start_recording | アニメーション GIF 用のフレームのキャプチャを開始します。 |
stop_recording | 録画を停止し、メタデータ(frameCount、durationMs)とともにアニメーション GIF を返します。GIF がインラインサイズの上限を超える場合、フレームを自動的にトリミングするか、ファイルに保存します。 |
send_keys | キー入力を送信します(例:Enter、Ctrl+C、['Down', 'Down', 'Enter'])。 |
send_text | アプリにテキスト文字列を入力します。 |
get_process_status | プロセスの状態を取得し、「アプリがアイドル状態」と「アプリが終了した」を区別します。PID、実行状態、終了コードを返します。 |
list_sessions | アクティブな端末セッションをすべて一覧表示します。 |
close | アプリを終了し、後処理を行います。完了したら必ず閉じてください。 |
close_all | アクティブなセッションをすべて一度に終了します。テスト実行の合間のクリーンアップに便利です。 |
対応キー
Enter、Tab、Escape、Backspace、Space、Up、Down、Left、Right、Home、End、Delete、PageUp、PageDown、Ctrl+A から Ctrl+Z。
環境変数
| 変数 | デフォルト | 説明 |
|---|---|---|
DEFAULT_COLS | 120 | 端末の幅(列数) |
DEFAULT_ROWS | 30 | 端末の高さ(行数) |
IDLE_TIMEOUT_MS | 300000 | アイドル状態のセッションをこのミリ秒数(5 分)後に自動終了します |
使用例
MCP に接続されたエージェントから:
Agent: I'll launch your app to see what's happening.
→ launch("node", ["app.js"]) → sessionId: "abc-123"
Agent: Let me wait for the app to start.
→ wait_for_text("abc-123", "Ready") → Found "Ready" after 1200ms
Agent: Let me read the current output.
→ read_text("abc-123") → "Welcome to MyApp\nReady\n> "
Agent: I can see the prompt. Let me select option 2.
→ send_keys("abc-123", ["Down", "Enter"])
Agent: Waiting for the screen to settle.
→ wait_for_idle("abc-123") → Terminal idle for 520ms
Agent: Let me check the result.
→ screenshot("abc-123") → [PNG image showing result]
Agent: Done, closing the session.
→ close("abc-123")
変更履歴
0.5.0
新しいツール:
wait_for_exit— プロセスの終了を待機し、終了コードとシグナルを取得しますclose_all— アクティブなセッションをすべて一度に終了しますget_process_status— 「アプリがアイドル状態」と「アプリが終了した」を区別しますscreenshot_text_region— ビューポート内のテキストを検索し、周辺領域を PNG としてキャプチャします
機能強化:
launchがカスタム環境変数を指定するenvパラメーターを受け付けるようになりましたwait_for_idleがstableMsモードで動的な行を除外するexcludePattern(正規表現)に対応しましたstop_recordingが GIF とともにframeCountおよびdurationMsメタデータを返すようになりましたget_cell_infoが出力を減らすcompactオプションに対応しました({char, fg, bold}のみ)
バグ修正:
- プロセスが同時に終了した際、最終バッファーに存在するテキストや色を見逃す
wait_for_textとwait_for_colorの競合状態を修正しました wait_for_idleにstableMsとidleMsの両方が渡された場合の相互排他性検証を追加しました
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。