Claude KVM

officiel

đŸ€– âšĄïž Serveur MCP (ïŁż MacOS) — contrĂŽle des bureaux distants via VNC

Que pouvez-vous faire avec Claude KVM MCP ?

  • Capturer et inspecter l'Ă©cran distant — Demandez une screenshot complĂšte ou un cursor_crop autour du pointeur de la souris pour voir l'Ă©tat actuel du bureau.
  • DĂ©tecter le texte et les Ă©lĂ©ments d'interface Ă  l'Ă©cran — ExĂ©cutez detect_elements pour obtenir du texte OCR avec des coordonnĂ©es de boĂźtes englobantes, permettant un ciblage prĂ©cis des clics sans consommer de jetons de vision.
  • ContrĂŽler la souris et le clavier Ă  distance — ExĂ©cutez mouse_click, mouse_drag, key_type, key_combo ou paste pour interagir avec les applications sur la machine cible.
  • VĂ©rifier efficacement les changements visuels — Utilisez diff_check pour dĂ©tecter si l'Ă©cran a changĂ© par rapport Ă  un set_baseline sauvegardĂ©, Ă©vitant ainsi les transferts d'images complets inutiles.
  • Ajuster le timing et la mise Ă  l'Ă©chelle de l'affichage en cours d'exĂ©cution — Appelez configure pour rĂ©gler les dĂ©lais de maintien du clic, l'interpolation du glissement ou max_dimension pour diffĂ©rents environnements VNC.

Documentation

Claude KVM

Claude KVM

AccĂšs Ă  distance, Intelligence Artificielle

claude-kvm.ai

Claude KVM est un outil MCP qui contrÎle des environnements de bureau à distance via VNC. Il se compose d'une fine couche proxy JS (serveur MCP) et d'un démon VNC natif Swift s'exécutant sur votre systÚme macOS.

Claude KVM Demo Claude KVM Demo Mac

[!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 conditions réelles

[!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 entreprise par l'agent durant la session, ainsi qu'un enregistrement vidĂ©o .mp4 qui capture l'intĂ©gralitĂ© de la session. 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 sont toujours accessibles 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

CoucheLangageRĂŽleCommunication
Proxy MCPJavaScript (Node.js)Communique avec Claude via le protocole MCP, gÚre le cycle de vie du démonstdio JSON-RPC
Démon VNCSwift/C (Apple Silicon)Connexion VNC, capture d'écran, injection d'entrées souris/clavierstdin/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 s'adapter Ă  --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-daemon est compilĂ© et signĂ© numĂ©riquement via CI (GitHub Actions). La sortie de construction est empaquetĂ©e en deux formats : une archive .tar.gz pour la distribution Homebrew et une image disque .dmg pour 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 notariĂ© est disponible en tant qu'artefact CI ; l'archive .tar.gz est Ă©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ÚtreDéfautDescription
VNC_HOST127.0.0.1Adresse du serveur VNC
VNC_PORT5900Numéro de port VNC
VNC_USERNAMENom d'utilisateur (requis pour ARD)
VNC_PASSWORDMot de passe
CLAUDE_KVM_DAEMON_PATHclaude-kvm-daemonChemin du binaire du démon (inutile si déjà dans le PATH)
CLAUDE_KVM_DAEMON_PARAMETERSArguments 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ÚtreDéfautDescription
--max-dimension1280Dimension maximale de mise à l'échelle de l'affichage (px)
--connect-timeoutDélai de connexion VNC (secondes)
--bits-per-sampleBits par échantillon de pixel
--no-reconnectDésactiver la reconnexion automatique
-v, --verboseJournalisation verbeuse (stderr)

Configuration d'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ÚtreDéfautDescription
max_dimension1280Dimension max de capture d'écran
cursor_crop_radius150Rayon de recadrage du curseur (px)
click_hold_ms50Durée de maintien du clic
double_click_gap_ms50Délai entre deux clics
hover_settle_ms400Attente de stabilisation du survol
drag_position_ms30Attente de position avant glissement
drag_press_ms50Seuil de maintien pour appui glissement
drag_step_ms5Entre les points d'interpolation
drag_settle_ms30Stabilisation avant relĂąchement
drag_pixels_per_step20Densité de points par pixel
drag_min_steps10Étapes d'interpolation min
scroll_press_ms10Intervalle appui-relùchement défilement
scroll_tick_ms20Délai inter-tic
key_hold_ms30Durée de maintien de touche
combo_mod_ms10Délai de stabilisation du modificateur
type_key_ms20Maintien de touche pendant la frappe
type_inter_key_ms20Délai inter-caractÚres
type_shift_ms10Stabilisation touche Maj
paste_settle_ms30Attente aprÚs écriture dans le presse-papiers

Outils

Toutes les opérations sont effectuées via un seul outil vnc_command :

Écran

ActionParamĂštresDescription
screenshotCapture PNG plein écran
cursor_cropRecadrage autour du curseur avec superposition de réticule
diff_checkDétecter les changements d'écran par rapport à la référence
set_baselineSauvegarder l'écran actuel comme référence de diff

Souris

ActionParamĂštresDescription
mouse_clickx, y, button?Clic (gauche|droit|milieu)
mouse_double_clickx, yDouble clic
mouse_movex, yDéplacer le curseur
hoverx, yDéplacer + attente de stabilisation
nudgedx, dyMouvement relatif du curseur
mouse_dragx, y, toX, toYGlisser du début à la fin
scrollx, y, direction, amount?Défilement (haut|bas|gauche|droite)

Clavier

ActionParamĂštresDescription
key_tapkeyAppui sur une touche simple (entrée|échap|tab|espace|...)
key_combokey ou keysCombinaison de modificateurs ("cmd+c" ou ["cmd","shift","3"])
key_typetextSaisir du texte caractĂšre par caractĂšre
pastetextColler du texte via le presse-papiers

Détection

ActionParamĂštresDescription
detect_elementsDé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

ActionParamĂštresDescription
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_timingObtenir les paramĂštres actuels de temporisation + affichage

ContrĂŽle

ActionParamĂštresDescription
waitms?Attendre (défaut 500ms)
healthStatut de la connexion + infos d'affichage
shutdownArrĂȘt gracieux du dĂ©mon

Authentification

Méthodes d'authentification VNC prises en charge :

  • VNC Auth — dĂ©fi-rĂ©ponse basĂ© sur mot de passe (DES)
  • ARD — Apple Remote Desktop (Diffie-Hellman + AES-128-ECB)

macOS est auto-détecté via la demande d'identification de type 30 ARD. Lorsqu'il est détecté, les touches Meta sont remappées sur Super (compatibilité avec la touche Commande).


MCP Badge

[!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 pas affilié à ni soutenu par Anthropic.

Copyright (c) 2026 Riza Emre ARAS — Licence MIT