Approval-gated PC control for AI clients: 97 tools for files, shell, GUI input, clipboard and audio.
Install · Windows GUI · Connect an AI · Security · Self-host · CLI · FAQ
[!TIP] One product, three faces, one runtime per machine. Connect any MCP client by URL, approve once, call 97 tools — and watch every session, toggle every path, revoke anything. CLI on every OS, desktop control room on Windows, web dashboard (
/app) anywhere.
npm install -g solisk # Node 22.5+ · or run without installing: npx solisk
solisk setup # room name, owner key, approval mode — step by step
solisk --mode=http # MCP server on 127.0.0.1:3000 (default)
solisk dashboard # web control room at /app
Windows, Linux and macOS servers run the same command. Off-Windows serves the 45 portable tools + shell_exec; Windows-only automation stays off. The /app dashboard is the control room on every OS.
PC Control MCP 1.0.0.msi from Releases — the classic Setup .exe rides along.solisk gui setup --installer <path-to-.msi> installs it silently.solisk gui refuses by design and points you to the web dashboard.[!WARNING] The build is unsigned, so SmartScreen asks once: More info → Run anyway. An EV certificate ends this; it is budgeted, not done.
flowchart LR
A[Copy MCP URL<br/>from Setup] --> B[Paste as connector<br/>in Claude / ChatGPT]
B --> C[Approve once<br/>consent + room key]
C --> D[Calling tools.<br/>Reconnects need no re-auth.]
style D fill:#4fd1b5,color:#03211b
| Connect | Authorize | Control |
|---|---|---|
![]() | ![]() | ![]() |
[!NOTE] First connect fails but a retry works? Claude cached a failed discovery — remove and re-add the connector once, consent then appears directly.
| # | Guarantee | How |
|---|---|---|
| 1 | Bearer-only | Owner key, scoped key, OAuth token, or device cookie on every data route. Shells public, data never. |
| 2 | Zero-trust relay | Authenticates before forwarding one byte. Takeovers logged and blocked. |
| 3 | PKCE + exact redirects + bound tokens | No cross-room token reuse, ever. |
| 4 | Hashed at rest | scrypt with unique salts. Secrets never hit logs or disk plaintext. |
| 5 | Fail closed | Unknown session → re-init. Offline → local keeps working, remote redials. 300/min relay, 400/min local, 5 sessions, idle expiry. |
| 6 | Deliberate destruction | Funnel, turbo, URL regen all confirm first and state what happens. |
Full policy: SECURITY.md · found something? Security advisory — not a public issue.
| Four paths in | Hosted relay · Cloudflare tunnel (quick or your own domain) · tailnet · web dashboard. Each toggles live; killing the dashboard returns 404 on /app — not just tailnet. |
| Honest sessions | One live AI reads 1. Ghost sessions expire after 10 idle minutes; every surface (GUI, CLI, API) reads the live count. |
| Keys that fit | Scoped client keys, fail-closed defaults, zero-downtime rotation, 30-day remembered devices. |
| No-fight runtime | CLI attaches to a running GUI, borrows its key transparently, and refuses to boot a second server over it. |
| Updates | In-app release notes, skip-a-version supported, mandatory releases cannot be skipped. |
flowchart TB
AI["AI client<br/>Claude.ai / ChatGPT / Cursor"]
AI -->|MCP URL + OAuth 2.1<br/>PKCE S256, resource-bound tokens| RELAY
subgraph RELAY["Cloud relay"]
R1[rooms · tokens · rate limits<br/>scrypt-hashed keys]
end
RELAY -->|one outbound WebSocket per PC<br/>takeover-protected| PC
subgraph PC["Your machine :3000"]
P1[StreamableHTTP · 97 tools · 5 sessions max]
P2[Cloudflare tunnel<br/>quick or your domain]
P3[tailnet serve · web dashboard /app]
end
One config file, one event bus, one session store. Thin faces (Electron, CLI, web shim) never own state.
| OS | CLI (solisk) | Web dashboard (/app) | GUI | Tools |
|---|---|---|---|---|
| Windows 10/11 x64 | ✅ local + relay + tunnel | ✅ | ✅ full control room | 97 native |
| Linux | ✅ server · stdio · tunnels · Tailscale | ✅ | ❌ — solisk gui refuses, points to /app | 45 portable + shell_exec |
| macOS | ✅ server · stdio | ✅ | ❌ — same | 45 portable + shell_exec |
Windows-only automation (mouse/keyboard hooks, screenshots, native dialogs) stays off elsewhere; everything portable stays on. Relay, tunnels, OAuth, keys, remembered devices, sessions, update checks — identical on all three.
ssh root@YOUR_VPS
bash -c "$(curl -fsSL https://raw.githubusercontent.com/Kyzenkms/solisk-pc-mcp/main/self-hosted-setup/vps/install.sh)"
Picks your domain type (yours or sslip.io for testing), then runtime (Docker or PM2), then prints the room + key to paste into the app. Backups, firewall, updates: self-hosted-setup/README.md.
solisk is the command — pc-control remains as a compatibility alias.
solisk dashboard [--no-open] web console for the running server
solisk doctor [--fix] 11 health checks — 0 failing is the goal
solisk logs [--lines N] live server log, whichever face owns it
solisk setup step-by-step onboarding wizard
solisk backup config snapshot for restores
solisk config get|set|validate ports, modes, domains (secrets refused)
solisk rotate-key new owner key, zero-downtime rotation
solisk keys list|add|revoke scoped client keys (fail-closed defaults)
solisk devices list|revoke remembered browsers
solisk relay status|retry room state, redial
solisk tunnel off|quick|custom + login, create, route, forget, status
solisk tailscale status|serve|off funnel is deliberate and confirmed
solisk gui status|setup detect install, install from .exe or .msi
Every attach command works with zero flags next to a running GUI.
cd relay-server && node --test test/oauth.test.js # OAuth regression suite
node test-live.js # end-to-end vs a running server
solisk doctor # this machine — 0 failing is the goal
solisk gui status shows both fingerprints.
/app, which is the same control room in a browser.
MIT · Solisk PC Control MCP · v1.0.0 · solisk.org
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y soliskMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-kyzenkms-solisk-pc-mcp": {
"command": "npx",
"args": [
"-y",
"solisk"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referencesolisknpmio.github.Kyzenkms/solisk-pc-mcp works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.