Claude KVM

resmi

🤖 ⚡️ MCP server

Dokumentasi

Claude KVM

Claude KVM

Akses Jarak Jauh, Kecerdasan Buatan

claude-kvm.ai

Claude KVM adalah alat MCP yang mengendalikan lingkungan desktop jarak jauh melalui VNC. Alat ini terdiri dari lapisan proksi JS tipis (server MCP) dan daemon VNC Swift asli platform yang berjalan di sistem macOS Anda.

Claude KVM Demo Claude KVM Demo Mac

[!TIP] Phantom-WG bisa menjadi alternatif yang bagus untuk Anda. Isolasi server VNC Anda dalam jaringan Anda sendiri sambil menikmati performa VPN self-hosted dengan fitur privasi tambahan yang Anda dapatkan.

Uji Coba Langsung

[!NOTE] Pengujian dilakukan secara transparan di GitHub Actions — setiap langkah terlihat di lingkungan CI. Di akhir setiap pengujian, baik integrasi berhasil atau gagal, Anda akan menemukan tangkapan layar dari setiap langkah yang diambil agen selama sesi, bersama dengan rekaman video .mp4 yang merekam seluruh sesi. Dengan meninjau rekaman dan tangkapan layar ini, Anda dapat mengamati bagaimana agen berkembang melalui setiap tahap, berapa lama tugas berlangsung, dan keputusan apa yang dibuat berdasarkan prompt sistem. Anda dapat menggunakan contoh-contoh ini sebagai referensi saat menyusun prompt sistem atau instruksi Anda sendiri untuk server MCP di lingkungan Anda sendiri.

[!WARNING] Artefak yang dilampirkan pada proses ini mungkin telah kedaluwarsa karena kebijakan retensi artefak GitHub. Salinan persisten disiapkan melalui alur kerja Persist Artifacts dan selalu dapat diakses berdasarkan ID proses dari direktori artifacts/ di cabang press-kit.

Arsitektur

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

Lapisan

LapisanBahasaPeranKomunikasi
Proksi MCPJavaScript (Node.js)Berkomunikasi dengan Claude melalui protokol MCP, mengelola siklus hidup daemonstdio JSON-RPC
Daemon VNCSwift/C (Apple Silicon)Koneksi VNC, tangkapan layar, injeksi input mouse/keyboardstdin/stdout PC (NDJSON)

Protokol PC (Panggilan Prosedur)

Komunikasi antara proksi dan daemon menggunakan protokol PC melalui 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":{...}}

Penskalaan Koordinat

Resolusi asli server VNC diperkecil agar sesuai dengan --max-dimension (default: 1280px). Claude bekerja lebih konsisten dengan koordinat yang diskalakan — daemon menangani konversi di latar belakang:

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

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

Strategi Layar

Claude meminimalkan biaya token dengan pendekatan verifikasi progresif:

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 menggunakan kerangka Apple Vision untuk OCR pada perangkat. Mengembalikan konten teks dengan koordinat kotak pembatas dalam ruang yang diskalakan — memungkinkan penargetan klik yang tepat tanpa menghabiskan token visi.


Instalasi

Persyaratan

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

Daemon

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

[!NOTE] claude-kvm-daemon dikompilasi dan ditandatangani kode melalui CI (GitHub Actions). Output build dikemas dalam dua format: arsip .tar.gz untuk distribusi Homebrew dan image disk .dmg untuk notarisasi. DMG dikirimkan ke server Apple untuk notarisasi dalam alur kerja yang sama — prosesnya dapat dilacak dari log CI. DMG yang dinotarisasi tersedia sebagai Artefak CI; .tar.gz yang diarsipkan juga diterbitkan sebagai rilis di repositori. Instalasi Homebrew melacak rilis ini.

Konfigurasi MCP

Buat file .mcp.json di direktori proyek Anda:

{
  "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] Alat ini diuji end-to-end melalui CI — Claude menjalankan tugas melalui VNC sementara model visi independen mengamati dan memverifikasi hasilnya. Lihat Uji Integrasi untuk proses alur kerja langsung, prompt sistem, dan rekaman demo.

Konfigurasi

Proksi MCP (ENV)

ParameterDefaultDeskripsi
VNC_HOST127.0.0.1Alamat server VNC
VNC_PORT5900Nomor port VNC
VNC_USERNAMENama pengguna (diperlukan untuk ARD)
VNC_PASSWORDKata sandi
CLAUDE_KVM_DAEMON_PATHclaude-kvm-daemonJalur biner daemon (tidak diperlukan jika sudah ada di PATH)
CLAUDE_KVM_DAEMON_PARAMETERSArgumen CLI tambahan untuk daemon

Parameter Daemon (CLI)

Argumen tambahan yang diteruskan ke daemon melalui CLAUDE_KVM_DAEMON_PARAMETERS:

"CLAUDE_KVM_DAEMON_PARAMETERS": "--max-dimension 800 -v"
ParameterDefaultDeskripsi
--max-dimension1280Dimensi penskalaan tampilan maksimum (px)
--connect-timeoutBatas waktu koneksi VNC (detik)
--bits-per-sampleBit per sampel piksel
--no-reconnectNonaktifkan koneksi ulang otomatis
-v, --verboseLog verbose (stderr)

Konfigurasi Runtime (PC)

Semua parameter waktu dan tampilan dapat dikonfigurasi saat runtime melalui metode configure. Gunakan get_timing untuk memeriksa nilai saat ini.

Atur waktu:

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

Ubah penskalaan tampilan:

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

Atur ulang ke default:

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

Dapatkan nilai saat ini:

{"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}}
ParameterDefaultDeskripsi
max_dimension1280Dimensi tangkapan layar maks
cursor_crop_radius150Radius potong kursor (px)
click_hold_ms50Durasi tahan klik
double_click_gap_ms50Jeda jeda klik ganda
hover_settle_ms400Tunggu hover settle
drag_position_ms30Tunggu posisi pra-seret
drag_press_ms50Ambang tahan tekan seret
drag_step_ms5Antara titik interpolasi
drag_settle_ms30Settle sebelum lepas
drag_pixels_per_step20Kepadatan titik per piksel
drag_min_steps10Langkah interpolasi min
scroll_press_ms10Jeda tekan-lepas gulir
scroll_tick_ms20Jeda antar-tik
key_hold_ms30Durasi tahan tombol
combo_mod_ms10Jeda settle pengubah
type_key_ms20Tahan tombol saat mengetik
type_inter_key_ms20Jeda antar-karakter
type_shift_ms10Settle tombol shift
paste_settle_ms30Tunggu pasca-tulis papan klip

Alat

Semua operasi dilakukan melalui satu alat vnc_command:

Layar

AksiParameterDeskripsi
screenshotTangkapan layar penuh PNG
cursor_cropPotong di sekitar kursor dengan overlay crosshair
diff_checkDeteksi perubahan layar terhadap baseline
set_baselineSimpan layar saat ini sebagai referensi diff

Mouse

AksiParameterDeskripsi
mouse_clickx, y, button?Klik (kiri|kanan|tengah)
mouse_double_clickx, yKlik ganda
mouse_movex, yPindahkan kursor
hoverx, yPindahkan + tunggu settle
nudgedx, dyPergerakan kursor relatif
mouse_dragx, y, toX, toYSeret dari awal ke akhir
scrollx, y, direction, amount?Gulir (atas|bawah|kiri|kanan)

Keyboard

AksiParameterDeskripsi
key_tapkeyTekan tombol tunggal (enter|escape|tab|spasi|...)
key_combokey atau keysKombo pengubah ("cmd+c" atau ["cmd","shift","3"])
key_typetextKetik teks karakter demi karakter
pastetextTempel teks melalui papan klip

Deteksi

AksiParameterDeskripsi
detect_elementsDeteksi teks OCR dengan kotak pembatas (Apple Vision)

Mengembalikan elemen teks dengan koordinat kotak pembatas dalam ruang yang diskalakan:

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

Konfigurasi

AksiParameterDeskripsi
configure{<params>}Atur parameter waktu/tampilan saat runtime
configure{reset: true}Atur ulang semua parameter ke default
get_timingDapatkan parameter waktu + tampilan saat ini

Kontrol

AksiParameterDeskripsi
waitms?Tunggu (default 500ms)
healthStatus koneksi + info tampilan
shutdownMatikan daemon dengan anggun

Autentikasi

Metode autentikasi VNC yang didukung:

  • VNC Auth — challenge-response berbasis kata sandi (DES)
  • ARD — Apple Remote Desktop (Diffie-Hellman + AES-128-ECB)

macOS terdeteksi otomatis melalui permintaan kredensial ARD tipe auth 30. Saat terdeteksi, tombol Meta dipetakan ulang ke Super (kompatibilitas tombol Command).


MCP Badge

[!NOTE] Berjalan di Mac bare-metal? Lihat Trik Persiapan Mac M1 untuk pengamanan VNC, tunneling SSH, dan tips stabilitas sesi.


"Claude" adalah merek dagang dari Anthropic, PBC. Proyek ini tidak berafiliasi dengan atau didukung oleh Anthropic.

Hak Cipta (c) 2026 Riza Emre ARAS — Lisensi MIT