Claude KVM
officielđ€ âĄïž Serveur MCP (ïŁż MacOS) â contrĂŽle des bureaux distants via VNC
Documentation
Claude KVM
AccĂšs Ă distance, Intelligence Artificielle
Claude KVM est un outil MCP qui contrĂŽle des environnements de bureau Ă distance via VNC. Il se compose dâune fine couche proxy en JS (serveur MCP) et dâun dĂ©mon VNC natif Swift sâexĂ©cutant sur votre systĂšme macOS.
[!TIP] Phantom-WG pourrait ĂȘtre une excellente alternative pour vous. Isolez votre serveur VNC au sein de votre propre rĂ©seau tout en bĂ©nĂ©ficiant des performances dâun VPN auto-hĂ©bergĂ© et des fonctionnalitĂ©s de confidentialitĂ© supplĂ©mentaires que vous gagnez au passage.
Tests en direct
- Test dâintĂ©gration
- Test dâintĂ©gration Mac
- Test Calculatrice Mac
- Test Calculatrice scientifique Mac
- Test Navigation Safari Mac
- Test Glisser-déposer Mac
- Test Ăchecs Mac
- Test Ăchecs Mac direct
- Test Installation Phantom-WG Mac
[!NOTE] Les tests sont menĂ©s de maniĂšre transparente sur GitHub Actions â chaque Ă©tape est visible dans lâenvironnement CI. Ă la fin de chaque test, que lâintĂ©gration rĂ©ussisse ou Ă©choue, vous trouverez des captures dâĂ©cran de chaque Ă©tape effectuĂ©e par lâagent durant la session, ainsi quâun enregistrement vidĂ©o
.mp4qui capture la session entiĂšre. En examinant ces enregistrements et captures dâĂ©cran, vous pouvez observer comment lâagent a progressĂ© Ă travers chaque Ă©tape, combien de temps la tĂąche a pris et quelles dĂ©cisions ont Ă©tĂ© prises en fonction de lâinvite systĂšme. Vous pouvez utiliser ces exemples comme rĂ©fĂ©rence lors de lâĂ©laboration de vos propres invites systĂšme ou instructions pour le serveur MCP dans votre propre environnement.
[!WARNING] Les artefacts attachĂ©s Ă ces exĂ©cutions peuvent avoir expirĂ© en raison de la politique de rĂ©tention des artefacts de GitHub. Des copies persistantes sont prĂ©parĂ©es via le workflow Persist Artifacts et peuvent toujours ĂȘtre consultĂ©es par ID dâexĂ©cution depuis le rĂ©pertoire
artifacts/sur la branche press-kit.
Architecture
graph TB
subgraph MCP["MCP Client (Claude)"]
AI["Claude"]
end
subgraph Proxy["claude-kvm · MCP Proxy (stdio)"]
direction TB
Server["MCP Server<br/><code>index.js</code>"]
Tools["Tool Definitions<br/><code>tools/index.js</code>"]
Server --> Tools
end
subgraph Daemon["claude-kvm-daemon · Native VNC Client (stdin/stdout)"]
direction TB
CMD["Command Handler<br/><i>PC Dispatch</i>"]
Scale["Display Scaling<br/><i>Scaled â Native</i>"]
subgraph Screen["Screen"]
Capture["Frame Capture<br/><i>PNG · Crop · Diff</i>"]
OCR["OCR Detection<br/><i>Apple Vision</i>"]
end
subgraph InputGroup["Input"]
Mouse["Mouse<br/><i>Click · Drag · Move · Scroll</i>"]
KB["Keyboard<br/><i>Tap · Combo · Type · Paste</i>"]
end
VNC["VNC Bridge<br/><i>LibVNCClient 0.9.15</i>"]
CMD --> Scale
Scale --> Capture
Scale --> Mouse
Scale --> KB
Capture -.->|"framebuffer"| VNC
Mouse -->|"pointer events"| VNC
KB -->|"key events"| VNC
end
subgraph Target["Target Machine"]
VNC_Server["VNC Server<br/><i>:5900</i>"]
Desktop["Desktop Environment"]
VNC_Server --> Desktop
end
AI <-->|"stdio<br/>JSON-RPC"| Server
Server <-->|"stdin/stdout<br/>PC (NDJSON)"| CMD
VNC <-->|"RFB Protocol<br/>TCP :5900"| VNC_Server
classDef proxy fill:#1a1a2e,stroke:#16213e,color:#e5e5e5
classDef daemon fill:#0f3460,stroke:#533483,color:#e5e5e5
classDef target fill:#1a1a2e,stroke:#e94560,color:#e5e5e5
class Server,Tools proxy
class CMD,Scale,VNC,Capture,Mouse,KB daemon
class VNC_Server,Desktop target
Couches
| Couche | Langage | RĂŽle | Communication |
|---|---|---|---|
| Proxy MCP | JavaScript (Node.js) | Communique avec Claude via le protocole MCP, gÚre le cycle de vie du démon | stdio JSON-RPC |
| DĂ©mon VNC | Swift/C (Apple Silicon) | Connexion VNC, capture dâĂ©cran, injection dâentrĂ©es souris/clavier | stdin/stdout PC (NDJSON) |
Protocole PC (Procedure Call)
La communication entre le proxy et le démon utilise le protocole PC sur NDJSON :
Request: {"method":"<name>","params":{...},"id":<int|string>}
Response: {"result":{...},"id":<int|string>}
Error: {"error":{"code":<int>,"message":"..."},"id":<int|string>}
Notification: {"method":"<name>","params":{...}}
Mise Ă lâĂ©chelle des coordonnĂ©es
La rĂ©solution native du serveur VNC est rĂ©duite pour tenir dans --max-dimension (par dĂ©faut : 1280px). Claude travaille de maniĂšre plus cohĂ©rente avec des coordonnĂ©es mises Ă lâĂ©chelle â le dĂ©mon gĂšre la conversion en arriĂšre-plan :
Native: 4220 x 2568 (VNC server framebuffer)
Scaled: 1280 x 779 (what Claude sees and targets)
mouse_click(640, 400) â VNC receives (2110, 1284)
StratĂ©gie dâĂ©cran
Claude minimise le coût en tokens avec une approche de vérification progressive :
diff_check â changeDetected: true/false ~5ms (text only, no image)
detect_elements â OCR text + bounding boxes ~50ms (text only, no image)
cursor_crop â crop around cursor ~50ms (small image)
screenshot â full screen capture ~200ms (full image)
detect_elements utilise le framework Apple Vision pour lâOCR sur lâappareil. Renvoie le contenu textuel avec les coordonnĂ©es du cadre englobant dans lâespace mis Ă lâĂ©chelle â permet un ciblage prĂ©cis des clics sans consommer de tokens de vision.
Installation
Prérequis
- macOS (Apple Silicon / aarch64)
- Node.js (LTS)
Démon
brew tap ARAS-Workspace/tap
brew install claude-kvm-daemon
[!NOTE]
claude-kvm-daemonest compilĂ© et signĂ© via CI (GitHub Actions). La sortie de construction est empaquetĂ©e dans deux formats : une archive.tar.gzpour la distribution Homebrew et une image disque.dmgpour la notarisation. Le DMG est soumis aux serveurs Apple pour notarisation au sein du mĂȘme workflow â le processus peut ĂȘtre suivi depuis les journaux CI. Le DMG notarisĂ© est disponible en tant quâartefact CI ; lâarchive.tar.gzest Ă©galement publiĂ©e en tant que release sur le dĂ©pĂŽt. Lâinstallation Homebrew suit cette release.
Configuration MCP
Créez un fichier .mcp.json dans le répertoire de votre projet :
{
"mcpServers": {
"claude-kvm": {
"command": "npx",
"args": ["-y", "claude-kvm"],
"env": {
"VNC_HOST": "192.168.1.100",
"VNC_PORT": "5900",
"VNC_USERNAME": "user",
"VNC_PASSWORD": "pass",
"CLAUDE_KVM_DAEMON_PATH": "/opt/homebrew/bin/claude-kvm-daemon",
"CLAUDE_KVM_DAEMON_PARAMETERS": "-v"
}
}
}
}
[!NOTE] Lâoutil est testĂ© de bout en bout via CI â Claude exĂ©cute des tĂąches sur VNC tandis quâun modĂšle de vision indĂ©pendant observe et vĂ©rifie les rĂ©sultats. Consultez le Test dâintĂ©gration pour les exĂ©cutions de workflow en direct, les invites systĂšme et les enregistrements de dĂ©monstration.
Configuration
Proxy MCP (ENV)
| ParamÚtre | Défaut | Description |
|---|---|---|
VNC_HOST | 127.0.0.1 | Adresse du serveur VNC |
VNC_PORT | 5900 | Numéro de port VNC |
VNC_USERNAME | Nom dâutilisateur (requis pour ARD) | |
VNC_PASSWORD | Mot de passe | |
CLAUDE_KVM_DAEMON_PATH | claude-kvm-daemon | Chemin du binaire du démon (inutile si déjà dans PATH) |
CLAUDE_KVM_DAEMON_PARAMETERS | Arguments CLI supplémentaires pour le démon |
ParamÚtres du démon (CLI)
Arguments supplémentaires passés au démon via CLAUDE_KVM_DAEMON_PARAMETERS :
"CLAUDE_KVM_DAEMON_PARAMETERS": "--max-dimension 800 -v"
| ParamÚtre | Défaut | Description |
|---|---|---|
--max-dimension | 1280 | Dimension maximale de mise Ă lâĂ©chelle de lâaffichage (px) |
--connect-timeout | Délai de connexion VNC (secondes) | |
--bits-per-sample | Bits par échantillon de pixel | |
--no-reconnect | Désactiver la reconnexion automatique | |
-v, --verbose | Journalisation verbeuse (stderr) |
Configuration Ă lâexĂ©cution (PC)
Tous les paramĂštres de temporisation et dâaffichage sont configurables Ă lâexĂ©cution via la mĂ©thode configure. Utilisez get_timing pour inspecter les valeurs actuelles.
Définir la temporisation :
{"method":"configure","params":{"click_hold_ms":80,"key_hold_ms":50}}
{"result":{"detail":"OK â changed: click_hold_ms, key_hold_ms"}}
Modifier la mise Ă lâĂ©chelle de lâaffichage :
{"method":"configure","params":{"max_dimension":960}}
{"result":{"detail":"OK â changed: max_dimension","scaledWidth":960,"scaledHeight":584}}
Réinitialiser aux valeurs par défaut :
{"method":"configure","params":{"reset":true}}
{"result":{"detail":"OK â reset to defaults","timing":{"click_hold_ms":50,"combo_mod_ms":10,"cursor_crop_radius":150,"double_click_gap_ms":50,"drag_min_steps":10,"drag_pixels_per_step":20,"drag_position_ms":30,"drag_press_ms":50,"drag_settle_ms":30,"drag_step_ms":5,"hover_settle_ms":400,"key_hold_ms":30,"max_dimension":1280,"paste_settle_ms":30,"scroll_press_ms":10,"scroll_tick_ms":20,"type_inter_key_ms":20,"type_key_ms":20,"type_shift_ms":10},"scaledWidth":1280,"scaledHeight":779}}
Obtenir les valeurs actuelles :
{"method":"get_timing"}
{"result":{"timing":{"click_hold_ms":80,"combo_mod_ms":10,"cursor_crop_radius":150,"double_click_gap_ms":50,"drag_min_steps":10,"drag_pixels_per_step":20,"drag_position_ms":30,"drag_press_ms":50,"drag_settle_ms":30,"drag_step_ms":5,"hover_settle_ms":400,"key_hold_ms":50,"max_dimension":1280,"paste_settle_ms":30,"scroll_press_ms":10,"scroll_tick_ms":20,"type_inter_key_ms":20,"type_key_ms":20,"type_shift_ms":10},"scaledWidth":1280,"scaledHeight":779}}
| ParamÚtre | Défaut | Description |
|---|---|---|
max_dimension | 1280 | Dimension max de capture dâĂ©cran |
cursor_crop_radius | 150 | Rayon de recadrage du curseur (px) |
click_hold_ms | 50 | Durée de maintien du clic |
double_click_gap_ms | 50 | Délai entre deux clics |
hover_settle_ms | 400 | Attente de stabilisation du survol |
drag_position_ms | 30 | Attente de position avant glisser |
drag_press_ms | 50 | Seuil de maintien pour appui glisser |
drag_step_ms | 5 | Entre les points dâinterpolation |
drag_settle_ms | 30 | Stabilisation avant relĂąchement |
drag_pixels_per_step | 20 | Densité de points par pixel |
drag_min_steps | 10 | Ătapes dâinterpolation min |
scroll_press_ms | 10 | Ăcart appui-relĂąchement dĂ©filement |
scroll_tick_ms | 20 | Délai inter-tic |
key_hold_ms | 30 | Durée de maintien de touche |
combo_mod_ms | 10 | Délai de stabilisation du modificateur |
type_key_ms | 20 | Maintien de touche pendant la frappe |
type_inter_key_ms | 20 | Délai inter-caractÚres |
type_shift_ms | 10 | Stabilisation touche Maj |
paste_settle_ms | 30 | Attente aprÚs écriture dans le presse-papiers |
Outils
Toutes les opérations sont effectuées via un seul outil vnc_command :
Ăcran
| Action | ParamĂštres | Description |
|---|---|---|
screenshot | Capture PNG plein écran | |
cursor_crop | Recadrage autour du curseur avec superposition de réticule | |
diff_check | DĂ©tecter les changements dâĂ©cran par rapport Ă la rĂ©fĂ©rence | |
set_baseline | Sauvegarder lâĂ©cran actuel comme rĂ©fĂ©rence de diff |
Souris
| Action | ParamĂštres | Description |
|---|---|---|
mouse_click | x, y, button? | Clic (gauche|droit|milieu) |
mouse_double_click | x, y | Double clic |
mouse_move | x, y | Déplacer le curseur |
hover | x, y | Déplacer + attente de stabilisation |
nudge | dx, dy | Mouvement relatif du curseur |
mouse_drag | x, y, toX, toY | Glisser du début à la fin |
scroll | x, y, direction, amount? | Défilement (haut|bas|gauche|droite) |
Clavier
| Action | ParamĂštres | Description |
|---|---|---|
key_tap | key | Appui sur une touche simple (entrée|échap|tab|espace|...) |
key_combo | key ou keys | Combinaison de modificateurs ("cmd+c" ou ["cmd","shift","3"]) |
key_type | text | Saisir du texte caractĂšre par caractĂšre |
paste | text | Coller du texte via le presse-papiers |
Détection
| Action | ParamĂštres | Description |
|---|---|---|
detect_elements | Détection de texte OCR avec cadres englobants (Apple Vision) |
Renvoie les Ă©lĂ©ments de texte avec les coordonnĂ©es du cadre englobant dans lâespace mis Ă lâĂ©chelle :
{"method":"detect_elements"}
{"result":{"detail":"13 elements","elements":[{"confidence":1,"h":9,"text":"Finder","w":32,"x":37,"y":6},{"confidence":1,"h":9,"text":"File","w":15,"x":84,"y":6},{"confidence":1,"h":9,"text":"Edit","w":19,"x":112,"y":6},{"confidence":1,"h":9,"text":"View","w":22,"x":143,"y":6},{"confidence":1,"h":11,"text":"Go","w":15,"x":179,"y":6},{"confidence":1,"h":9,"text":"Window","w":35,"x":207,"y":6},{"confidence":1,"h":11,"text":"Help","w":22,"x":255,"y":6},{"confidence":1,"h":11,"text":"8âą","w":26,"x":1161,"y":6},{"confidence":1,"h":9,"text":"Fri Feb 20 22:19","w":80,"x":1189,"y":6},{"confidence":1,"h":9,"text":"Assets","w":32,"x":1202,"y":97},{"confidence":1,"h":9,"text":"Passwords.kdbx","w":74,"x":1181,"y":168},{"confidence":1,"h":93,"text":"PHANTOM","w":633,"x":322,"y":477},{"confidence":1,"h":32,"text":"YOUR SERVER, YOUR NETWORK, YOUR PRIVACY","w":629,"x":325,"y":568}],"scaledHeight":717,"scaledWidth":1280}}
Configuration
| Action | ParamĂštres | Description |
|---|---|---|
configure | {<params>} | DĂ©finir les paramĂštres de temporisation/affichage Ă lâexĂ©cution |
configure | {reset: true} | Réinitialiser tous les paramÚtres aux valeurs par défaut |
get_timing | Obtenir les paramĂštres actuels de temporisation + affichage |
ContrĂŽle
| Action | ParamĂštres | Description |
|---|---|---|
wait | ms? | Attendre (défaut 500ms) |
health | Ătat de la connexion + infos dâaffichage | |
shutdown | ArrĂȘt gracieux du dĂ©mon |
Authentification
MĂ©thodes dâauthentification VNC prises en charge :
- VNC Auth â dĂ©fi-rĂ©ponse par mot de passe (DES)
- ARD â Apple Remote Desktop (Diffie-Hellman + AES-128-ECB)
macOS est auto-dĂ©tectĂ© via la demande dâidentifiant de type dâauthentification ARD 30. Lorsquâil est dĂ©tectĂ©, les touches Meta sont remappĂ©es sur Super (compatibilitĂ© avec la touche Commande).
[!NOTE] Vous utilisez un Mac bare-metal ? Consultez les Astuces de préparation pour Mac M1 pour le renforcement VNC, le tunneling SSH et des conseils de stabilité de session.
« Claude » est une marque déposée d'Anthropic, PBC. Ce projet n'est ni affilié à , ni soutenu par Anthropic.
Copyright (c) 2026 Riza Emre ARAS â Licence MIT

