@harusame64/desktop-touch-mcp 0.15.7 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.ja.md +612 -516
- package/README.md +723 -685
- package/bin/launcher.js +83 -7
- package/package.json +79 -78
package/README.ja.md
CHANGED
|
@@ -1,525 +1,621 @@
|
|
|
1
|
-
# desktop-touch-mcp
|
|
2
|
-
|
|
3
|
-
[](https://glama.ai/mcp/servers/Harusame64/desktop-touch-mcp)
|
|
4
|
-
|
|
5
|
-
[English](README.md)
|
|
6
|
-
|
|
7
|
-
>
|
|
8
|
-
|
|
9
|
-
Claude
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
> *v0.15: Rust ネイティブエンジンにより**平均 82 倍高速化** — UIA フォーカス取得 2ms、SSE2 SIMD 画像差分 13〜15 倍速。設定不要:エンジンは自動ロード、不在時は PowerShell に透過フォールバック。*
|
|
1
|
+
# desktop-touch-mcp
|
|
2
|
+
|
|
3
|
+
[](https://glama.ai/mcp/servers/Harusame64/desktop-touch-mcp)
|
|
4
|
+
|
|
5
|
+
[English](README.md)
|
|
6
|
+
|
|
7
|
+
> **「座標ルーレット」はもう不要。セマンティック・ワールドグラフと自動認識ガードによる、LLMネイティブなWindows自動化。**
|
|
8
|
+
|
|
9
|
+
ClaudeがWindowsを直接「見て」「操作する」ためのMCPサーバー。単なるピクセル指定の座標当てゲームを卒業し、**セマンティック・ワールドグラフ** (`desktop_discover`) による確実なエンティティ特定と、**自動認識(Auto-Perception)ガード**による安全な実行を実現します。28個の最適化されたツール群が、バックグラウンド入力、UIA、Chrome CDP、ターミナル、そしてトークン効率に優れたP-frame差分転送をサポートします。
|
|
10
|
+
|
|
11
|
+
> *v0.15: Rust ネイティブエンジンにより**平均 82 倍高速化** — UIA フォーカス取得 2ms、SSE2 SIMD 画像差分 13〜15 倍速。設定不要:エンジンは自動ロード、不在時は PowerShell に透過フォールバック。*
|
|
13
12
|
> *v0.15.5: **固定リリース検証** — npm ランチャーは対応する GitHub Release tag だけを取得し、Windows runtime zip を検証してから展開します。*
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## 特徴
|
|
18
|
-
|
|
19
|
-
- **⚡ 高性能 Rust ネイティブコア** — UIA ブリッジと画像差分エンジンを Rust (`napi-rs` + `windows-rs`) で実装し、ネイティブ `.node` アドオンとしてロード。専用 MTA スレッドからの直接 COM 呼び出しにより PowerShell プロセス起動を排除 — `getFocusedElement` は **2ms**(160 倍高速)、`getUiElements` はバッチ型 BFS アルゴリズムでクロスプロセス RPC を最小化し **約 100ms** で完了。画像差分は **SSE2 SIMD** で 13〜15 倍のスループット。ネイティブエンジンが利用不可の場合、全関数が PowerShell に透過フォールバック — 設定不要。
|
|
20
|
-
- **🎯 Set-of-Marks (SoM) ビジュアルフォールバック** — ゲーム・RDP・非対応 Electron アプリで UIA が完全に機能しない場合でも、`screenshot(detail="text")` が Hybrid Non-CDP パイプラインを自動起動。Rust 画像前処理 → Windows OCR → クラスタリング → 赤い枠線 + 番号バッジ(`[1]`、`[2]`…)付き PNG 画像を生成し、`clickAt` 座標付きの要素リストを返します。CDP 不要。
|
|
21
|
-
- **LLM ネイティブ設計** — 人間の操作を模倣するのではなく、「LLM がいかにコンテキストを消費せず高速に動けるか」を前提に設計。`run_macro` による複数操作の一括実行(API 往復の削減)と、**MPEG P-frame 方式のレイヤー差分** (`diffMode`) を組み合わせることで、無駄な画像転送や推論ループを極限まで削ぎ落とす。
|
|
22
|
-
- **Reactive Perception Graph** — ウィンドウやブラウザタブに `lensId` を登録し、以後の action tool に渡すだけで、操作前の安全 guard と操作後の `post.perception` フィードバックを受け取れます。`screenshot` / `
|
|
23
|
-
- **日本語/CJK 完全対応** — ウィンドウタイトル取得に Win32 `GetWindowTextW` を使用。nut-js の文字化けを回避。IME バイパス入力にも対応。
|
|
24
|
-
- **3 段階トークン削減** — `detail="image"`(~443 tok)/ `detail="text"`(~100-300 tok)/ `diffMode=true`(~160 tok)を用途に応じて使い分け。視覚確認が必要な時だけ画像を送る。
|
|
25
|
-
- **座標変換不要の 1:1 モード** — `dotByDot=true` で WebP 1:1 キャプチャ。画像上のピクセル座標 = 画面座標なのでスケール計算が不要。
|
|
26
|
-
- **ブラウザキャプチャのデータ削減** — `grayscale=true`、`dotByDotMaxDimension=1280`、`windowTitle + region` の部分切り出しで、ブラウザ chrome や不要な余白を除外。重いキャプチャで 50〜70% 程度の削減を狙えます。
|
|
27
|
-
- **UIA アクション要素抽出** — `detail="text"` でボタン・入力欄の名前と `clickAt` 座標を JSON で返すため、画像を見なくても操作できる。
|
|
28
|
-
- **Chromium スマートフォールバック** — Chrome/Edge/Brave に対して `detail="text"` を使うと、低速な UIA を自動スキップし Windows OCR を実行。`hints.chromiumGuard` + `hints.ocrFallbackFired` で経路を判別可能。
|
|
29
|
-
- **CLI 自動ドック** — `
|
|
30
|
-
- **緊急停止 (Failsafe)** — マウスを**画面左上コーナー (0,0 付近 10px)** に移動すると MCP サーバーが即座に終了。
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## 前提環境
|
|
35
|
-
|
|
36
|
-
| 項目 | 要件 |
|
|
37
|
-
|---|---|
|
|
38
|
-
| OS | Windows 10 / 11 (64-bit) |
|
|
39
|
-
| Node.js | v20 以上推奨 (v22+ で動作確認済み) |
|
|
40
|
-
| PowerShell | 5.1 以上 (Windows 標準同梱) — Rust ネイティブエンジン不在時のフォールバック用 |
|
|
41
|
-
| Claude CLI | `claude` コマンドが使えること |
|
|
42
|
-
|
|
43
|
-
> **注意:** nut-js のネイティブバインディングは Visual C++ 再頒布可能パッケージを必要とします。
|
|
44
|
-
> インストール済みでない場合は [Microsoft公式](https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist) からダウンロードしてください。
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## インストール
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
npx -y @harusame64/desktop-touch-mcp
|
|
52
|
-
```
|
|
53
|
-
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 特徴
|
|
17
|
+
|
|
18
|
+
- **⚡ 高性能 Rust ネイティブコア** — UIA ブリッジと画像差分エンジンを Rust (`napi-rs` + `windows-rs`) で実装し、ネイティブ `.node` アドオンとしてロード。専用 MTA スレッドからの直接 COM 呼び出しにより PowerShell プロセス起動を排除 — `getFocusedElement` は **2ms**(160 倍高速)、`getUiElements` はバッチ型 BFS アルゴリズムでクロスプロセス RPC を最小化し **約 100ms** で完了。画像差分は **SSE2 SIMD** で 13〜15 倍のスループット。ネイティブエンジンが利用不可の場合、全関数が PowerShell に透過フォールバック — 設定不要。
|
|
19
|
+
- **🎯 Set-of-Marks (SoM) ビジュアルフォールバック** — ゲーム・RDP・非対応 Electron アプリで UIA が完全に機能しない場合でも、`screenshot(detail="text")` が Hybrid Non-CDP パイプラインを自動起動。Rust 画像前処理 → Windows OCR → クラスタリング → 赤い枠線 + 番号バッジ(`[1]`、`[2]`…)付き PNG 画像を生成し、`clickAt` 座標付きの要素リストを返します。CDP 不要。
|
|
20
|
+
- **LLM ネイティブ設計** — 人間の操作を模倣するのではなく、「LLM がいかにコンテキストを消費せず高速に動けるか」を前提に設計。`run_macro` による複数操作の一括実行(API 往復の削減)と、**MPEG P-frame 方式のレイヤー差分** (`diffMode`) を組み合わせることで、無駄な画像転送や推論ループを極限まで削ぎ落とす。
|
|
21
|
+
- **Reactive Perception Graph** — ウィンドウやブラウザタブに `lensId` を登録し、以後の action tool に渡すだけで、操作前の安全 guard と操作後の `post.perception` フィードバックを受け取れます。`screenshot` / `desktop_state` の反復を減らし、別ウィンドウへの誤入力や古い座標クリックを防ぎます。
|
|
22
|
+
- **日本語/CJK 完全対応** — ウィンドウタイトル取得に Win32 `GetWindowTextW` を使用。nut-js の文字化けを回避。IME バイパス入力にも対応。
|
|
23
|
+
- **3 段階トークン削減** — `detail="image"`(~443 tok)/ `detail="text"`(~100-300 tok)/ `diffMode=true`(~160 tok)を用途に応じて使い分け。視覚確認が必要な時だけ画像を送る。
|
|
24
|
+
- **座標変換不要の 1:1 モード** — `dotByDot=true` で WebP 1:1 キャプチャ。画像上のピクセル座標 = 画面座標なのでスケール計算が不要。
|
|
25
|
+
- **ブラウザキャプチャのデータ削減** — `grayscale=true`、`dotByDotMaxDimension=1280`、`windowTitle + region` の部分切り出しで、ブラウザ chrome や不要な余白を除外。重いキャプチャで 50〜70% 程度の削減を狙えます。
|
|
26
|
+
- **UIA アクション要素抽出** — `detail="text"` でボタン・入力欄の名前と `clickAt` 座標を JSON で返すため、画像を見なくても操作できる。
|
|
27
|
+
- **Chromium スマートフォールバック** — Chrome/Edge/Brave に対して `detail="text"` を使うと、低速な UIA を自動スキップし Windows OCR を実行。`hints.chromiumGuard` + `hints.ocrFallbackFired` で経路を判別可能。
|
|
28
|
+
- **CLI 自動ドック** — `window_dock(action='dock')` でウィンドウを画面隅にスナップ&最前面固定。`DESKTOP_TOUCH_DOCK_TITLE='@parent'` を設定すると、MCP 起動時にプロセスツリーを辿って Claude CLI をホストするターミナルを自動ドック。
|
|
29
|
+
- **緊急停止 (Failsafe)** — マウスを**画面左上コーナー (0,0 付近 10px)** に移動すると MCP サーバーが即座に終了。
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 前提環境
|
|
34
|
+
|
|
35
|
+
| 項目 | 要件 |
|
|
36
|
+
|---|---|
|
|
37
|
+
| OS | Windows 10 / 11 (64-bit) |
|
|
38
|
+
| Node.js | v20 以上推奨 (v22+ で動作確認済み) |
|
|
39
|
+
| PowerShell | 5.1 以上 (Windows 標準同梱) — Rust ネイティブエンジン不在時のフォールバック用 |
|
|
40
|
+
| Claude CLI | `claude` コマンドが使えること |
|
|
41
|
+
|
|
42
|
+
> **注意:** nut-js のネイティブバインディングは Visual C++ 再頒布可能パッケージを必要とします。
|
|
43
|
+
> インストール済みでない場合は [Microsoft公式](https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist) からダウンロードしてください。
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## インストール
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
npx -y @harusame64/desktop-touch-mcp
|
|
51
|
+
```
|
|
52
|
+
|
|
54
53
|
npm ランチャーは npm package version に厳密に対応する runtime だけを取得します。`X.Y.Z` を実行した場合は GitHub Release `vX.Y.Z` のみを参照し、`desktop-touch-mcp-windows.zip` をダウンロードして SHA256 を検証できた場合にだけ `%USERPROFILE%\.desktop-touch-mcp` へ展開します。検証済みキャッシュは次回以降も再利用されます。
|
|
55
54
|
|
|
56
55
|
キャッシュの保存先は `DESKTOP_TOUCH_MCP_HOME` で変更できます。
|
|
57
|
-
|
|
58
|
-
### Claude CLI への登録
|
|
59
|
-
|
|
60
|
-
`~/.claude.json` の `mcpServers` に追加:
|
|
61
|
-
|
|
62
|
-
```json
|
|
63
|
-
{
|
|
64
|
-
"mcpServers": {
|
|
65
|
-
"desktop-touch": {
|
|
66
|
-
"type": "stdio",
|
|
67
|
-
"command": "npx",
|
|
68
|
-
"args": ["-y", "@harusame64/desktop-touch-mcp"]
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### HTTP モードでの起動(GPT Desktop / VS Code / Cursor など)
|
|
75
|
-
|
|
76
|
-
HTTP 接続が必要なクライアントには `--http` フラグを使います。
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
npx -y @harusame64/desktop-touch-mcp --http
|
|
80
|
-
# ポートを変更する場合:
|
|
81
|
-
npx -y @harusame64/desktop-touch-mcp --http --port 8080
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
デフォルトポートは `23847`。`http://127.0.0.1:23847/mcp` をクライアントの MCP サーバー URL に登録してください(ローカルのみ、外部公開なし)。
|
|
85
|
-
ヘルスチェック: `http://127.0.0.1:<port>/health`
|
|
86
|
-
|
|
87
|
-
HTTP モード起動時はタスクトレイにバルーン通知が表示され、右クリックメニューから URL コピー・ブラウザで確認・終了が行えます。
|
|
88
|
-
|
|
89
|
-
### 開発用インストール
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
git clone https://github.com/Harusame64/desktop-touch-mcp.git
|
|
93
|
-
cd desktop-touch-mcp
|
|
94
|
-
npm install
|
|
95
|
-
```
|
|
96
|
-
|
|
56
|
+
|
|
57
|
+
### Claude CLI への登録
|
|
58
|
+
|
|
59
|
+
`~/.claude.json` の `mcpServers` に追加:
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"mcpServers": {
|
|
64
|
+
"desktop-touch": {
|
|
65
|
+
"type": "stdio",
|
|
66
|
+
"command": "npx",
|
|
67
|
+
"args": ["-y", "@harusame64/desktop-touch-mcp"]
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### HTTP モードでの起動(GPT Desktop / VS Code / Cursor など)
|
|
74
|
+
|
|
75
|
+
HTTP 接続が必要なクライアントには `--http` フラグを使います。
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npx -y @harusame64/desktop-touch-mcp --http
|
|
79
|
+
# ポートを変更する場合:
|
|
80
|
+
npx -y @harusame64/desktop-touch-mcp --http --port 8080
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
デフォルトポートは `23847`。`http://127.0.0.1:23847/mcp` をクライアントの MCP サーバー URL に登録してください(ローカルのみ、外部公開なし)。
|
|
84
|
+
ヘルスチェック: `http://127.0.0.1:<port>/health`
|
|
85
|
+
|
|
86
|
+
HTTP モード起動時はタスクトレイにバルーン通知が表示され、右クリックメニューから URL コピー・ブラウザで確認・終了が行えます。
|
|
87
|
+
|
|
88
|
+
### 開発用インストール
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
git clone https://github.com/Harusame64/desktop-touch-mcp.git
|
|
92
|
+
cd desktop-touch-mcp
|
|
93
|
+
npm install
|
|
94
|
+
```
|
|
95
|
+
|
|
97
96
|
`npm install` 後にビルドを実行してください。
|
|
98
97
|
|
|
99
98
|
```bash
|
|
100
99
|
npm run build
|
|
101
100
|
```
|
|
102
|
-
|
|
103
|
-
ローカルチェックアウトを使う場合は、ビルド済みのサーバーを直接登録します。
|
|
104
|
-
|
|
105
|
-
```json
|
|
106
|
-
{
|
|
107
|
-
"mcpServers": {
|
|
108
|
-
"desktop-touch": {
|
|
109
|
-
"type": "stdio",
|
|
110
|
-
"command": "node",
|
|
111
|
-
"args": ["D:/path/to/desktop-touch-mcp/dist/index.js"]
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
> **注意:** `D:/path/to/desktop-touch-mcp` の部分は、このリポジトリをクローンした実際のパスに変更してください。
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## ツール一覧 (
|
|
122
|
-
|
|
123
|
-
> 📖 **詳細リファレンス**: [`docs/system-overview.md`](docs/system-overview.md) — 各ツールのパラメータ・応答形式・座標計算・レイヤーバッファ・技術ノートを網羅(英語)。
|
|
124
|
-
|
|
125
|
-
### スクリーンショット系 (5)
|
|
126
|
-
| ツール | 概要 |
|
|
127
|
-
|---|---|
|
|
128
|
-
| `screenshot` | メインキャプチャ。`detail` / `dotByDot` / `dotByDotMaxDimension` / `grayscale` / `region` / `diffMode` 対応 |
|
|
129
|
-
| `screenshot_background` | 背面・最小化ウィンドウをキャプチャ (PrintWindow API) |
|
|
130
|
-
| `screenshot_ocr` | Windows OCR で文字と `clickAt` 座標を取得 |
|
|
131
|
-
| `get_screen_info` | モニター解像度・DPI・カーソル位置 |
|
|
132
|
-
| `
|
|
133
|
-
|
|
134
|
-
### ウィンドウ管理 (4)
|
|
135
|
-
| ツール | 概要 |
|
|
136
|
-
|---|---|
|
|
137
|
-
| `get_windows` | 全ウィンドウを Z-order 順で一覧 |
|
|
138
|
-
| `get_active_window` | フォーカス中ウィンドウの情報 |
|
|
139
|
-
| `focus_window` | タイトル部分一致でフォアグラウンドに移動。ChromeタブURL指定にも対応 |
|
|
140
|
-
| `
|
|
141
|
-
|
|
142
|
-
### マウス操作 (5)
|
|
143
|
-
| ツール | 概要 |
|
|
144
|
-
|---|---|
|
|
145
|
-
| `mouse_move` / `mouse_click` / `mouse_drag` | 移動・クリック・ドラッグ。`speed` / `homing` / `forceFocus` 対応 |
|
|
146
|
-
| `scroll` | 上下左右スクロール。`speed` / `homing` 対応 |
|
|
147
|
-
| `get_cursor_position` | 現在カーソル座標 |
|
|
148
|
-
|
|
149
|
-
### キーボード操作 (2)
|
|
150
|
-
| ツール | 概要 |
|
|
151
|
-
|---|---|
|
|
152
|
-
| `
|
|
153
|
-
| `
|
|
154
|
-
|
|
155
|
-
### UI Automation (4)
|
|
156
|
-
| ツール | 概要 |
|
|
157
|
-
|---|---|
|
|
158
|
-
| `get_ui_elements` | UIA 要素ツリー取得 |
|
|
159
|
-
| `click_element` | 名前/AutomationId でボタンやメニューをクリック (座標不要) |
|
|
160
|
-
| `set_element_value` | テキストフィールドに直接値をセット |
|
|
161
|
-
| `scope_element` | 要素を高解像度ズームキャプチャ + 子ツリー |
|
|
162
|
-
|
|
163
|
-
### Browser CDP (
|
|
164
|
-
| ツール | 概要 |
|
|
165
|
-
|---|---|
|
|
166
|
-
| `
|
|
167
|
-
| `
|
|
168
|
-
| `
|
|
169
|
-
| `
|
|
170
|
-
| `
|
|
171
|
-
| `
|
|
172
|
-
| `
|
|
173
|
-
| `
|
|
174
|
-
| `
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
|
189
|
-
|
|
190
|
-
| `
|
|
191
|
-
| `
|
|
192
|
-
| `
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
Chrome/Edge
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
`
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
#
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
detail=
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
---
|
|
369
|
-
|
|
370
|
-
##
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
101
|
+
|
|
102
|
+
ローカルチェックアウトを使う場合は、ビルド済みのサーバーを直接登録します。
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"mcpServers": {
|
|
107
|
+
"desktop-touch": {
|
|
108
|
+
"type": "stdio",
|
|
109
|
+
"command": "node",
|
|
110
|
+
"args": ["D:/path/to/desktop-touch-mcp/dist/index.js"]
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
> **注意:** `D:/path/to/desktop-touch-mcp` の部分は、このリポジトリをクローンした実際のパスに変更してください。
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## ツール一覧 (28 ツール — 26 stub catalog + 2 dynamic v2)
|
|
121
|
+
|
|
122
|
+
> 📖 **詳細リファレンス**: [`docs/system-overview.md`](docs/system-overview.md) — 各ツールのパラメータ・応答形式・座標計算・レイヤーバッファ・技術ノートを網羅(英語)。
|
|
123
|
+
|
|
124
|
+
### スクリーンショット系 (5)
|
|
125
|
+
| ツール | 概要 |
|
|
126
|
+
|---|---|
|
|
127
|
+
| `screenshot` | メインキャプチャ。`detail` / `dotByDot` / `dotByDotMaxDimension` / `grayscale` / `region` / `diffMode` 対応 |
|
|
128
|
+
| `screenshot_background` | 背面・最小化ウィンドウをキャプチャ (PrintWindow API) |
|
|
129
|
+
| `screenshot_ocr` | Windows OCR で文字と `clickAt` 座標を取得 |
|
|
130
|
+
| `get_screen_info` | モニター解像度・DPI・カーソル位置 |
|
|
131
|
+
| `scroll(action='capture')` | ページ全体をスクロールしながらスティッチ |
|
|
132
|
+
|
|
133
|
+
### ウィンドウ管理 (4)
|
|
134
|
+
| ツール | 概要 |
|
|
135
|
+
|---|---|
|
|
136
|
+
| `get_windows` | 全ウィンドウを Z-order 順で一覧 |
|
|
137
|
+
| `get_active_window` | フォーカス中ウィンドウの情報 |
|
|
138
|
+
| `focus_window` | タイトル部分一致でフォアグラウンドに移動。ChromeタブURL指定にも対応 |
|
|
139
|
+
| `window_dock(action='dock')` | Claude CLIなどを画面隅にドックして最前面固定 |
|
|
140
|
+
|
|
141
|
+
### マウス操作 (5)
|
|
142
|
+
| ツール | 概要 |
|
|
143
|
+
|---|---|
|
|
144
|
+
| `mouse_move` / `mouse_click` / `mouse_drag` | 移動・クリック・ドラッグ。`speed` / `homing` / `forceFocus` 対応 |
|
|
145
|
+
| `scroll` | 上下左右スクロール。`speed` / `homing` 対応 |
|
|
146
|
+
| `get_cursor_position` | 現在カーソル座標 |
|
|
147
|
+
|
|
148
|
+
### キーボード操作 (2)
|
|
149
|
+
| ツール | 概要 |
|
|
150
|
+
|---|---|
|
|
151
|
+
| `keyboard(action='type')` | テキスト入力。`use_clipboard=true` で IME バイパス、非ASCII記号は自動clipboard経路 |
|
|
152
|
+
| `keyboard(action='press')` | `ctrl+c` / `alt+tab` / `f5` などのキー入力・修飾キー組み合わせ |
|
|
153
|
+
|
|
154
|
+
### UI Automation (4)
|
|
155
|
+
| ツール | 概要 |
|
|
156
|
+
|---|---|
|
|
157
|
+
| `get_ui_elements` | UIA 要素ツリー取得 |
|
|
158
|
+
| `click_element` | 名前/AutomationId でボタンやメニューをクリック (座標不要) |
|
|
159
|
+
| `set_element_value` | テキストフィールドに直接値をセット |
|
|
160
|
+
| `scope_element` | 要素を高解像度ズームキャプチャ + 子ツリー |
|
|
161
|
+
|
|
162
|
+
### Browser CDP (9)
|
|
163
|
+
| ツール | 概要 |
|
|
164
|
+
|---|---|
|
|
165
|
+
| `browser_open` | Chrome/Edge に CDP 接続してタブ一覧取得。`launch:{}` を渡すと CDP エンドポイントが無いとき自動でデバッグモード起動(idempotent — 既存エンドポイントがあれば spawn skip) |
|
|
166
|
+
| `browser_locate` | CSS セレクター → 物理ピクセル座標 |
|
|
167
|
+
| `browser_click` | DOM 要素を検索してクリック(1ステップ) |
|
|
168
|
+
| `browser_eval` | タブ上の操作を 3 アクションで提供:`js`(JS 評価)/ `dom`(HTML 取得)/ `appState`(SSR 注入された SPA state を抽出 — `__NEXT_DATA__` / `__NUXT_DATA__` / `__REMIX_CONTEXT__` / `__APOLLO_STATE__` / GitHub `react-app` / JSON-LD / Redux SSR) |
|
|
169
|
+
| `browser_fill` | React/Vue/Svelte の controlled input をCDPで安全に入力 |
|
|
170
|
+
| `browser_form` | フォーム配下の input/select/textarea/button を name・type・value・label 付きで列挙 |
|
|
171
|
+
| `browser_overview` | リンク/ボタン/入力 + ARIA トグルを状態付きで列挙 |
|
|
172
|
+
| `browser_search` | text / regex / role / ariaLabel / selector で DOM を grep(confidence 順) |
|
|
173
|
+
| `browser_navigate` | CDP 経由で URL 遷移。`waitForLoad:true` が既定 |
|
|
174
|
+
|
|
175
|
+
DOM を触る `browser_*` ツールは `includeContext:false` で末尾の `activeTab:` / `readyState:` 2 行を省略可(連続呼び出しで ~150 tok/call 削減)。500ms 以内の連続 call は getTabContext を内部キャッシュで 1 回に圧縮。
|
|
176
|
+
|
|
177
|
+
### ワークスペース (2)
|
|
178
|
+
| ツール | 概要 |
|
|
179
|
+
|---|---|
|
|
180
|
+
| `workspace_snapshot` | 全ウィンドウをサムネイル + UI 要素サマリで一括取得 |
|
|
181
|
+
| `workspace_launch` | アプリ起動 + 新ウィンドウ自動検出 |
|
|
182
|
+
|
|
183
|
+
### コンテキスト・待機・履歴 (8)
|
|
184
|
+
| ツール | 概要 |
|
|
185
|
+
|---|---|
|
|
186
|
+
| `desktop_state` | フォーカス中ウィンドウ・要素・カーソル・ページ状態を軽量取得 |
|
|
187
|
+
| `get_history` | 直近ツール履歴を取得 |
|
|
188
|
+
| `get_document_state` | Chromeページ状態(URL/title/readyState/scroll)をCDPで取得 |
|
|
189
|
+
| `server_status` | 各サブシステムの動作バックエンドを返す:`uia`(Rust native または powershell)/ `imageDiff`(Rust SSE2 または typescript)。診断用 — パフォーマンス調査時に1回呼ぶ |
|
|
190
|
+
| `wait_until` | window/focus/terminal/browser DOM などの状態変化をサーバー側で待機 |
|
|
191
|
+
| `events_subscribe` / `events_poll` / `events_unsubscribe` / `events_list` | ウィンドウ出現・消滅・フォーカス変化を購読/取得 |
|
|
192
|
+
|
|
193
|
+
### ターミナル (2)
|
|
194
|
+
| ツール | 概要 |
|
|
195
|
+
|---|---|
|
|
196
|
+
| `terminal(action='read')` | Windows Terminal / PowerShell / cmd / WSL のテキストをUIA/OCRで取得。`sinceMarker`差分対応 |
|
|
197
|
+
| `terminal(action='send')` | ターミナルへコマンド送信。clipboard paste既定でIME安全 |
|
|
198
|
+
|
|
199
|
+
### ピン・マクロ (3)
|
|
200
|
+
| ツール | 概要 |
|
|
201
|
+
|---|---|
|
|
202
|
+
| `window_dock(action='pin')` / `unwindow_dock(action='pin')` | 最前面固定 / 解除 |
|
|
203
|
+
| `run_macro` | 最大 50 ステップを順次実行 |
|
|
204
|
+
|
|
205
|
+
### Clipboard / Notification (3)
|
|
206
|
+
| ツール | 概要 |
|
|
207
|
+
|---|---|
|
|
208
|
+
| `clipboard(action='read')` / `clipboard(action='write')` | Windows clipboard のテキスト読み書き。Unicode/CJK対応 |
|
|
209
|
+
| `notification_show` | 長時間タスク完了時などにWindows通知を表示 |
|
|
210
|
+
|
|
211
|
+
### 高度スクロール (2)
|
|
212
|
+
| ツール | 概要 |
|
|
213
|
+
|---|---|
|
|
214
|
+
| `scroll(action='to_element')` | 要素名またはCSS selectorで対象をviewportへスクロール |
|
|
215
|
+
| `scroll(action='smart')` | CDP → UIA → 画像binary-searchの統合スクロール。ネスト・仮想リスト・sticky header対応 |
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 推奨ワークフロー (v1.0.0)
|
|
220
|
+
|
|
221
|
+
v2 World-Graph (`desktop_discover` / `desktop_act`) が標準ディスパッチパス。ネイティブアプリ・ブラウザ・ターミナルを同じ 4 ステップで扱えます。
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
desktop_state → 状況把握: focused window/element / modal / attention
|
|
225
|
+
desktop_discover → 操作可能 entity を取得 (lease + windows[] 付き)
|
|
226
|
+
desktop_act(lease, …) → entity 操作 (attention + post.perception を返す)
|
|
227
|
+
desktop_state → 期待通りに状態が変わったか確認
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
クリック優先順:
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
browser_click(selector) → Chrome / Edge (CDP、再描画に強い)
|
|
234
|
+
desktop_act(lease, action='click') → ネイティブ / ダイアログ / ビジュアル (entity ベース)
|
|
235
|
+
click_element(name | automationId) → desktop_act が ok:false の時の UIA フォールバック
|
|
236
|
+
mouse_click(x, y, origin?, scale?) → 最終手段。dotByDot screenshot の origin+scale を使うこと
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
リカバリ — `response.attention` を毎観測でチェック、`desktop_discover` / `desktop_act` の `response.warnings[]` を読む:
|
|
240
|
+
|
|
241
|
+
- `lease_expired` / `lease_generation_mismatch` / `lease_digest_mismatch` / `entity_not_found` → `desktop_discover` を再実行
|
|
242
|
+
- `modal_blocking` → `click_element` で modal を閉じてからリトライ
|
|
243
|
+
- `entity_outside_viewport` → `scroll(action='to_element' | 'raw')` 後に `desktop_discover` 再実行
|
|
244
|
+
- `executor_failed` → V1 (`click_element` / `mouse_click` / `browser_click`) にフォールバック
|
|
245
|
+
|
|
246
|
+
Lease ライフサイクル:
|
|
247
|
+
|
|
248
|
+
- `desktop_discover` のレスポンスに `softExpiresAtMs` (TTL の約 60%) が含まれます。これを過ぎたら lease 自体は valid でも proactive に `desktop_discover` を再実行することを推奨。`lease.expiresAtMs` だけが本当の correctness 境界です。
|
|
249
|
+
- TTL は `view` モード (`action`/`explore`/`debug`)、entity 数、レスポンスサイズに応じて伸縮 (上限 60 秒)。
|
|
250
|
+
- `DESKTOP_TOUCH_DISABLE_FUKUWARAI_V2=1` で V1 ツール (`get_windows` / `get_ui_elements` / `set_element_value`) にフォールバック可能 — トラブルシューティング目的のみ。標準は V2。
|
|
251
|
+
|
|
252
|
+
### Reactive Perception Graph (4)
|
|
253
|
+
| ツール | 概要 |
|
|
254
|
+
|---|---|
|
|
255
|
+
| `perception_register` | 対象ウィンドウ/タブの live perception lens を登録し、action tool に渡す `lensId` を返す |
|
|
256
|
+
| `perception_read` | attention が dirty/stale/blocked の時に lens を強制更新し、perception envelope を返す |
|
|
257
|
+
| `perception_forget` | ワークフロー完了時や対象が置き換わった時に lens を解除 |
|
|
258
|
+
| `perception_list` | 登録中 lens を一覧し、再利用やクリーンアップに使う |
|
|
259
|
+
|
|
260
|
+
Reactive Perception Graph は desktop-touch の低コストな状況把握レイヤーです。対象の同一性・フォーカス・矩形・準備状態・guard 結果を操作間で維持し、Claude が小さな操作のたびにスクリーンショットで確認し直さなくて済むようにします。
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
## ブラウザ CDP 自動化
|
|
264
|
+
|
|
265
|
+
Chrome/Edge をリモートデバッグポート付きで起動するだけで、DOM 要素をピクセル精度でクリックできます。
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
# Chrome を CDP モードで起動
|
|
269
|
+
chrome.exe --remote-debugging-port=9222 --user-data-dir=C:\tmp\cdp
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
```
|
|
273
|
+
browser_open({launch:{}}) → 必要時 spawn してから接続(idempotent)
|
|
274
|
+
browser_open() → 純 connect(CDP 未起動なら fail)
|
|
275
|
+
browser_locate({selector:"#submit"}) → CSS セレクター → 物理ピクセル座標
|
|
276
|
+
browser_click({selector:"#submit"}) → 検索 + クリックを 1 ステップで
|
|
277
|
+
browser_eval({action:"js", expression:"document.title"}) → JS 評価して結果を返す
|
|
278
|
+
browser_eval({action:"dom", selector:"#main", maxLength:5000}) → outerHTML を取得(文字数制限付き)
|
|
279
|
+
browser_eval({action:"appState"}) → SPA ステートを 1 呼び出しで抽出(Next/Nuxt/Remix/Apollo/GitHub/Redux SSR)
|
|
280
|
+
browser_overview() → リンク/ボタン/入力 + ARIA トグル (state.checked 等) を列挙
|
|
281
|
+
browser_search({by:"text", pattern:"..."}) → DOM を grep(confidence 順)
|
|
282
|
+
browser_navigate({url:"https://example.com"}) → CDP 経由でページ遷移
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
同一タブで連続呼び出しする場合は `includeContext:false` で末尾の activeTab/readyState 行を省略可(~150 tok/call 削減)。boolean / object パラメータは LLM が string 化した値(`"true"` / `"{}"`)でも受け付けます。
|
|
286
|
+
|
|
287
|
+
`browser_locate` が返す座標はブラウザUI(タブストリップ + アドレスバー)の高さと `devicePixelRatio` を考慮済みなので、`mouse_click` にそのまま渡せます。
|
|
288
|
+
|
|
289
|
+
**Web 操作の推奨フロー:**
|
|
290
|
+
```
|
|
291
|
+
browser_open({launch:{}}) → browser_eval({action:"dom"}) → browser_locate(selector) → browser_click(selector)
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## マウスホーミング補正(トラクションコントロール)
|
|
297
|
+
|
|
298
|
+
Claude が `screenshot(detail='text')` で座標を取得してから `mouse_click` を呼ぶまでの数秒間に、ウィンドウが移動・裏に隠れることがある「福笑い問題」を MCP サーバー側で自動補正します。
|
|
299
|
+
|
|
300
|
+
| Tier | 有効化方法 | レイテンシ | 効果 |
|
|
301
|
+
|------|-----------|-----------|------|
|
|
302
|
+
| 1 | 常時(cache あれば) | <1ms | ウィンドウ移動を (dx, dy) 補正 |
|
|
303
|
+
| 2 | `windowTitle` ヒントを指定 | ~100ms | 裏に隠れたウィンドウを自動前面化 |
|
|
304
|
+
| 3 | `elementName`/`elementId` + `windowTitle` | 1–3s | リサイズ時に UIA で最新座標を再クエリ |
|
|
305
|
+
|
|
306
|
+
```
|
|
307
|
+
# Tier 1 のみ(自動)
|
|
308
|
+
mouse_click(x=500, y=300)
|
|
309
|
+
|
|
310
|
+
# Tier 1 + 2: 裏に隠れていても前面化してクリック
|
|
311
|
+
mouse_click(x=500, y=300, windowTitle="メモ帳")
|
|
312
|
+
|
|
313
|
+
# Tier 1 + 2 + 3: リサイズ時も UIA で再クエリ
|
|
314
|
+
mouse_click(x=500, y=300, windowTitle="メモ帳", elementName="保存")
|
|
315
|
+
|
|
316
|
+
# トラクションコントロール OFF — 補正なし
|
|
317
|
+
mouse_click(x=500, y=300, homing=false)
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
`homing` パラメータは `mouse_click` / `mouse_move` / `mouse_drag` / `scroll` 全てで使えます。キャッシュは `screenshot()` / `get_windows()` / `focus_window()` / `workspace_snapshot()` 呼び出し時に自動更新されます。
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## screenshot の主要パラメータ
|
|
325
|
+
|
|
326
|
+
```
|
|
327
|
+
detail="image" — PNG/WebP 画像(デフォルト)
|
|
328
|
+
detail="text" — UIA 要素 JSON + clickAt 座標(画像なし、~100-300 tok)
|
|
329
|
+
detail="meta" — タイトル + 座標のみ(最軽量、~20 tok/窓)
|
|
330
|
+
dotByDot=true — 1:1 WebP。image_px + origin = screen_px
|
|
331
|
+
diffMode=true — 初回 I-frame、以降は変化した窓のみ P-frame(~160 tok)
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**推奨ワークフロー:**
|
|
335
|
+
```
|
|
336
|
+
workspace_snapshot() → 全体把握(I-frame リセット)
|
|
337
|
+
screenshot(detail="text", windowTitle=X) → actionable[].clickAt でそのままクリック
|
|
338
|
+
mouse_click(x, y)
|
|
339
|
+
screenshot(diffMode=true) → 変化した窓だけ確認(~160 tok)
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## セキュリティ
|
|
345
|
+
|
|
346
|
+
### 緊急停止 (Failsafe)
|
|
347
|
+
|
|
348
|
+
**マウスを画面の左上コーナー (座標 0,0 付近 10px 以内) に素早く移動させると MCP サーバーが即座に停止します。**
|
|
349
|
+
|
|
350
|
+
- **ツール実行前チェック**: 各ツール呼び出しの開始時に毎回確認
|
|
351
|
+
- **バックグラウンド監視**: 500ms 間隔で常時監視(長時間処理中のバックアップ)
|
|
352
|
+
- コーナー判定範囲: 10px 以内
|
|
353
|
+
|
|
354
|
+
### ブロックされる操作
|
|
355
|
+
|
|
356
|
+
**`workspace_launch` のブロックリスト:**
|
|
357
|
+
`cmd.exe`, `powershell.exe`, `pwsh.exe`, `wscript.exe`, `cscript.exe`, `mshta.exe`, `regsvr32.exe`, `rundll32.exe`, `msiexec.exe`, `bash.exe`, `wsl.exe` は起動不可。
|
|
358
|
+
`.bat`, `.ps1`, `.vbs` 等のスクリプトファイルも拒否。引数に `;`, `&`, `|`, `` ` ``, `$(`, `${` を含む場合も拒否。
|
|
359
|
+
|
|
360
|
+
**`keyboard(action='press')` のブロックリスト:**
|
|
361
|
+
`Win+R`(Run ダイアログ)、`Win+X`(管理ツールメニュー)、`Win+S`(検索)、`Win+L`(ロック)は実行不可。
|
|
362
|
+
|
|
363
|
+
### PowerShell インジェクション対策
|
|
364
|
+
|
|
365
|
+
UIA ブリッジの PowerShell フォールバックパスでは、`-like` パターンに `escapeLike()` でワイルドカード文字 (`*`, `?`, `[`, `]`) をエスケープ済み。v0.15 以降、UIA の主パスは Rust ネイティブエンジン(直接 COM 呼び出し)のため、PowerShell は補助的なフォールバックとしてのみ使用されます。
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## マウス移動速度
|
|
370
|
+
|
|
371
|
+
`mouse_move` / `mouse_click` / `mouse_drag` / `scroll` は全て `speed` パラメータ(省略可)を受け付けます。
|
|
372
|
+
|
|
373
|
+
| 値 | 動作 |
|
|
374
|
+
|---|---|
|
|
375
|
+
| 省略 | 設定済みのデフォルト速度を使用(下記参照) |
|
|
376
|
+
| `0` | 瞬間移動(`setPosition()` — アニメーションなし) |
|
|
377
|
+
| `1〜N` | N px/秒 でアニメーション移動 |
|
|
378
|
+
|
|
379
|
+
**デフォルト速度は 1500 px/秒**。環境変数 `DESKTOP_TOUCH_MOUSE_SPEED` で永続的に変更できます。
|
|
380
|
+
|
|
381
|
+
```json
|
|
382
|
+
{
|
|
383
|
+
"mcpServers": {
|
|
384
|
+
"desktop-touch": {
|
|
385
|
+
"type": "stdio",
|
|
386
|
+
"command": "npx",
|
|
387
|
+
"args": ["-y", "@harusame64/desktop-touch-mcp"],
|
|
388
|
+
"env": {
|
|
389
|
+
"DESKTOP_TOUCH_MOUSE_SPEED": "3000"
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
主な目安: `0` = テレポート、`1500` = デフォルト(ゆっくり)、`3000` = 速い、`5000` = 超速。
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
## Force-Focus (AttachThreadInput)
|
|
401
|
+
|
|
402
|
+
Windows のフォアグラウンド保護機能により、ピン固定された Claude CLI などが前面にある状態では `SetForegroundWindow` が拒否されることがあります。その結果、後続のキー入力やクリックが意図しないウィンドウに送られるサイレント障害が発生します。
|
|
403
|
+
|
|
404
|
+
`mouse_click`、`keyboard(action='type')`、`keyboard(action='press')`、`terminal(action='send')` はいずれも `forceFocus` パラメータを受け付けており、`AttachThreadInput` を使ってこの保護を迂回できます。
|
|
405
|
+
|
|
406
|
+
```json
|
|
407
|
+
{
|
|
408
|
+
"name": "mouse_click",
|
|
409
|
+
"arguments": {
|
|
410
|
+
"x": 500,
|
|
411
|
+
"y": 300,
|
|
412
|
+
"windowTitle": "Google Chrome",
|
|
413
|
+
"forceFocus": true
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
強制フォーカスが拒否された場合、応答に `hints.warnings: ["ForceFocusRefused"]` が含まれます。
|
|
419
|
+
|
|
420
|
+
**環境変数でグローバルデフォルトを設定する:**
|
|
421
|
+
|
|
422
|
+
```json
|
|
423
|
+
{
|
|
424
|
+
"mcpServers": {
|
|
425
|
+
"desktop-touch": {
|
|
426
|
+
"env": {
|
|
427
|
+
"DESKTOP_TOUCH_FORCE_FOCUS": "1"
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
`DESKTOP_TOUCH_FORCE_FOCUS=1` を設定すると、4 つのツールすべてで `forceFocus: true` がデフォルトになります。
|
|
435
|
+
|
|
436
|
+
**既知のトレードオフ:**
|
|
437
|
+
|
|
438
|
+
- `AttachThreadInput` が有効な約 10ms の間、2 スレッド間でキー状態とマウスキャプチャが共有されます。高速なマクロ連打では稀にレース状態が発生する可能性があります。
|
|
439
|
+
- ユーザーが別のアプリを手動操作している間は `forceFocus` を無効にするか、環境変数の設定を解除してください。予期しないフォーカス移動を防ぐためです。
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
## UI オペレーティングレイヤー (V2)
|
|
444
|
+
|
|
445
|
+
> **ステータス: v0.17 からデフォルト ON。** `desktop_discover` / `desktop_act` はインストール直後から使えます。
|
|
446
|
+
|
|
447
|
+
V2 は、座標ベースのクリックをエンティティベースの操作に置き換える 2 つの新ツールを追加します。
|
|
448
|
+
|
|
449
|
+
| ツール | 説明 |
|
|
450
|
+
|---|---|
|
|
451
|
+
| `desktop_discover` | ウィンドウまたはブラウザタブを観測し、インタラクティブなエンティティを返します。raw 座標は返しません。UIA(ネイティブ)、CDP(ブラウザ)、ターミナル、GPU ビジュアルレーンに対応。 |
|
|
452
|
+
| `desktop_act` | `desktop_discover` が返したエンティティを操作します。実行前にリースを検証し、セマンティック diff(`entity_disappeared`、`modal_appeared`、`focus_shifted` など)を返します。 |
|
|
453
|
+
|
|
454
|
+
### クリック優先順位
|
|
455
|
+
|
|
456
|
+
複数のツールが同じクリックを実行できる場合は、次の順番で優先してください:
|
|
457
|
+
|
|
458
|
+
1. `browser_click(selector)` — Chrome / Edge(CDP 経由、リペイントで座標がずれない)
|
|
459
|
+
2. `desktop_act(lease)` — ネイティブウィンドウ・ダイアログ・視覚のみの対象(`desktop_discover` 後に使用)
|
|
460
|
+
3. `click_element(name | automationId)` — `desktop_act` が `ok:false` の場合の UIA フォールバック
|
|
461
|
+
4. `mouse_click(x, y)` — 最終手段(`dotByDot` スクリーンショットの `origin`・`scale` が必要)
|
|
462
|
+
|
|
463
|
+
### V2 を無効にする(キルスイッチ)
|
|
464
|
+
|
|
465
|
+
`desktop_discover` / `desktop_act` をツールカタログから外したい場合は、disable フラグを追加して再起動します:
|
|
466
|
+
|
|
467
|
+
```json
|
|
468
|
+
{
|
|
469
|
+
"mcpServers": {
|
|
470
|
+
"desktop-touch": {
|
|
471
|
+
"type": "stdio",
|
|
472
|
+
"command": "npx",
|
|
473
|
+
"args": ["-y", "@harusame64/desktop-touch-mcp"],
|
|
474
|
+
"env": {
|
|
475
|
+
"DESKTOP_TOUCH_DISABLE_FUKUWARAI_V2": "1"
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
V1 ツールはすべてそのまま動作します。再インストール不要。env を削除して再起動すれば V2 は再び有効になります。
|
|
483
|
+
|
|
484
|
+
フラグのセマンティクス(完全一致: 文字列 `"1"` のみ有効):
|
|
485
|
+
|
|
486
|
+
| `DISABLE_FUKUWARAI_V2` | `ENABLE_FUKUWARAI_V2` | V2 状態 |
|
|
487
|
+
|---|---|---|
|
|
488
|
+
| 未設定 / `"1"` 以外 | 未設定 / `"1"` 以外 | **ON**(デフォルト) |
|
|
489
|
+
| 未設定 / `"1"` 以外 | `"1"` | ON(後方互換で受理、後述) |
|
|
490
|
+
| `"1"` | 任意 | **OFF** — DISABLE が優先 |
|
|
491
|
+
|
|
492
|
+
### 非推奨: `DESKTOP_TOUCH_ENABLE_FUKUWARAI_V2`
|
|
493
|
+
|
|
494
|
+
v0.16.x での opt-in フラグです。v0.17 では後方互換として受理されますが、サーバー起動時に非推奨の警告が表示されます。v0.18 で完全に削除されます。アップグレード時にはこのフラグを設定から削除してください。
|
|
495
|
+
|
|
496
|
+
### V2 が失敗した場合のリカバリ
|
|
497
|
+
|
|
498
|
+
`desktop_act` が `ok: false` を返した場合は `reason` を確認し、ツール説明のリカバリヒントに従ってください。よくあるパターン:
|
|
499
|
+
|
|
500
|
+
- `lease_expired` / `*_mismatch` / `entity_not_found` → `desktop_discover` を再実行してリースを更新
|
|
501
|
+
- `modal_blocking` → `click_element` でモーダルを閉じてから retry
|
|
502
|
+
- `entity_outside_viewport` → `scroll` / `scroll(action='to_element')` してから `desktop_discover` を再実行
|
|
503
|
+
- `executor_failed` → `click_element` / `mouse_click` / `browser_click` にフォールバック
|
|
504
|
+
|
|
505
|
+
`desktop_discover` が warnings(`visual_provider_unavailable`、`visual_provider_warming`、`cdp_provider_failed` 等)を返した場合も、V1 ツール(`screenshot`、`click_element`、`get_ui_elements`、`terminal(action='send')` など)がエスケープハッチとして使えます。
|
|
506
|
+
|
|
507
|
+
---
|
|
508
|
+
|
|
509
|
+
## 既知の制限
|
|
510
|
+
|
|
511
|
+
| 制限 | 詳細 | 回避策 |
|
|
512
|
+
|---|---|---|
|
|
513
|
+
| ゲーム・動画プレイヤーの背面キャプチャが黒またはハング | DirectX フルスクリーン等は `PW_RENDERFULLCONTENT (flag=2)` でもキャプチャ不可な場合がある | `screenshot_background(fullContent=false)` で旧フラグに切り替え、それでも黒なら前面キャプチャ (`screenshot`) を使用 |
|
|
514
|
+
| UIA 呼び出しのオーバーヘッド | Rust ネイティブ: フォーカス取得 ~2ms、ツリー走査 ~100ms。PowerShell フォールバック: ~300ms | 操作前に `workspace_snapshot` で一括取得し、以降は `diffMode` で差分確認 |
|
|
515
|
+
| Chrome / WinUI3 の UIA 要素が空 | Chromium は UIA を限定的にしか公開しない | `browser_open` + `browser_locate` で DOM ベースのクリックを使用。視覚確認のみなら `screenshot(detail="image")` |
|
|
516
|
+
| レイヤーバッファの TTL | 90 秒操作なしでバッファが自動クリア → 次回 `diffMode` が I-frame になる | 長い待機後は `workspace_snapshot` で明示的にリセット |
|
|
517
|
+
|
|
518
|
+
---
|
|
519
|
+
|
|
520
|
+
## パフォーマンス (v0.15)
|
|
521
|
+
|
|
522
|
+
### UIA ブリッジ — Rust ネイティブ vs PowerShell
|
|
523
|
+
|
|
524
|
+
| 関数 | Rust Native | PowerShell | 高速化 |
|
|
525
|
+
|---|---|---|---|
|
|
526
|
+
| `getFocusedElement` | **2.2 ms** | 366 ms | 🚀 **163.9×** |
|
|
527
|
+
| `getUiElements` | **106.5 ms** | 346 ms | 🚀 **3.3×** |
|
|
528
|
+
| **平均** | | | **🚀 ~82×** |
|
|
529
|
+
|
|
530
|
+
### 画像差分エンジン — Rust SSE2 SIMD vs TypeScript
|
|
531
|
+
|
|
532
|
+
| 関数 | Rust SSE2 | TypeScript | 高速化 |
|
|
533
|
+
|---|---|---|---|
|
|
534
|
+
| `computeChangeFraction` (1080p) | **0.26 ms** | 3.8 ms | 🚀 **~15×** |
|
|
535
|
+
| `dHash` (1080p) | **0.09 ms** | 1.2 ms | 🚀 **~13×** |
|
|
536
|
+
|
|
537
|
+
### アーキテクチャ概要
|
|
538
|
+
|
|
539
|
+
```
|
|
540
|
+
Claude CLI → MCP Server (TypeScript)
|
|
541
|
+
├── Rust Native Engine (.node addon)
|
|
542
|
+
│ ├── UIA: 専用 MTA スレッド → 直接 COM 呼び出し
|
|
543
|
+
│ └── Image: SSE2 SIMD カーネル
|
|
544
|
+
└── PowerShell フォールバック(自動切替)
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
- **バッチ型 BFS**: `FindAllBuildCache(TreeScope_Children)` による階層ごとの一括フェッチ。`maxElements` 到達で即打ち切りし、巨大ツリーでもスケーラブル。
|
|
548
|
+
- **自動フォールバック**: ネイティブエンジンが利用不可の場合、全関数が PowerShell に透過切替 — 設定不要。
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## パフォーマンス目安
|
|
553
|
+
|
|
554
|
+
| モード | 転送トークン | 用途 |
|
|
555
|
+
|---|---|---|
|
|
556
|
+
| `screenshot` (768px PNG) | ~443 tok | 一般的な視覚確認 |
|
|
557
|
+
| `screenshot(dotByDot=true)` ウィンドウ | ~800 tok | 精密クリック(座標変換不要) |
|
|
558
|
+
| `screenshot(diffMode=true)` | ~160 tok | 操作後の差分確認 |
|
|
559
|
+
| `screenshot(detail="text")` | ~100-300 tok | UI 操作(画像不要) |
|
|
560
|
+
| `workspace_snapshot` | ~2000 tok | セッション開始時の全体把握 |
|
|
561
|
+
|
|
562
|
+
---
|
|
563
|
+
|
|
564
|
+
## Claude へのシステムプロンプト(自動注入)
|
|
565
|
+
|
|
566
|
+
**設定は不要です。** MCP 接続時にコマンドリファレンスが自動的に Claude へ送信されます。
|
|
567
|
+
|
|
568
|
+
MCP `initialize` レスポンスの `instructions` フィールドを利用しており、Claude CLI がセッション開始時に自動でシステムプロンプトへ組み込みます。以下は送信される内容の参考です。
|
|
569
|
+
|
|
570
|
+
```
|
|
571
|
+
# desktop-touch-mcp 操作指針
|
|
572
|
+
|
|
573
|
+
## 情報収集の優先順位(トークン節約)
|
|
574
|
+
1. workspace_snapshot() → セッション開始時・全体把握が必要な時のみ
|
|
575
|
+
2. screenshot(detail="text", windowTitle=X) → UI操作(ボタン名・入力欄の確認)
|
|
576
|
+
3. screenshot(diffMode=true) → 操作後の確認(変化した窓のみ ~160 tok)
|
|
577
|
+
4. screenshot(dotByDot=true, windowTitle=X) → 精密座標が必要な時のみ
|
|
578
|
+
5. screenshot(detail="image") → 視覚的確認が必要な時のみ(最重量)
|
|
579
|
+
|
|
580
|
+
## 座標の扱い
|
|
581
|
+
- detail="text" の actionable[].clickAt は画面座標として直接 mouse_click に渡せる(変換不要)
|
|
582
|
+
- dotByDot=true の場合: screen_x = origin_x + image_x(レスポンスのoriginを参照)
|
|
583
|
+
- デフォルト PNG の場合: screen_x = window.x + image_x * (window.width / image.width)
|
|
584
|
+
|
|
585
|
+
## 操作ループの基本形
|
|
586
|
+
workspace_snapshot() → detail="text" で要素確認 → mouse_click/keyboard(action='type') → diffMode=true で確認
|
|
587
|
+
|
|
588
|
+
## 日本語入力
|
|
589
|
+
keyboard(action='type')(use_clipboard=true) を使うこと(IME バイパス)
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
---
|
|
593
|
+
|
|
594
|
+
## `workspace_launch` 起動許可リスト
|
|
595
|
+
|
|
596
|
+
セキュリティ上、`cmd.exe` / `powershell.exe` 等のシェルインタープリタはデフォルトでブロックされます。
|
|
597
|
+
特定の実行ファイルを許可するには **allowlist ファイル** を作成してください。
|
|
598
|
+
|
|
599
|
+
**設定ファイルの場所(上から順に検索):**
|
|
600
|
+
1. 環境変数 `DESKTOP_TOUCH_ALLOWLIST` で指定したパス
|
|
601
|
+
2. `~/.claude/desktop-touch-allowlist.json`
|
|
602
|
+
3. サーバー実行ディレクトリ直下の `desktop-touch-allowlist.json`
|
|
603
|
+
|
|
604
|
+
**フォーマット:**
|
|
605
|
+
```json
|
|
606
|
+
{
|
|
607
|
+
"allowedExecutables": [
|
|
608
|
+
"pwsh.exe",
|
|
609
|
+
"C:\\Tools\\myapp.exe"
|
|
610
|
+
]
|
|
611
|
+
}
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
ファイルの変更は即時反映されます(再起動不要)。
|
|
615
|
+
|
|
616
|
+
---
|
|
617
|
+
|
|
618
|
+
## ライセンス
|
|
619
|
+
|
|
620
|
+
MIT
|
|
621
|
+
|