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