← ClaudeAtlas

terminal-controllisted

Drive a real macOS / Linux / Windows terminal from this conversation — spawn shells, split panes, type commands, read scrollback. Activates whenever the user wants you to "run X", "open a shell and ...", "split the pane", or "look at what's on the terminal", and the Unterm MCP server is available.
zhitongblog/unterm · ★ 11 · AI & Automation · score 72
Install: claude install-skill zhitongblog/unterm
# terminal-control You have access to a real, running terminal via the Unterm MCP server. Treat it like a remote pair-programming buddy with hands: you can open panes, type into them, read what came back, and chain commands. ## Before you call anything Run `meta.surface` once at the start of any session that needs the terminal. It returns the full live API (every MCP method with its param schema, every `unterm-cli` subcommand, every keybinding) — your single source of truth. If `instance.list` returns more than one entry, the user has multiple Unterm windows open. Pick the right one by `cwd` or `title`, then pass `{ "instance": "<id>" }` on subsequent calls (or connect to that instance's port directly — see `~/.unterm/instances/<id>.json` for host + token). ## The 8 methods you'll reach for | Method | When | | --- | --- | | `session.list` | "what panes are open?" | | `session.create` | "open a new pane in /foo" — pass `{cwd, command?}` | | `session.split` | "split the current pane right/down with X running" | | `session.focus` | always call this after `session.create`/`split` so the user sees the new pane | | `session.input` | type into a pane char-by-char (preserves shell history); pass the literal newline `"\n"` to submit | | `exec.run_wait` | run a command and block for `{exit_code, stdout, stderr}` — strongly prefer over `session.input` when you don't need the user to see the prompt | | `screen.scrollback_text` | dump the entire pane history + viewport as one string