Claude KVM

officiel

đŸ€– âšĄïž Serveur MCP (ïŁż MacOS) — contrĂŽle des bureaux distants via 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 en 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 direct

[!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 .mp4 qui 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

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 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-daemon est compilĂ© et signĂ© via CI (GitHub Actions). La sortie de construction est empaquetĂ©e dans 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 notarisĂ© 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 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 Ă  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Ú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 glisser
drag_press_ms50Seuil de maintien pour appui glisser
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_ms10Écart 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)
healthÉtat 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 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).


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

Copyright (c) 2026 Riza Emre ARAS — Licence MIT