Claude KVM

oficial

🤖 ⚡️ MCP server ( MacOS) — controlar escritor

Documentación

Claude KVM

Claude KVM

Acceso Remoto, Inteligencia Artificial

claude-kvm.ai

Claude KVM es una herramienta MCP que controla entornos de escritorio remotos a través de VNC. Consiste en una capa proxy ligera en JS (servidor MCP) y un demonio VNC nativo de plataforma en Swift que se ejecuta en tu sistema macOS.

Claude KVM Demo Claude KVM Demo Mac

[!TIP] Phantom-WG podría ser una gran alternativa para ti. Aísla tu servidor VNC dentro de tu propia red mientras disfrutas del rendimiento de una VPN autoalojada con las características adicionales de privacidad que obtienes en el proceso.

Pruebas en Vivo

[!NOTE] Las pruebas se realizan de forma transparente en GitHub Actions — cada paso es visible en el entorno de CI. Al final de cada prueba, ya sea que la integración pase o falle, encontrarás capturas de pantalla de cada paso que el agente tomó durante la sesión, junto con una grabación de video .mp4 que captura toda la sesión. Al revisar estas grabaciones y capturas de pantalla, puedes observar cómo el agente progresó a través de cada etapa, cuánto tiempo tomó la tarea y qué decisiones se tomaron basándose en el prompt del sistema. Puedes usar estos ejemplos como referencia al crear tus propios prompts de sistema o instrucciones para el servidor MCP en tu propio entorno.

[!WARNING] Los artefactos adjuntos a estas ejecuciones pueden haber expirado debido a la política de retención de artefactos de GitHub. Se preparan copias persistentes a través del flujo de trabajo Persist Artifacts y siempre se puede acceder a ellas por ID de ejecución desde el directorio artifacts/ en la rama press-kit.

Arquitectura

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

Capas

CapaLenguajeRolComunicación
Proxy MCPJavaScript (Node.js)Se comunica con Claude a través del protocolo MCP, gestiona el ciclo de vida del demoniostdio JSON-RPC
Demonio VNCSwift/C (Apple Silicon)Conexión VNC, captura de pantalla, inyección de entrada de ratón/tecladostdin/stdout PC (NDJSON)

Protocolo PC (Llamada a Procedimiento)

La comunicación entre el proxy y el demonio utiliza el protocolo PC sobre 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":{...}}

Escalado de Coordenadas

La resolución nativa del servidor VNC se reduce para ajustarse dentro de --max-dimension (por defecto: 1280px). Claude trabaja de manera más consistente con coordenadas escaladas — el demonio maneja la conversión en segundo plano:

Native:  4220 x 2568  (VNC server framebuffer)
Scaled:  1280 x 779   (what Claude sees and targets)

mouse_click(640, 400) → VNC receives (2110, 1284)

Estrategia de Pantalla

Claude minimiza el costo de tokens con un enfoque de verificación progresiva:

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 utiliza el framework Apple Vision para OCR en el dispositivo. Devuelve contenido de texto con coordenadas de cuadro delimitador en espacio escalado — permite apuntar con precisión sin consumir tokens de visión.


Instalación

Requisitos

  • macOS (Apple Silicon / aarch64)
  • Node.js (LTS)

Demonio

brew tap ARAS-Workspace/tap
brew install claude-kvm-daemon

[!NOTE] claude-kvm-daemon se compila y firma mediante CI (GitHub Actions). La salida de la compilación se empaqueta en dos formatos: un archivo .tar.gz para distribución Homebrew y una imagen de disco .dmg para notarización. El DMG se envía a los servidores de Apple para notarización dentro del mismo flujo de trabajo — el proceso se puede rastrear desde los registros de CI. El DMG notarizado está disponible como un Artefacto de CI; el .tar.gz archivado también se publica como una versión en el repositorio. La instalación de Homebrew rastrea esta versión.

Configuración MCP

Crea un archivo .mcp.json en el directorio de tu proyecto:

{
  "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] La herramienta se prueba de extremo a extremo a través de CI — Claude ejecuta tareas sobre VNC mientras un modelo de visión independiente observa y verifica los resultados. Consulta la Prueba de Integración para ejecuciones de flujo de trabajo en vivo, prompts de sistema y grabaciones de demostración.

Configuración

Proxy MCP (ENV)

ParámetroPredeterminadoDescripción
VNC_HOST127.0.0.1Dirección del servidor VNC
VNC_PORT5900Número de puerto VNC
VNC_USERNAMENombre de usuario (requerido para ARD)
VNC_PASSWORDContraseña
CLAUDE_KVM_DAEMON_PATHclaude-kvm-daemonRuta del binario del demonio (no necesaria si ya está en PATH)
CLAUDE_KVM_DAEMON_PARAMETERSArgumentos CLI adicionales para el demonio

Parámetros del Demonio (CLI)

Argumentos adicionales pasados al demonio a través de CLAUDE_KVM_DAEMON_PARAMETERS:

"CLAUDE_KVM_DAEMON_PARAMETERS": "--max-dimension 800 -v"
ParámetroPredeterminadoDescripción
--max-dimension1280Dimensión máxima de escalado de pantalla (px)
--connect-timeoutTiempo de espera de conexión VNC (segundos)
--bits-per-sampleBits por muestra de píxel
--no-reconnectDeshabilitar reconexión automática
-v, --verboseRegistro detallado (stderr)

Configuración en Tiempo de Ejecución (PC)

Todos los parámetros de temporización y visualización son configurables en tiempo de ejecución a través del método configure. Usa get_timing para inspeccionar los valores actuales.

Establecer temporización:

{"method":"configure","params":{"click_hold_ms":80,"key_hold_ms":50}}
{"result":{"detail":"OK — changed: click_hold_ms, key_hold_ms"}}

Cambiar escalado de pantalla:

{"method":"configure","params":{"max_dimension":960}}
{"result":{"detail":"OK — changed: max_dimension","scaledWidth":960,"scaledHeight":584}}

Restablecer a valores predeterminados:

{"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}}

Obtener valores actuales:

{"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}}
ParámetroPredeterminadoDescripción
max_dimension1280Dimensión máxima de captura de pantalla
cursor_crop_radius150Radio de recorte del cursor (px)
click_hold_ms50Duración de pulsación de clic
double_click_gap_ms50Retardo entre doble clic
hover_settle_ms400Espera de asentamiento al pasar el cursor
drag_position_ms30Espera de posición previa al arrastre
drag_press_ms50Umbral de pulsación para arrastre
drag_step_ms5Entre puntos de interpolación
drag_settle_ms30Asentamiento antes de soltar
drag_pixels_per_step20Densidad de puntos por píxel
drag_min_steps10Pasos mínimos de interpolación
scroll_press_ms10Intervalo de pulsación-liberación de desplazamiento
scroll_tick_ms20Retardo entre ticks
key_hold_ms30Duración de pulsación de tecla
combo_mod_ms10Retardo de asentamiento de modificador
type_key_ms20Pulsación de tecla durante escritura
type_inter_key_ms20Retardo entre caracteres
type_shift_ms10Asentamiento de tecla Shift
paste_settle_ms30Espera posterior a escritura en portapapeles

Herramientas

Todas las operaciones se realizan a través de una única herramienta vnc_command:

Pantalla

AcciónParámetrosDescripción
screenshotCaptura PNG de pantalla completa
cursor_cropRecorte alrededor del cursor con superposición de punto de mira
diff_checkDetectar cambios en pantalla contra línea base
set_baselineGuardar pantalla actual como referencia de diferencias

Ratón

AcciónParámetrosDescripción
mouse_clickx, y, button?Clic (izquierdo|derecho|medio)
mouse_double_clickx, yDoble clic
mouse_movex, yMover cursor
hoverx, yMover + espera de asentamiento
nudgedx, dyMovimiento relativo del cursor
mouse_dragx, y, toX, toYArrastrar de inicio a fin
scrollx, y, direction, amount?Desplazar (arriba|abajo|izquierda|derecha)

Teclado

AcciónParámetrosDescripción
key_tapkeyPulsación de tecla única (enter|escape|tab|space|...)
key_combokey o keysCombinación de modificador ("cmd+c" o ["cmd","shift","3"])
key_typetextEscribir texto carácter por carácter
pastetextPegar texto a través del portapapeles

Detección

AcciónParámetrosDescripción
detect_elementsDetección de texto OCR con cuadros delimitadores (Apple Vision)

Devuelve elementos de texto con coordenadas de cuadro delimitador en espacio escalado:

{"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}}

Configuración

AcciónParámetrosDescripción
configure{<params>}Establecer parámetros de temporización/visualización en tiempo de ejecución
configure{reset: true}Restablecer todos los parámetros a valores predeterminados
get_timingObtener parámetros actuales de temporización + visualización

Control

AcciónParámetrosDescripción
waitms?Esperar (predeterminado 500ms)
healthEstado de conexión + información de pantalla
shutdownApagado ordenado del demonio

Autenticación

Métodos de autenticación VNC soportados:

  • VNC Auth — desafío-respuesta basado en contraseña (DES)
  • ARD — Apple Remote Desktop (Diffie-Hellman + AES-128-ECB)

macOS se detecta automáticamente a través de la solicitud de credencial de tipo de autenticación ARD 30. Cuando se detecta, las teclas Meta se reasignan a Super (compatibilidad con tecla Command).


MCP Badge

[!NOTE] ¿Ejecutándose en un Mac con hardware dedicado? Consulte los Trucos de preparación para Mac M1 para obtener consejos sobre refuerzo de VNC, tunelización SSH y estabilidad de la sesión.


"Claude" es una marca registrada de Anthropic, PBC. Este proyecto no está afiliado ni respaldado por Anthropic.

Copyright (c) 2026 Riza Emre ARAS — Licencia MIT