kwin-mcp について
kwin-mcpは、KDE Plasma 6 Waylandデスクトップを自動化するMCPサーバーで、GUIテストやエージェントによるデスクトップ操作に使えます。隔離された仮想セッションと既存のKWinセッションへの接続に対応し、アクセシビリティツリーの確認やスクリーンショット取得も行えます。
主な機能
- 01隔離された仮想KWinセッション
- 02稼働中のKWinセッションへの接続
- 03マウス、キーボード、タッチ、クリップボード入力
- 04AT-SPI2アクセシビリティツリーの確認
- 05スクリーンショットとウィンドウ管理
活用シーン
- 01物理ディスプレイなしでエンドツーエンドGUIテストを実行
- 02AIエージェントでデスクトップアプリを自動操作
- 03ライブデスクトップセッションで共同作業
- 04キオスク画面や組み込みLinuxデスクトップをテスト
MCP 対応
セッション管理、GUI入力、アクセシビリティ確認、スクリーンショット、ウィンドウ管理を行う30のツールをMCPクライアントに公開します。隔離セッションでアプリを起動するか、既存のKWinセッションに接続できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
kwin-mcp
KDE Plasma 6 Wayland 上で Linux デスクトップ GUI を自動化するための Model Context Protocol サーバー
isac322/kwin-mcp の積極的にメンテナンスされているフォークです。このフォークには、ユーザーが待ち望んでいた修正が含まれています。MCP Python SDK 2.x への対応、仮想セッションでのテキスト入力(ホストのキーマップからの分離)、信頼性の高いウィンドウフォーカス、上限付き起動待機、入力が黙って破棄される問題の修正、正確なエラー契約などです。詳しくは変更履歴とリリースをご覧ください。インストール:
uv tool install git+https://github.com/VibeProgramm/kwin-mcp
Model Context Protocol(MCP) サーバーです。AI エージェント(Claude Code、Cursor、その他の MCP クライアント)が、ユーザーのデスクトップに影響を与えることなく、完全に分離された仮想 KWin セッション内であらゆる Wayland アプリケーションを起動、操作、監視できます。また、既存の KWin セッション(実際のデスクトップまたはコンテナー)に接続して、ライブデスクトップの自動化を行うこともできます。マウス、キーボード、タッチ、クリップボード、アクセシビリティツリーの検査、スクリーンショットの撮影、ウィンドウ管理を網羅する 30 個の MCP ツールを備えた kwin-mcp は、Linux でのエンドツーエンド GUI テストとデスクトップ自動化に必要なすべてを提供します。
目次
kwin-mcp を選ぶ理由
- 分離されたセッション -- 各セッションは、それぞれ独自の
dbus-run-session+kwin_wayland --virtualサンドボックスで実行されます。ホストのデスクトップには一切影響しません。 - ライブセッションに対応 -- 実際の KDE Plasma デスクトップ、またはコンテナー内の KWin インスタンス(例:
systemd-nspawn)に接続し、共同で「画面を共有」するワークフローを実現できます。 - 操作にスクリーンショットは不要 -- AT-SPI2 アクセシビリティツリーによって、AI エージェントに構造化されたウィジェットデータ(ロール、名前、座標、状態、利用可能なアクション)が提供されるため、視覚情報だけに頼らず UI 要素を操作できます。
- 認証プロンプトが不要 -- KWin のプライベートな EIS(Emulated Input Server)D-Bus インターフェースを直接使用し、XDG RemoteDesktop ポータルを迂回します。ユーザー確認ダイアログは表示されません。
- あらゆる Wayland アプリで動作 -- KDE Plasma 6 Wayland 上で動作するものであれば、Qt、GTK、Electron など、すべてに対応します。入力は標準の
libeiプロトコルを介して注入されます。 - 入力を包括的にカバー -- マウス、キーボード、マルチタッチ、クリップボードのすべてが分離されたセッション経由で注入され、デスクトップを完全に自動化できます。
ユースケース
GUI テストの自動化
ヘッドレスの分離セッション内で、KDE/Qt/GTK アプリケーションのエンドツーエンド GUI テストを実行できます。kwin-mcp は各アプリを専用の仮想 KWin コンポジターで起動し、マウス、キーボード、タッチ入力で操作した後、スクリーンショットとアクセシビリティツリーで結果を検証します。物理ディスプレイは不要です。
AI 駆動のデスクトップ自動化
Claude Code などの AI エージェントに、デスクトップアプリケーションを自律的に操作させることができます。エージェントはアクセシビリティツリーを読み取って UI を理解し、30 個の MCP ツールを使って操作を行い、スクリーンショットで結果を確認します。これにより、あらゆる Wayland アプリケーションで完全なフィードバックループを実現できます。
デスクトップでのライブコラボレーション
実際のデスクトップセッションに接続して、Claude が画面を確認し、操作できるようにします。session_connect を使用するか、--default-live-session を渡してライブモードをデフォルトに設定します。コンテナ内(例:systemd-nspawn)で実行中の KWin への接続にも対応しており、エージェント用のデスクトップを分離できます。
CI/CD でのヘッドレス GUI テスト
Linux デスクトップの GUI テストを CI/CD パイプラインに統合できます。kwin-mcp の仮想セッションには X11 や物理ディスプレイサーバーが不要なため、GitHub Actions や Linux 上の GitLab CI ランナーのようなヘッドレス環境に適しています。
キオスクと組み込みデバイスの自動化
KDE Plasma または KWin のみの Wayland コンポジターを実行するキオスクインターフェースや組み込み Linux デスクトップを自動化できます。session_start を使用してキオスク UI の分離された仮想テストを行うか、session_connect を使用してライブのキオスクまたは組み込みデバイスのセッションに直接接続し、リアルタイムの自動化や診断を行います。
クイックスタート
KDE Plasma 6 が Wayland 上で必要です。詳細はシステム要件をご覧ください。
1. インストール
# Using uv (recommended)
uv tool install git+https://github.com/VibeProgramm/kwin-mcp
# Or from a source checkout
git clone https://github.com/VibeProgramm/kwin-mcp.git
cd kwin-mcp
uv tool install .
2. Claude Code を設定
プロジェクトの .mcp.json に追加します:
{
"mcpServers": {
"kwin-mcp": {
"command": "uvx",
"args": ["kwin-mcp"]
}
}
}
3. 使用する
Claude Code に GUI アプリケーションの起動と操作を依頼します:
Start a KWin session, launch kcalc, and press the buttons to calculate 2 + 3.
Claude Code は自律的に分離されたセッションを開始し、アプリを起動して、アクセシビリティツリーを読み取ってボタンを見つけ、クリックし、結果を確認するためにスクリーンショットを撮影します。
設定
推奨:プラグインとしてインストール
kwin-mcp をエディターに最も手早く組み込む方法は、同梱のプラグインのいずれかをインストールすることです。各プラグインは MCP サーバーを自動登録し、エージェントにツールを呼び出すタイミング(セッションモードの選択、観察 → 操作 → 検証のループ、US-QWERTY と Unicode 入力の使い分け、AT-SPI2 の座標変換、その他のプラットフォーム固有の注意点)を教える kwin-desktop-automation スキルも含みます。
Claude Code — マーケットプレイスからプラグインをインストールします:
/plugin marketplace add VibeProgramm/kwin-mcp
/plugin install kwin-mcp@kwin-mcp
OpenCode — npm プラグインを opencode.json に追加します:
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["@isac322/kwin-mcp-opencode"]
}
統合ガイド全文(手動での代替設定、スキルのカスタマイズ、トラブルシューティング)については、docs/ai-agent-integration.mdをご覧ください。
Claude Code
プロジェクトの .mcp.json に追加します:
{
"mcpServers": {
"kwin-mcp": {
"command": "uvx",
"args": ["kwin-mcp"]
}
}
}
または、グローバルにインストールした場合:
{
"mcpServers": {
"kwin-mcp": {
"command": "kwin-mcp"
}
}
}
Claude Desktop
claude_desktop_config.json に追加します:
{
"mcpServers": {
"kwin-mcp": {
"command": "uvx",
"args": ["kwin-mcp"]
}
}
}
直接実行
# As an installed script
kwin-mcp
# As a Python module
python -m kwin_mcp
# Interactive CLI (REPL for rapid testing)
kwin-mcp-cli
# Live session mode (default to real desktop instead of virtual)
kwin-mcp --default-live-session
kwin-mcp-cli --default-live-session
利用可能なツール
セッション管理(3 ツール)
| ツール | パラメーター | 説明 |
|---|---|---|
session_start | app_command? str、screen_width? int(0 = 自動検出)、screen_height? int(0 = 自動検出)、enable_clipboard? bool(false)、keep_screenshots? bool(false)、isolate_home? bool(false)、keep_home? bool(false)、env? dict | 分離された KWin Wayland セッションを開始し、必要に応じてアプリを起動します。画面サイズを 0 にすると、論理デスクトップ(有効なすべての出力/接続されたモニター)の境界ボックスを自動検出します。enable_clipboard=true を設定すると、クリップボードツールが有効になります(wl-clipboard が必要です)。keep_screenshots=true を設定すると、session_stop の後もスクリーンショットファイルが保持されます。isolate_home=true を設定すると、XDG ディレクトリ(設定、データ、キャッシュ、状態)を分離した一時的な HOME が作成され、アプリがホストのユーザー設定を読み書きできないようにします。keep_home=true を設定すると、session_stop の後も分離されたホームディレクトリが保持されます。env を使って追加の環境変数を渡します。 |
session_connect | dbus_address? str、wayland_display? str、keep_screenshots? bool(false) | 既存の KWin セッション(実際のデスクトップまたはコンテナ)に接続します。デフォルトでは $DBUS_SESSION_BUS_ADDRESS と $WAYLAND_DISPLAY が使用されます。クリップボードは常に有効です。session_stop は KWin や既存のアプリを終了せず、接続を切断するだけです。 |
session_stop | (なし) | セッションを停止して後処理を行います。仮想セッションの場合:KWin とすべてのアプリを終了します。ライブセッションの場合:KWin や既存のアプリを終了せず、接続を切断します。 |
観察(3 ツール)
| ツール | パラメーター | 説明 |
|---|---|---|
screenshot | include_cursor? bool (false) | 仮想ディスプレイのスクリーンショットを撮影します(PNG として保存され、ファイルパスを返します) |
accessibility_tree | app_name? str, max_depth? int (15), role? str | ロール、名前、状態、画面座標を含む AT-SPI2 ウィジェットツリーを取得します(コンポジター側のウィンドウジオメトリを使い、ウィンドウ内座標から変換されます)。role を使って、特定の要素タイプ(例:"button"、"check box")に絞り込めます。一致しない要素は非表示になりますが、その子要素の走査は続行されます。 |
find_ui_elements | query str, app_name? str, states? list[str] | 名前、ロール、説明で UI 要素を検索します(大文字と小文字を区別しません)。mouse_click などで使用できる画面座標を返します。AT-SPI2 の状態(例:["focused"]、["active", "visible"])で絞り込むこともできます。状態のみで絞り込む場合、query は空でもかまいません。 |
マウス入力(6 ツール)
| ツール | パラメーター | 説明 |
|---|---|---|
mouse_click | x int, y int, button? str ("left"), double? bool, triple? bool, modifiers? list[str], hold_ms? int (0), screenshot_after_ms? list[int] | 座標をクリックします。左/右/中央ボタン、シングル/ダブル/トリプルクリック、修飾キー(例:["ctrl", "shift"])、hold_ms による長押しに対応しています。 |
mouse_move | x int, y int, screenshot_after_ms? list[int] | クリックせずにカーソルを座標へ移動(ホバー)します |
mouse_scroll | x int, y int, delta int, horizontal? bool, discrete? bool, steps? int (1) | 座標位置でスクロールします。delta が正の場合は下/右、負の場合は上/左にスクロールします。ホイールの刻みごとにスクロールするには discrete=true を使用し、滑らかなスクロールを分割するには steps を指定します。 |
mouse_drag | from_x int, from_y int, to_x int, to_y int, button? str ("left"), modifiers? list[str], waypoints? list[[x,y,dwell_ms]], screenshot_after_ms? list[int] | 滑らかな補間で、ある点から別の点へドラッグします。複雑なドラッグ経路には、カスタムの waypoints を指定できます。 |
mouse_button_down | x int, y int, button? str ("left") | ボタンを離さずに、座標位置でマウスボタンを押します。手動でドラッグを制御するには mouse_button_up と併用します。 |
mouse_button_up | x int, y int, button? str ("left") | 座標位置で、押されているマウスボタンを離します |
キーボード入力(5 ツール)
| ツール | パラメーター | 説明 |
|---|---|---|
keyboard_type | text str, screenshot_after_ms? list[int] | 文字列を1文字ずつ入力します(US QWERTY 配列) |
keyboard_type_unicode | text str, screenshot_after_ms? list[int] | wtype またはクリップボード(wl-copy + Ctrl+V)を使って、任意の Unicode テキスト(韓国語、CJK など)を入力します。wtype または wl-clipboard のインストールが必要です。 |
keyboard_key | key str, screenshot_after_ms? list[int] | キーまたはキーの組み合わせ(例:Return、ctrl+c、alt+F4、shift+Tab)を押します |
keyboard_key_down | key str | キーを離さずに押し続けます。複数の操作にわたって修飾キーを押したままにする場合(例:項目をクリックしながら Ctrl を押し続ける)に便利です。 |
keyboard_key_up | key str | 押したままになっているキーを離します |
タッチ入力(4 ツール)
| ツール | パラメーター | 説明 |
|---|---|---|
touch_tap | x int、y int、hold_ms? int (0)、screenshot_after_ms? list[int] | 座標をタップします。長押しのジェスチャーには hold_ms を使用します。 |
touch_swipe | from_x int、from_y int、to_x int、to_y int、duration_ms? int (300)、screenshot_after_ms? list[int] | 設定した時間で、ある地点から別の地点へスワイプします |
touch_pinch | center_x int、center_y int、start_distance int、end_distance int、duration_ms? int (500)、screenshot_after_ms? list[int] | 2 本指のピンチジェスチャーです。end_distance < start_distance はピンチイン、end_distance > start_distance はピンチアウトです。 |
touch_multi_swipe | from_x int、from_y int、to_x int、to_y int、fingers? int (3)、duration_ms? int (300)、screenshot_after_ms? list[int] | ワークスペースの切り替えなどのシステムジェスチャーに使う、複数指(2~5 本)のスワイプジェスチャーです |
クリップボード(2 ツール)
| ツール | パラメーター | 説明 |
|---|---|---|
clipboard_get | (none) | 現在のクリップボードのテキスト内容を読み取ります。session_start で enable_clipboard=true を設定し、wl-clipboard をインストールする必要があります。 |
clipboard_set | text str | クリップボードのテキスト内容を設定します。必要条件は clipboard_get と同じです。 |
ウィンドウ管理(3 ツール)
| ツール | パラメーター | 説明 |
|---|---|---|
launch_app | command str、env? dict | 実行中のセッション内でアプリケーションを起動します。PID とログパスを返します。 |
list_windows | (none) | AT-SPI2 を介して、アクセス可能なすべてのアプリケーションウィンドウを、ウィンドウごとのタイトルおよびアクティブ/フォーカス状態のマーカーとともに一覧表示します |
focus_window | app_name str | アプリケーション名(大文字と小文字を区別しない照合)でウィンドウにフォーカスします |
UI のポーリング(1 ツール)
| ツール | パラメーター | 説明 |
|---|---|---|
wait_for_element | query str、app_name? str、timeout_ms? int (5000)、poll_interval_ms? int (200)、expected_states? list[str] | クエリや状態に一致する要素が現れるか、タイムアウトするまでアクセシビリティツリーをポーリングします。状態の変化を待つには expected_states を使用します(例:["active"]、["checked"])。状態の変化のみを待つ場合、query は空にできます。 |
高度なツール(3 ツール)
| ツール | パラメーター | 説明 |
|---|---|---|
dbus_call | service str、path str、interface str、method str、args? list[str] | 分離されたセッション内で任意の D-Bus メソッドを呼び出します。KWin スクリプト、アプリ固有の D-Bus API、システムサービスの制御に便利です。 |
read_app_log | pid int、last_n_lines? int (50) | PID で指定した起動済みアプリの stdout/stderr 出力を読み取ります。すべての出力を取得するには last_n_lines=0 を設定します。 |
wayland_info | filter_protocol? str | セッションで利用可能な Wayland プロトコルを一覧表示します。プロトコルへのアクセス確認に便利です(例:plasma_window_management)。 |
フレームキャプチャ: 多くのアクションツールでは、任意の
screenshot_after_msパラメーター(例:[0, 50, 100, 200, 500])を指定できます。アクションの完了後、指定した遅延時間(ミリ秒)でスクリーンショットをキャプチャします。追加の MCP ラウンドトリップなしで、ホバー効果、クリックアニメーション、メニューの遷移など、一時的な UI の状態を観察するのに便利です。フレームキャプチャでは、高速な KWin ScreenShot2 D-Bus インターフェースを使用します(1 フレームあたり約 30~70 ms)。
仕組み
Claude Code / AI Agent
|
| MCP (stdio)
v
kwin-mcp server (30 tools) kwin-mcp-cli (interactive REPL)
| |
+--- both delegate to AutomationEngine (core.py) ---+
|
|-- session_start (virtual) ---> dbus-run-session
| |-- at-spi-bus-launcher
| +-- kwin_wayland --virtual
| +-- [your app]
|
|-- session_connect (live) ----> existing KWin (real desktop / container)
|
|-- screenshot ---------------> KWin ScreenShot2 D-Bus (spectacle fallback)
|
|-- accessibility_tree -------> AT-SPI2 (via PyGObject)
|-- find_ui_elements ---------> AT-SPI2 (via PyGObject)
|-- wait_for_element ----------> AT-SPI2 (polling)
|
|-- mouse_* ------------------> KWin EIS D-Bus --> libei
|-- keyboard_* ---------------> KWin EIS D-Bus --> libei
|-- touch_* ------------------> KWin EIS D-Bus --> libei
| +-- screenshot_after_ms -> KWin ScreenShot2 D-Bus (fast frame capture)
|
|-- keyboard_type_unicode ----> wtype / wl-copy + Ctrl+V
|-- clipboard_* --------------> wl-copy / wl-paste (wl-clipboard)
|
|-- launch_app / list_windows / focus_window
| |-- subprocess spawn
| +-- AT-SPI2 (via PyGObject)
|
|-- dbus_call -----------------> dbus-send (generic D-Bus)
|-- read_app_log --------------> log file read
+-- wayland_info --------------> wayland-info
トリプル分離(+オプションのホームディレクトリ分離)
kwin-mcp は、ホストのデスクトップから三層にわたって分離します。
- D-Bus の分離 --
dbus-run-sessionにより、プライベートなセッションバスが作成されます。分離されたセッションのサービス(KWin、AT-SPI2、ポータル)はホストから見えません。 - ディスプレイの分離 --
kwin_wayland --virtualにより、仮想フレームバッファーを備えた独自の Wayland コンポジターが作成されます。ホストのディスプレイにはウィンドウが表示されません。 - 入力の分離 -- 入力イベントは KWin の EIS インターフェースを通じて、分離されたコンポジターにのみ送信されます。ホストのデスクトップは kwin-mcp から入力を受け取りません。
- ホームディレクトリの分離(オプション) --
session_startでisolate_home=trueを設定すると、分離された XDG ディレクトリ(XDG_CONFIG_HOME、XDG_DATA_HOME、XDG_CACHE_HOME、XDG_STATE_HOME)を含む一時的な HOME ディレクトリが作成されます。セッション内のアプリはホストユーザーの設定(例:~/.config/kdeglobals)を読み取ったり変更したりできないため、テストの再現性と安全性が向上します。Wayland ソケットが配置されているため、XDG_RUNTIME_DIRは意図的に分離されません。
入力の送信
マウス、キーボード、タッチのイベントは、KWin のプライベートな org.kde.KWin.EIS.RemoteDesktop D-Bus インターフェースを通じて送信されます。このインターフェースは libei のファイルディスクリプターを返すため、ユーザー認証ダイアログが表示される XDG RemoteDesktop ポータルを必要とせずに、低レベルの入力エミュレーションを行えます。この接続では、以下を使用します。
- 座標ベースの正確な操作のための絶対ポインター位置指定
- キーボード入力のための、完全な US QWERTY マッピングを備えた evdev キーコード
- リアルなドラッグ操作のためのスムーズなドラッグ補間(10 段階以上の中間ステップ)
- マルチタッチジェスチャー(タップ、スワイプ、ピンチ、複数指のスワイプ)のための EIS タッチエミュレーション
スクリーンショットの取得
screenshot ツールは KWin の org.kde.KWin.ScreenShot2 D-Bus インターフェースを通じてスクリーンショットを取得します(1 フレームあたり約 30~70 ミリ秒)。フォールバックとして spectacle CLI を使用します。screenshot_after_ms パラメーターを指定したアクションツールでも、高速な連続取得のために同じ D-Bus インターフェースを使用します。未加工の ARGB ピクセルデータはパイプから読み取られ、Pillow を使用して PNG に変換されます。
アクセシビリティツリー
分離されたセッション内の AT-SPI2 アクセシビリティバスは、PyGObject(gi.repository.Atspi)を介してクエリされます。これにより、役割(ボタン、テキストフィールド、メニュー項目など)、名前、状態(フォーカス中、有効、表示中など)、画面上の座標、利用可能なアクション(クリック、切り替えなど)を含む、すべての UI ウィジェットの構造化ツリーが提供されます。
システム要件
| 要件 | 詳細 |
|---|---|
| OS | KDE Plasma 6(Wayland セッション)を搭載した Linux |
| Python | 3.12 以降 |
| KWin | --virtual フラグをサポートする kwin_wayland(KDE Plasma 6.x) |
| libei | 通常は KWin 6.x にバンドルされています(EIS 入力エミュレーション) |
| spectacle | KDE スクリーンショットツール(CLI モード) |
| AT-SPI2 | アクセシビリティツリーのサポートに必要な at-spi2-core |
| PyGObject | GObject イントロスペクション用の Python バインディング |
| D-Bus | dbus-python バインディング |
オプションの依存関係:
| パッケージ | 必要な機能 |
|---|---|
wl-clipboard(wl-copy、wl-paste) | clipboard_get、clipboard_set、およびクリップボードをフォールバックとして使用する keyboard_type_unicode |
wtype | keyboard_type_unicode(クリップボードのフォールバックより優先) |
wayland-utils(wayland-info) | wayland_info ツール |
システム依存関係のインストール
Arch Linux / Manjaro
sudo pacman -S kwin spectacle at-spi2-core python-gobject dbus-python-common
# Optional: for clipboard and Unicode input
sudo pacman -S wl-clipboard wtype wayland-utils
Fedora(KDE Spin)
sudo dnf install kwin-wayland spectacle at-spi2-core python3-gobject dbus-python
# Optional: for clipboard and Unicode input
sudo dnf install wl-clipboard wtype wayland-utils
openSUSE(KDE)
sudo zypper install kwin6 spectacle at-spi2-core python3-gobject python3-dbus-python
# Optional: for clipboard and Unicode input
sudo zypper install wl-clipboard wtype wayland-utils
Kubuntu / KDE Neon
sudo apt install kwin-wayland spectacle at-spi2-core python3-gi gir1.2-atspi-2.0 python3-dbus
# Optional: for clipboard and Unicode input
sudo apt install wl-clipboard wtype wayland-utils
Note:PyPI の
kwin-mcpという名前は、上流プロジェクト(isac322/kwin-mcp、v0.7.0、MCP SDK 1.x)を参照しています。このリポジトリは積極的にメンテナンスされているフォーク(v0.9.0、MCP SDK 2.x)です。git またはソースのチェックアウトからインストールしてください。設定セクションにあるuvx kwin-mcpの設定例は、PyPI パッケージを参照します。
uv を使用する(推奨)
uv tool install git+https://github.com/VibeProgramm/kwin-mcp
pip を使用する
pip install git+https://github.com/VibeProgramm/kwin-mcp
ソースからインストールする
git clone https://github.com/VibeProgramm/kwin-mcp.git
cd kwin-mcp
uv sync
uv run kwin-mcp
制限事項
- US QWERTY キーボードレイアウトのみ --
keyboard_typeがサポートするのは US QWERTY のみです。ASCII 以外のテキスト(韓国語、CJK など)には、wtypeまたはwl-clipboardのインストールが必要なkeyboard_type_unicodeを使用してください。 - KDE Plasma 6 以降が必要 -- 古い KDE バージョンや、その他の Wayland コンポジター(GNOME、Sway)はサポートされていません。
- AT-SPI2 の利用可否は異なります -- アプリケーションによっては、AT-SPI2 経由でウィジェットツリーを完全に公開しない場合があります。
- タッチ入力は EIS でエミュレートされます -- タッチイベントは実際のタッチスクリーンデバイスからではなく、KWin の EIS インターフェースを通じてエミュレートされます。ほとんどのアプリケーションはエミュレートされたタッチを正しく処理しますが、物理的なタッチとは異なる動作をする場合があります。
- クリップボードの使用にはオプトインが必要です --
wl-copyが隔離されたセッションでハングする可能性があるため、クリップボードツール(clipboard_get、clipboard_set)はデフォルトで無効になっています。session_startでenable_clipboard=trueを設定して有効にし、wl-clipboardがインストールされていることを確認してください。 - QMenu(ネイティブのコンテキストメニュー)は AT-SPI2 に表示されない場合があります -- Qt の AT-SPI2 ブリッジは、Wayland 上のポップアップメニューのサポートが不完全です。コンテキストメニューが
accessibility_treeやfind_ui_elementsに表示されない場合があります。回避策:screenshotを使用してメニュー項目の位置を視覚的に確認し、座標を指定してクリックしてください。 - 画面端のトリガーは EIS 入力では動作しません -- 自動非表示パネルや layer-shell のトリガーストリップは Wayland サーフェスの入力ルーティングに依存しており、EIS から注入されたポインターイベントに反応しない場合があります。回避策:代わりに KWin スクリプティングまたはキーボードショートカットで
dbus_callを使用してください。 - AT-SPI2 の座標変換はベストエフォートです -- Wayland クライアントが報告するのはウィンドウ内の座標です(設計上、グローバルな画面上の位置は把握できません)。kwin-mcp は、各ウィンドウのコンポジター側のジオメトリ(KWin スクリプティングで取得し、キャプションで照合)を使用して、これらを実際の画面座標に変換します。ウィンドウを照合できない場合、座標はウィンドウ内の座標にフォールバックします。
screenshotと照合して判別してください。
トラブルシューティングとデバッグ
詳細な libei/EIS 診断(KWIN_MCP_DEBUG_EI=1)
環境変数 KWIN_MCP_DEBUG_EI=1 を設定すると、EIS 入力注入経路(kwin-mcp から KWin への直接の libei 接続)の詳細な診断を有効にできます。
KWIN_MCP_DEBUG_EI=1 uv run kwin-mcp
有効にすると、kwin_mcp.input ロガーのレベルが DEBUG に引き上げられ、stderr ハンドラーが設定されます。また、EIS デバイスのライフサイクルイベント(ADDED / REMOVED / RESUMED / PAUSED / SEAT_REMOVED)、デバイスの停止、接続の再構築がログに記録されます。入力注入が何も起こさないまま失敗したり、不安定に動作したりする場合に使用してください。ログから、KWin が入力バーストの前後に EIS デバイスを一時停止または削除しているか、また kwin-mcp が接続を再構築できているかを確認できます。
KWIN_MCP_DEBUG_EI=1 uv run kwin-mcp 2>eis-debug.log
その他の症状
session_startの出力に No input backend available と表示される — KWin が EIS RemoteDesktop インターフェースを公開していません。セッションはスクリーンショットと AT-SPI2 のみのセッション(入力注入なし)に切り替わります。KWin のバージョン(Plasma 6 が必要)と、切り替え理由が記載されたサーバーログを確認してください。- 仮想セッションで
keyboard_type_unicodeが失敗する —kwin_wayland --virtualはwtypeが必要とする virtual-keyboard プロトコルを公開しません。その環境ではクリップボードのフォールバック(wl-clipboardが必要)が主な経路です。
コントリビューション
コントリビューションを歓迎します!開発環境のセットアップ、コードスタイルのガイドライン、プルリクエストの手順については、CONTRIBUTING.md を参照してください。
git clone https://github.com/VibeProgramm/kwin-mcp.git
cd kwin-mcp
uv sync
uv run ruff check src/
uv run ruff format --check src/
uv run ty check src/
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。