MCP server giving AI agents real interactive terminal sessions — PTY, TUIs, REPLs, SSH, even another agent's CLI — with a live web view a human can watch and type into
termmirror demonstrates strong naming conventions (verb_noun pattern: create_session, send_input, read_screen) and comprehensive parameter descriptions. All 23 tools have clear, actionable descriptions (avg ~150 chars). Input schemas are well-structured with proper types, constraints (min/max for cols/rows/timeout), and enums (wait modes, browser actions). However, output schemas are not explicitly documented in the source, responses are inferred from descriptions rather than formally specified. Error handling guidance is minimal; tools lack recovery hints. Security considerations (PTY access, file operations) are not surfaced in descriptions. Composition is strong: tools chain logically (create_session → send_input → wait → read_screen). Parameter naming is consistent (session IDs, clear action targets). Baseline: avg tool description ~150 chars (within 10 - 1024 range); all params have descriptions; enums used appropriately (wait modes, browser actions, export formats).
Click, type, press keys, hover, select, scroll or upload files in the browser. Returns the new page snapshot after the action completes.
Close a browser session and all its tabs.
Close a tab by index.
Render a browser .webm recording as a GIF or mp4. Requires `ffmpeg`; install via Homebrew. Returns the path to the rendered file.
Open a new tab and optionally navigate to a URL.
Launch a browser session and navigate to a URL. Returns the session id and a URL where a human can watch it live.
Switch to a different tab by index.
Output schemas not formally documented. Tool descriptions infer return types (e.g., 'Returns the path to the .cast file') but no explicit JSON Schema for responses. LLMs cannot reliably plan downstream tool calls without knowing response structure.
Minimal error recovery guidance. Tools lack actionable error messages. E.g., 'wait' can timeout or return 'no_output' but descriptions don't explain what the LLM should do next (retry? increase timeout? check session state?).
Destructive operations (kill_session, browser_close) lack confirmation or dry-run support. No pattern:confirmation-request. Agents could terminate sessions unintentionally.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Return the current page as an accessibility tree with [ref=eN] on every node. Use these refs to target actions in browser_act.
Start recording the browser session to a .webm file.
Finalize the browser recording and return the path to the .webm file.
List every open tab, in the order Chrome holds them.
Wait for the browser to finish loading or for a condition to be met. Returns when the page is idle or a pattern matches.
Start a long-lived interactive terminal session and return its id. Defaults to your login shell; pass `command` to launch a program directly (e.g. "claude", "python3", "ssh host"). The session outlives the call — nothing blocks. Returns a URL where a human can watch it live.
Render a .cast file as a GIF, mp4 or asciicast. Requires `agg` for GIF/mp4 and `ffmpeg` for mp4; both are installed via Homebrew. Returns the path to the rendered file.
Terminate a session and all its child processes.
Every session this server owns, alive or exited, with the URL to watch each one.
Return what is on the session's screen right now, as plain text. This is a screenshot: it shows the current screen, so output that scrolled away is gone — pass `scrollback` to reach back into history instead. Pass `attrs` when a TUI marks its selection with highlighting rather than a glyph — without it every row reads the same.
Change the terminal dimensions. TUIs redraw to fit; widen it when output wraps badly.
Type text into the session, as a person would. It waits for the screen to stop redrawing before typing, because keys that land mid-redraw are silently lost. Set `enter` to submit. Follow with wait, then read_screen — the input alone tells you nothing about what happened.
Send control and navigation keys: ctrl+c, ctrl+d, escape, tab, enter, up, down, left, right, home, end, pageup, pagedown, backspace, delete, f1-f12, alt+X. Keys are sent in order. Use this to drive menus and TUIs; use send_input for ordinary text.
Start capturing everything the session prints, in the background. Returns the path to the .cast file. Call stop_recording to finalize it and render it as a GIF, mp4 or asciicast.
Finalize the recording and return the path to the .cast file. Render it with export_recording.
Block until the session is ready for you again — always call this between sending input and reading the screen, or you will read the screen as it was before your input landed. Default mode `idle` returns once the program has responded and then gone quiet for `idle_ms`; that is the completion signal for agent CLIs, TUIs and spinners, which redraw while working and fall silent when it is your turn. A `no_output` result means nothing happened at all: the program is silently busy, or your input did not register. Use mode `pattern` when you know the exact text to expect; it matches the whole screen, including your own echoed input, so never wait for a marker you just typed. Raise `timeout` for slow work.
Security considerations not surfaced in tool descriptions. PTY access, file I/O (recordings, profiles), and command execution are powerful but lack permission/scope declarations or audit guidance.
browser_act action parameter is a complex nested object with conditional fields (target, text, key, files, dialog, dialogText). No clear guidance on which fields apply to which action kinds. LLMs may pass invalid field combinations.