Claude KVM
๊ณต์๐ค โก๏ธ MCP ์๋ฒ (๏ฃฟ MacOS) โ VNC๋ฅผ ํตํด ์๊ฒฉ ๋ฐ์คํฌํฑ ์ ์ด
Claude KVM MCP(์ผ)๋ก ๋ฌด์์ ํ ์ ์๋์?
- ์๊ฒฉ ํ๋ฉด ์บก์ฒ ๋ฐ ๊ฒ์ฌ โ ๋ง์ฐ์ค ํฌ์ธํฐ ์ฃผ๋ณ์ ์ ์ฒด
screenshot๋๋cursor_crop์ ์์ฒญํ์ฌ ํ์ฌ ๋ฐ์คํฌํฑ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. - ํ๋ฉด์์ ํ
์คํธ ๋ฐ UI ์์ ๊ฐ์ง โ
detect_elements๋ฅผ ์คํํ์ฌ ๊ฒฝ๊ณ ์์ ์ขํ๊ฐ ํฌํจ๋ OCR ํ ์คํธ๋ฅผ ์ป์ต๋๋ค. ์ด๋ฅผ ํตํด ๋น์ ํ ํฐ์ ์๋ชจํ์ง ์๊ณ ์ ํํ ํด๋ฆญ ํ๊ฒํ ์ด ๊ฐ๋ฅํฉ๋๋ค. - ๋ง์ฐ์ค ๋ฐ ํค๋ณด๋ ์๊ฒฉ ์ ์ด โ
mouse_click,mouse_drag,key_type,key_combo๋๋paste๋ฅผ ์คํํ์ฌ ๋์ ๋จธ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ์์ฉํฉ๋๋ค. - ์๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ ํจ์จ์ ์ผ๋ก ํ์ธ โ
diff_check๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅ๋set_baseline๊ณผ ํ๋ฉด์ด ๋ณ๊ฒฝ๋์๋์ง ๊ฐ์งํ์ฌ ๋ถํ์ํ ์ ์ฒด ์ด๋ฏธ์ง ์ ์ก์ ๋ฐฉ์งํฉ๋๋ค. - ๋ฐํ์์ ํ์ด๋ฐ ๋ฐ ๋์คํ๋ ์ด ์ค์ผ์ผ ์กฐ์ โ
configure๋ฅผ ํธ์ถํ์ฌ ๋ค์ํ VNC ํ๊ฒฝ์ ๋ง๊ฒ ํด๋ฆญ ์ ์ง ์ง์ฐ, ๋๋๊ทธ ๋ณด๊ฐ ๋๋max_dimension์ ์กฐ์ ํฉ๋๋ค.
๋ฌธ์
Claude KVM
์๊ฒฉ ์ ๊ทผ, ์ธ๊ณต์ง๋ฅ
Claude KVM์ VNC๋ฅผ ํตํด ์๊ฒฉ ๋ฐ์คํฌํฑ ํ๊ฒฝ์ ์ ์ดํ๋ MCP ๋๊ตฌ์ ๋๋ค. ์์ JS ํ๋ก์ ๊ณ์ธต(MCP ์๋ฒ)๊ณผ macOS ์์คํ ์์ ์คํ๋๋ ํ๋ซํผ ๋ค์ดํฐ๋ธ Swift VNC ๋ฐ๋ชฌ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
[!TIP] Phantom-WG๊ฐ ํ๋ฅญํ ๋์์ด ๋ ์ ์์ต๋๋ค. ์์ฒด ํธ์คํ VPN ์ฑ๋ฅ๊ณผ ์ถ๊ฐ์ ์ธ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ธฐ๋ฅ์ ๋๋ฆฌ๋ฉด์ ์์ฒด ๋คํธ์ํฌ ๋ด์ VNC ์๋ฒ๋ฅผ ๊ฒฉ๋ฆฌํ์ธ์.
์ค์๊ฐ ํ ์คํธ ์คํ
- ํตํฉ ํ ์คํธ
- Mac ํตํฉ ํ ์คํธ
- Mac ๊ณ์ฐ๊ธฐ ํ ์คํธ
- Mac ๊ณตํ์ฉ ๊ณ์ฐ๊ธฐ ํ ์คํธ
- Mac Safari ๋ธ๋ผ์ฐ์ง ํ ์คํธ
- Mac ๋๋๊ทธ ์ค ๋๋กญ ํ ์คํธ
- Mac ์ฒด์ค ํ ์คํธ
- Mac ์ฒด์ค ์ง์ ํ ์คํธ
- Mac Phantom-WG ์ค์น ํ ์คํธ
[!NOTE] ํ ์คํธ๋ GitHub Actions์์ ํฌ๋ช ํ๊ฒ ์ํ๋๋ฉฐ, CI ํ๊ฒฝ์์ ๊ฐ ๋จ๊ณ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ๋ชจ๋ ํ ์คํธ๊ฐ ๋๋๋ฉด ํตํฉ ํ ์คํธ ํต๊ณผ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์์ด์ ํธ๊ฐ ์ธ์ ์ค ์ํํ ๊ฐ ๋จ๊ณ์ ์คํฌ๋ฆฐ์ท๊ณผ ์ ์ฒด ์ธ์ ์ ์บก์ฒํ
.mp4๋น๋์ค ๋ นํ๋ณธ์ ์ฐพ์ ์ ์์ต๋๋ค. ์ด ๋ นํ๋ณธ๊ณผ ์คํฌ๋ฆฐ์ท์ ๊ฒํ ํ๋ฉด ์์ด์ ํธ๊ฐ ๊ฐ ๋จ๊ณ๋ฅผ ์ด๋ป๊ฒ ์งํํ๋์ง, ์์ ์ ์์๋ ์๊ฐ, ์์คํ ํ๋กฌํํธ์ ๋ฐ๋ผ ์ด๋ค ๊ฒฐ์ ์ ๋ด๋ ธ๋์ง ๊ด์ฐฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์๋ ์์ฒด ํ๊ฒฝ์์ MCP ์๋ฒ๋ฅผ ์ํ ์์คํ ํ๋กฌํํธ๋ ์ง์นจ์ ์์ฑํ ๋ ์ฐธ๊ณ ์๋ฃ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
[!WARNING] GitHub์ ์ํฐํฉํธ ๋ณด์กด ์ ์ฑ ์ผ๋ก ์ธํด ์ด ์คํ์ ์ฒจ๋ถ๋ ์ํฐํฉํธ๊ฐ ๋ง๋ฃ๋์์ ์ ์์ต๋๋ค. ์๊ตฌ ์ฌ๋ณธ์ ์ํฐํฉํธ ๋ณด์กด ์ํฌํ๋ก์ฐ๋ฅผ ํตํด ์ค๋น๋๋ฉฐ, press-kit ๋ธ๋์น์
artifacts/๋๋ ํฐ๋ฆฌ์์ ์คํ ID๋ก ํญ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ํคํ ์ฒ
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
๊ณ์ธต
| ๊ณ์ธต | ์ธ์ด | ์ญํ | ํต์ ๋ฐฉ์ |
|---|---|---|---|
| MCP ํ๋ก์ | JavaScript (Node.js) | MCP ํ๋กํ ์ฝ์ ํตํด Claude์ ํต์ , ๋ฐ๋ชฌ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ | stdio JSON-RPC |
| VNC ๋ฐ๋ชฌ | Swift/C (Apple Silicon) | VNC ์ฐ๊ฒฐ, ํ๋ฉด ์บก์ฒ, ๋ง์ฐ์ค/ํค๋ณด๋ ์ ๋ ฅ ์ฃผ์ | stdin/stdout PC (NDJSON) |
PC (ํ๋ก์์ ํธ์ถ) ํ๋กํ ์ฝ
ํ๋ก์์ ๋ฐ๋ชฌ ๊ฐ์ ํต์ ์ NDJSON์ ํตํ PC ํ๋กํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค:
Request: {"method":"<name>","params":{...},"id":<int|string>}
Response: {"result":{...},"id":<int|string>}
Error: {"error":{"code":<int>,"message":"..."},"id":<int|string>}
Notification: {"method":"<name>","params":{...}}
์ขํ ์ค์ผ์ผ๋ง
VNC ์๋ฒ์ ๊ธฐ๋ณธ ํด์๋๋ --max-dimension(๊ธฐ๋ณธ๊ฐ: 1280px) ๋ด์ ๋ง๋๋ก ์ถ์๋ฉ๋๋ค. Claude๋ ์ค์ผ์ผ๋ง๋ ์ขํ์์ ๋ ์ผ๊ด๋๊ฒ ์๋ํ๋ฉฐ, ๋ฐ๋ชฌ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ณํ์ ์ฒ๋ฆฌํฉ๋๋ค:
Native: 4220 x 2568 (VNC server framebuffer)
Scaled: 1280 x 779 (what Claude sees and targets)
mouse_click(640, 400) โ VNC receives (2110, 1284)
ํ๋ฉด ์ ๋ต
Claude๋ ์ ์ง์ ๊ฒ์ฆ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ํ ํฐ ๋น์ฉ์ ์ต์ํํฉ๋๋ค:
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๋ ์จ๋๋ฐ์ด์ค OCR์ ์ํด Apple Vision ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค์ผ์ผ๋ง๋ ๊ณต๊ฐ์์ ๊ฒฝ๊ณ ์์ ์ขํ์ ํจ๊ป ํ
์คํธ ์ฝํ
์ธ ๋ฅผ ๋ฐํํ์ฌ ๋น์ ํ ํฐ์ ์๋นํ์ง ์๊ณ ์ ๋ฐํ ํด๋ฆญ ํ๊ฒํ
์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ค์น
์๊ตฌ ์ฌํญ
- macOS (Apple Silicon / aarch64)
- Node.js (LTS)
๋ฐ๋ชฌ
brew tap ARAS-Workspace/tap
brew install claude-kvm-daemon
[!NOTE]
claude-kvm-daemon์ CI(GitHub Actions)๋ฅผ ํตํด ์ปดํ์ผ ๋ฐ ์ฝ๋ ์๋ช ๋ฉ๋๋ค. ๋น๋ ์ถ๋ ฅ๋ฌผ์ Homebrew ๋ฐฐํฌ์ฉ.tar.gz์์นด์ด๋ธ์ ๊ณต์ฆ์ฉ.dmg๋์คํฌ ์ด๋ฏธ์ง์ ๋ ๊ฐ์ง ํ์์ผ๋ก ํจํค์ง๋ฉ๋๋ค. DMG๋ ๋์ผํ ์ํฌํ๋ก์ฐ ๋ด์์ ๊ณต์ฆ์ ์ํด Apple ์๋ฒ์ ์ ์ถ๋๋ฉฐ, CI ๋ก๊ทธ์์ ๊ณผ์ ์ ์ถ์ ํ ์ ์์ต๋๋ค. ๊ณต์ฆ๋ DMG๋ CI ์ํฐํฉํธ๋ก ์ ๊ณต๋๋ฉฐ, ๋ณด๊ด๋.tar.gz๋ ์ ์ฅ์์ ๋ฆด๋ฆฌ์ค๋ก ๊ฒ์๋ฉ๋๋ค. Homebrew ์ค์น๋ ์ด ๋ฆด๋ฆฌ์ค๋ฅผ ์ถ์ ํฉ๋๋ค.
MCP ๊ตฌ์ฑ
ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ์ .mcp.json ํ์ผ์ ์์ฑํฉ๋๋ค:
{
"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] ์ด ๋๊ตฌ๋ CI๋ฅผ ํตํด ์๋ํฌ์๋ ํ ์คํธ๋ฉ๋๋ค. Claude๊ฐ VNC๋ฅผ ํตํด ์์ ์ ์คํํ๋ ๋์ ๋ ๋ฆฝ์ ์ธ ๋น์ ๋ชจ๋ธ์ด ๊ฒฐ๊ณผ๋ฅผ ๊ด์ฐฐํ๊ณ ๊ฒ์ฆํฉ๋๋ค. ์ค์๊ฐ ์ํฌํ๋ก์ฐ ์คํ, ์์คํ ํ๋กฌํํธ ๋ฐ ๋ฐ๋ชจ ๋ นํ๋ณธ์ ํตํฉ ํ ์คํธ๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ตฌ์ฑ
MCP ํ๋ก์ (ENV)
| ๋งค๊ฐ๋ณ์ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|
VNC_HOST | 127.0.0.1 | VNC ์๋ฒ ์ฃผ์ |
VNC_PORT | 5900 | VNC ํฌํธ ๋ฒํธ |
VNC_USERNAME | ์ฌ์ฉ์ ์ด๋ฆ (ARD์ ํ์) | |
VNC_PASSWORD | ๋น๋ฐ๋ฒํธ | |
CLAUDE_KVM_DAEMON_PATH | claude-kvm-daemon | ๋ฐ๋ชฌ ๋ฐ์ด๋๋ฆฌ ๊ฒฝ๋ก (PATH์ ์ด๋ฏธ ์์ผ๋ฉด ๋ถํ์) |
CLAUDE_KVM_DAEMON_PARAMETERS | ๋ฐ๋ชฌ์ ๋ํ ์ถ๊ฐ CLI ์ธ์ |
๋ฐ๋ชฌ ๋งค๊ฐ๋ณ์ (CLI)
CLAUDE_KVM_DAEMON_PARAMETERS์ ํตํด ๋ฐ๋ชฌ์ ์ ๋ฌ๋๋ ์ถ๊ฐ ์ธ์:
"CLAUDE_KVM_DAEMON_PARAMETERS": "--max-dimension 800 -v"
| ๋งค๊ฐ๋ณ์ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|
--max-dimension | 1280 | ์ต๋ ๋์คํ๋ ์ด ์ค์ผ์ผ๋ง ํฌ๊ธฐ (px) |
--connect-timeout | VNC ์ฐ๊ฒฐ ํ์์์ (์ด) | |
--bits-per-sample | ํฝ์ ๋น ๋นํธ ์ํ | |
--no-reconnect | ์๋ ์ฌ์ฐ๊ฒฐ ๋นํ์ฑํ | |
-v, --verbose | ์์ธ ๋ก๊น (stderr) |
๋ฐํ์ ๊ตฌ์ฑ (PC)
๋ชจ๋ ํ์ด๋ฐ ๋ฐ ๋์คํ๋ ์ด ๋งค๊ฐ๋ณ์๋ configure ๋ฉ์๋๋ฅผ ํตํด ๋ฐํ์์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ํ์ฌ ๊ฐ์ ๊ฒ์ฌํ๋ ค๋ฉด get_timing์ ์ฌ์ฉํ์ธ์.
ํ์ด๋ฐ ์ค์ :
{"method":"configure","params":{"click_hold_ms":80,"key_hold_ms":50}}
{"result":{"detail":"OK โ changed: click_hold_ms, key_hold_ms"}}
๋์คํ๋ ์ด ์ค์ผ์ผ๋ง ๋ณ๊ฒฝ:
{"method":"configure","params":{"max_dimension":960}}
{"result":{"detail":"OK โ changed: max_dimension","scaledWidth":960,"scaledHeight":584}}
๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ค์ :
{"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}}
ํ์ฌ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ:
{"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}}
| ๋งค๊ฐ๋ณ์ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|
max_dimension | 1280 | ์ต๋ ์คํฌ๋ฆฐ์ท ํฌ๊ธฐ |
cursor_crop_radius | 150 | ์ปค์ ์๋ฅด๊ธฐ ๋ฐ๊ฒฝ (px) |
click_hold_ms | 50 | ํด๋ฆญ ์ ์ง ์๊ฐ |
double_click_gap_ms | 50 | ๋๋ธ ํด๋ฆญ ๊ฐ๊ฒฉ ์ง์ฐ |
hover_settle_ms | 400 | ํธ๋ฒ ์ ์ฐฉ ๋๊ธฐ |
drag_position_ms | 30 | ๋๋๊ทธ ์ ์์น ๋๊ธฐ |
drag_press_ms | 50 | ๋๋๊ทธ ๋๋ฆ ์ ์ง ์๊ณ๊ฐ |
drag_step_ms | 5 | ๋ณด๊ฐ ์ง์ ์ฌ์ด |
drag_settle_ms | 30 | ํด์ ์ ์ ์ฐฉ |
drag_pixels_per_step | 20 | ํฝ์ ๋น ์ง์ ๋ฐ๋ |
drag_min_steps | 10 | ์ต์ ๋ณด๊ฐ ๋จ๊ณ |
scroll_press_ms | 10 | ์คํฌ๋กค ๋๋ฆ-ํด์ ๊ฐ๊ฒฉ |
scroll_tick_ms | 20 | ํฑ ๊ฐ ์ง์ฐ |
key_hold_ms | 30 | ํค ์ ์ง ์๊ฐ |
combo_mod_ms | 10 | ์์ ์ ์ ์ฐฉ ์ง์ฐ |
type_key_ms | 20 | ํ์ดํ ์ค ํค ์ ์ง |
type_inter_key_ms | 20 | ๋ฌธ์ ๊ฐ ์ง์ฐ |
type_shift_ms | 10 | Shift ํค ์ ์ฐฉ |
paste_settle_ms | 30 | ํด๋ฆฝ๋ณด๋ ์ฐ๊ธฐ ํ ๋๊ธฐ |
๋๊ตฌ
๋ชจ๋ ์์
์ ๋จ์ผ vnc_command ๋๊ตฌ๋ฅผ ํตํด ์ํ๋ฉ๋๋ค:
ํ๋ฉด
| ๋์ | ๋งค๊ฐ๋ณ์ | ์ค๋ช |
|---|---|---|
screenshot | ์ ์ฒด ํ๋ฉด PNG ์บก์ฒ | |
cursor_crop | ์ญ์์ ์ค๋ฒ๋ ์ด์ ํจ๊ป ์ปค์ ์ฃผ๋ณ ์๋ฅด๊ธฐ | |
diff_check | ๊ธฐ์ค์ ๋๋น ํ๋ฉด ๋ณ๊ฒฝ ๊ฐ์ง | |
set_baseline | ํ์ฌ ํ๋ฉด์ diff ์ฐธ์กฐ๋ก ์ ์ฅ |
๋ง์ฐ์ค
| ๋์ | ๋งค๊ฐ๋ณ์ | ์ค๋ช |
|---|---|---|
mouse_click | x, y, button? | ํด๋ฆญ (์ผ์ชฝ|์ค๋ฅธ์ชฝ|๊ฐ์ด๋ฐ) |
mouse_double_click | x, y | ๋๋ธ ํด๋ฆญ |
mouse_move | x, y | ์ปค์ ์ด๋ |
hover | x, y | ์ด๋ + ์ ์ฐฉ ๋๊ธฐ |
nudge | dx, dy | ์๋์ ์ปค์ ์ด๋ |
mouse_drag | x, y, toX, toY | ์์์ ์์ ๋์ ์ผ๋ก ๋๋๊ทธ |
scroll | x, y, direction, amount? | ์คํฌ๋กค (์|์๋|์ผ์ชฝ|์ค๋ฅธ์ชฝ) |
ํค๋ณด๋
| ๋์ | ๋งค๊ฐ๋ณ์ | ์ค๋ช |
|---|---|---|
key_tap | key | ๋จ์ผ ํค ๋๋ฅด๊ธฐ (enter|escape|tab|space|...) |
key_combo | key ๋๋ keys | ์์ ์ ์กฐํฉ ("cmd+c" ๋๋ ["cmd","shift","3"]) |
key_type | text | ๋ฌธ์๋ณ๋ก ํ ์คํธ ์ ๋ ฅ |
paste | text | ํด๋ฆฝ๋ณด๋๋ฅผ ํตํด ํ ์คํธ ๋ถ์ฌ๋ฃ๊ธฐ |
๊ฐ์ง
| ๋์ | ๋งค๊ฐ๋ณ์ | ์ค๋ช |
|---|---|---|
detect_elements | ๊ฒฝ๊ณ ์์์ ํจ๊ป OCR ํ ์คํธ ๊ฐ์ง (Apple Vision) |
์ค์ผ์ผ๋ง๋ ๊ณต๊ฐ์์ ๊ฒฝ๊ณ ์์ ์ขํ์ ํจ๊ป ํ ์คํธ ์์๋ฅผ ๋ฐํํฉ๋๋ค:
{"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}}
๊ตฌ์ฑ
| ๋์ | ๋งค๊ฐ๋ณ์ | ์ค๋ช |
|---|---|---|
configure | {<params>} | ๋ฐํ์์ ํ์ด๋ฐ/๋์คํ๋ ์ด ๋งค๊ฐ๋ณ์ ์ค์ |
configure | {reset: true} | ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ค์ |
get_timing | ํ์ฌ ํ์ด๋ฐ + ๋์คํ๋ ์ด ๋งค๊ฐ๋ณ์ ๊ฐ์ ธ์ค๊ธฐ |
์ ์ด
| ๋์ | ๋งค๊ฐ๋ณ์ | ์ค๋ช |
|---|---|---|
wait | ms? | ๋๊ธฐ (๊ธฐ๋ณธ๊ฐ 500ms) |
health | ์ฐ๊ฒฐ ์ํ + ๋์คํ๋ ์ด ์ ๋ณด | |
shutdown | ์ ์์ ์ธ ๋ฐ๋ชฌ ์ข ๋ฃ |
์ธ์ฆ
์ง์๋๋ VNC ์ธ์ฆ ๋ฐฉ๋ฒ:
- VNC Auth โ ๋น๋ฐ๋ฒํธ ๊ธฐ๋ฐ ์ฑ๋ฆฐ์ง-์๋ต (DES)
- ARD โ Apple Remote Desktop (Diffie-Hellman + AES-128-ECB)
macOS๋ ARD ์ธ์ฆ ์ ํ 30 ์๊ฒฉ ์ฆ๋ช ์์ฒญ์ ํตํด ์๋ ๊ฐ์ง๋ฉ๋๋ค. ๊ฐ์ง๋๋ฉด Meta ํค๊ฐ Super๋ก ๋ค์ ๋งคํ๋ฉ๋๋ค(Command ํค ํธํ์ฑ).
[!NOTE] ๋ฒ ์ด๋ฉํ Mac์์ ์คํ ์ค์ด์ ๊ฐ์? VNC ๊ฐํ, SSH ํฐ๋๋ง, ์ธ์ ์์ ์ฑ ํ์ Mac M1 ์ค๋น ์๋ น์ ์ฐธ์กฐํ์ธ์.
"Claude"๋ Anthropic, PBC์ ์ํ์ ๋๋ค. ์ด ํ๋ก์ ํธ๋ Anthropic๊ณผ ์ ํดํ๊ฑฐ๋ ์น์ธ๋ฐ์ง ์์์ต๋๋ค.
Copyright (c) 2026 Riza Emre ARAS โ MIT License

