desktop-mcp
desktop-mcp
Linux(Waylandを含む)上のLLM向けデスクトップビジョン&コントロール — モデルが 画面全体のスクリーンショットを取得し、表示されているものに対してクリック、タイプ、スクロールを 実行します。stdio上のプレーンなMCPなので、Claude Code、Claude Desktop、Cursor、 その他のMCPクライアントで動作します。
最初にお読みください:これは不要かもしれません
Anthropicはコンピューター操作をネイティブに提供しており、それが機能する環境では そちらを使うべきです — 統合度が高く、実際にメンテナンスされています:
macOSおよびWindows:Claude Desktopにはコンピューター操作が組み込まれており、Coworkおよび Claude Codeで利用できます。実際のデスクトップを操作します。 (ドキュメント)
独自エージェントの構築:Claude APIにはファーストパーティの
computerツールがあります (GA版はcomputer_toolset_20260801ツールセット)。 (ドキュメント)
このツールが埋めるギャップはLinuxです。 2026年8月現在、コンピューター操作は Linuxデスクトップアプリでは利用できず、Waylandでのデスクトップ自動化は X11ではなかった形で困難を極めます:
COSMICのコンポジタは
wlr-screencopyを実装していないため、grimは失敗し、 スクリーンショットツールはすべてコンポジタごとの個別対応が必要になります。カーソル位置を問い合わせるプロトコルも、他のクライアントのウィンドウを列挙するプロトコルも 存在しません。
入力はコンポジタの下層、
/dev/uinput経由で行う必要があります。なぜなら、 一般的にパッケージされているydotoolは相対ポインタしか公開しておらず、 長距離のジャンプがポインタ加速によって変形してしまうからです。
macOSやWindowsをお使いなら、このリポジトリはほぼ不要です。Linux、 特にWaylandをお使いなら、これが有効な選択肢です。
Related MCP server: mcp-linux-desktop
ステータス
クロスプラットフォーム対応として書かれていますが、実際に検証されているのは 1つの構成のみです。それ以外はコードパス上の実装であり、実証済みではありません — そのつもりで 扱ってください。
プラットフォーム | スクリーンショット | 入力 | テスト |
Linux / Wayland |
|
| あり — COSMICのみ |
Linux / X11 |
|
| なし |
macOS |
|
| なし |
Windows |
|
| なし |
テスト内容と方法
エンドツーエンドで検証済み:
Pop!_OS 24.04 LTS、カーネル7.0.11、COSMIC(
cosmic-comp1.0.0)、 Wayland、シングル2560x1440ディスプレイ、Python 3.13。
結果:
チェック | 方法 | 結果 |
スクリーンショット |
| 2560x1440を取得、1400x788に縮小 |
ポインタ精度 | XWayland経由で5つのターゲットポイントを読み戻し | 5/5正確、誤差0px |
ボタンとスクロール |
| ボタン1、3、4で |
ドラッグ |
| 押下と解放の間に |
タイピング |
| テキストがフォーカス中のエディタに着地 |
キーコンビネーション | エディタで | 適用されました |
MCP経由のクリック | ネイティブWaylandアプリに対する完全なstdioラウンドトリップ | 新しいタブが開きました |
未検証で知っておくべきこと:マルチモニタレイアウト、HiDPIスケーリング、非US
キーボードレイアウト(生のキーコードパスの場合 — wtypeはこれらを正しく処理しますが、
uinputキーコードはUS配列を前提としています)、およびCOSMIC以外のすべてのコンポジタ。
他のプラットフォームからの報告は歓迎します — desktop_infoはバックエンドの問題を
診断するために必要な情報をすべて出力します。
インストール
git clone <this repo> && cd desktop-mcp
uv venv && uv pip install -e .macOS、Windows、Linux/X11でも入力依存関係が必要です:
uv pip install -e ".[gui]"Linux:1回限りの権限設定
Waylandで入力を注入するには/dev/uinputへの書き込みが必要ですが、これはデフォルトでは
root所有です:
bash scripts/setup-linux.sh # needs sudo once
# then log out and back inmacOS:1回限りの権限設定
サーバーを起動するアプリ(ターミナル、iTerm、Claude Desktop)に対して、 システム設定 → プライバシーとセキュリティで画面収録とアクセシビリティを 許可してください。
配線
Claude Code:
claude mcp add desktop -- /absolute/path/to/desktop-mcp/.venv/bin/python -m desktop_mcp.serverClaude Desktop(claude_desktop_config.json)とCursor
(.cursor/mcp.json)も同じ形式です:
{
"mcpServers": {
"desktop": {
"command": "/absolute/path/to/desktop-mcp/.venv/bin/python",
"args": ["-m", "desktop_mcp.server"]
}
}
}ツール
ツール | 目的 |
| デスクトップをキャプチャ |
| 左/中/右クリック、シングルまたはダブル |
| クリックせずにポインタを移動(ホバー) |
| 押下、移動、解放 — 選択、スライダー、ウィンドウ移動用 |
| 特定のポイントでホイールスクロール |
| フォーカス中の要素に入力 |
|
|
| ポインタの現在位置 |
| 開いているウィンドウ(OSが許可する場合) |
| 一時停止してから再確認 |
| 環境、アクティブなバックエンド、安全設定 |
座標
スクリーンショットは送信前に縮小されます(デフォルトでは長辺1400px)。そのため モデルは画像ピクセル単位で作業し、サーバーが毎回の呼び出しでそれらを画面ピクセルに マッピングします。スクリーンショットから読み取った座標をそのまま渡してください。
これは自作のコンピューター操作ツールのほとんどが間違える詳細です。これを間違えると、 すべてのクリックが意図した場所から一定の割合でずれた位置に着地します。
Linuxでydotoolではなく/dev/uinputを使う理由
一般的にパッケージされているydotoolビルドは相対ポインタしか公開していないため、
(1280, 720)へのジャンプは1回の大きな相対移動として配信され、コンポジタが
ポインタ加速を適用します。その結果、カーソルはターゲットの近くには着地しますが、
距離が大きいほど誤差も大きくなります。絶対座標のuinputデバイスは加速を回避します:
2560x1440画面で測定した結果、5/5正確でした。ydotoolは/dev/uinputに
書き込めない場合のフォールバックとして残されています。
クリックのタイミング
コンポジタはポインタ移動を非同期でディスパッチするため、ツールキットは カーソルをウィジェット上に置いた移動イベントを処理する前にボタン押下が届くと、 それを無視します。COSMICで測定した結果:移動と押下の間隔が30msだと、ボタンは ハイライトされるだけでアクティベートされません — ホバー状態は座標が正しいことの 証明ですが、この失敗はターゲティングバグと誤読されがちです。250msあればアクティベートされます。 また、押下は約90ms保持しないと、単なるイベントとして扱われず実際のクリックとして 認識されません。
両方の遅延は調整可能ですが、デスクトップが許容する場合にのみ下げてください。
安全性
これによりモデルは、その場に座っている人間と同じ範囲でマシンを操作できるようになります。 画面上のあらゆるもの — 開いているパスワードマネージャー、プライベートメッセージ、 トークン — を読み取ることができ、破壊的なボタンも含めて何でもクリックできます。 セッションは、誰かにキーボードを預けたのと同じように扱ってください。
環境変数:
変数 | デフォルト | 効果 |
| オフ | スクリーンショットは許可、すべての入力を拒否 |
|
| 1分あたりの最大入力アクション数 |
| — | 拒否する追加のカンマ区切りキーコンビネーション |
| — | すべてのアクションをこのファイルに追記 |
|
| スクリーンショットの長辺のピクセル数 |
|
| ポインタ移動から押下までの秒数 |
|
| マウスボタンを押下したままにする秒数 |
ctrl+alt+F1〜F12は常にブロックされます。VT切り替えによってグラフィカル
セッションが足元から消える可能性があります。
読み取り専用のレビューア用セットアップ:
DESKTOP_MCP_READ_ONLY=1 python -m desktop_mcp.server検証
.venv/bin/python scripts/mcp_smoke.py # real stdio MCP round tripMaintenance
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceControls a real Linux desktop from any MCP host. Reads accessibility trees, takes screenshots, and drives clicks, scrolls, and keystrokes across GNOME, KDE/KWin, Hyprland, i3, and COSMIC.671395MIT
- AlicenseNot gradedqualityCmaintenanceEnables full Linux desktop control including windows, mouse, keyboard, clipboard, audio, screenshots, OCR, accessibility, and system management through MCP-compatible AI agents.1MIT
- FlicenseNot gradedqualityBmaintenanceAn MCP server that gives a model eyes and hands on a Linux Wayland desktop, enabling screenshot capture, mouse/keyboard control, OCR, and icon detection via OmniParser.1
- AlicenseAqualityDmaintenanceEnables LLM agents to capture screenshots, control mouse/keyboard, and manage windows on desktop platforms, primarily Windows, via an MCP server.161MIT
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP connector that lets ChatGPT list, search, and run your Apple Shortcuts via a local Mac agent
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Zetakai/desktop-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server