Back to Directory/Media & Images

io.github.Kyzenkms/solisk-pc-mcp

Approval-gated PC control for AI clients: 97 tools for files, shell, GUI input, clipboard and audio.

Media & ImagesJavaScriptv1.0.1

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

Install

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.

Windows GUI

Solisk desktop control room
  1. Download PC Control MCP 1.0.0.msi from Releases — the classic Setup .exe rides along.
  2. Run it: point-and-click control room, same engine as the CLI.
  3. Already have the CLI? solisk gui setup --installer <path-to-.msi> installs it silently.
  4. On Linux/macOS, 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.

Connect an AI in 60 seconds

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
ConnectAuthorizeControl
Paste the MCP URL as a connectorApprove the consent screen onceWatch sessions and call tools live

[!NOTE] First connect fails but a retry works? Claude cached a failed discovery — remove and re-add the connector once, consent then appears directly.

Security model

#GuaranteeHow
1Bearer-onlyOwner key, scoped key, OAuth token, or device cookie on every data route. Shells public, data never.
2Zero-trust relayAuthenticates before forwarding one byte. Takeovers logged and blocked.
3PKCE + exact redirects + bound tokensNo cross-room token reuse, ever.
4Hashed at restscrypt with unique salts. Secrets never hit logs or disk plaintext.
5Fail closedUnknown session → re-init. Offline → local keeps working, remote redials. 300/min relay, 400/min local, 5 sessions, idle expiry.
6Deliberate destructionFunnel, turbo, URL regen all confirm first and state what happens.

Full policy: SECURITY.md · found something? Security advisory — not a public issue.

Everything, live

Four paths inHosted 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 sessionsOne live AI reads 1. Ghost sessions expire after 10 idle minutes; every surface (GUI, CLI, API) reads the live count.
Keys that fitScoped client keys, fail-closed defaults, zero-downtime rotation, 30-day remembered devices.
No-fight runtimeCLI attaches to a running GUI, borrows its key transparently, and refuses to boot a second server over it.
UpdatesIn-app release notes, skip-a-version supported, mandatory releases cannot be skipped.

Architecture

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 support

OSCLI (solisk)Web dashboard (/app)GUITools
Windows 10/11 x64✅ local + relay + tunnel✅✅ full control room97 native
Linux✅ server · stdio · tunnels · Tailscale✅❌ — solisk gui refuses, points to /app45 portable + shell_exec
macOS✅ server · stdio✅❌ — same45 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.

Requirements

  • Node ≥ 22.5 for the CLI.
  • Windows 10/11 x64 for the GUI.
  • Nothing else — no Docker, no reverse proxy needed for localhost use.

Self-host the relay

ssh root@YOUR_VPS
bash -c "$(curl -fsSL https://raw.githubusercontent.com/Kyzenkms/solisk-pc-mcp/main/self-hosted-setup/vps/install.sh)"
What the script does

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.

CLI reference

solisk is the command — pc-control remains as a compatibility alias.

Daily
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
Access control
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
Exposure
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.

Verify

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

FAQ

One AI shows N sessions
Stale IDs from reconnects — they expire after 10 idle minutes. The live count is exact at connect time.
CLI says key refused next to a running GUI
It borrows the GUI key automatically and tells you (fingerprint shown). solisk gui status shows both fingerprints.
After restart it shows 0 sessions
Correct — sessions live in memory. The moment the client re-initializes, the count appears. Grants and keys persist; nobody re-authenticates.
Can I run the GUI on Linux?
No — the control room is Windows-only by design. On Linux and macOS use the CLI plus the web dashboard at /app, which is the same control room in a browser.

MIT · Solisk PC Control MCP · v1.0.0 · solisk.org

Installation

Source-derived launch command. Check the maintainer’s required arguments and credentials before running:

bash
npx -y solisk

Set up in your AI client

Merge 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.

json
{
  "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 reference

Package

solisknpm

Compatible MCP Clients

io.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.

  • Claude Desktop~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.
  • Cursor~/.cursor/mcp.jsonRestart Cursor for changes to take effect.
  • VS Code.vscode/mcp.jsonReload VS Code window for changes to take effect.
  • Windsurf~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect.
  • Claude Code.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.

Learn More