The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Tui MCP listing page.
What Chrome DevTools MCP is for the browser, tui-mcp is for the terminal.
Launch any terminal app in a managed pty, take screenshots, read text, send keystrokes. The app thinks it's running in a real terminal. Works with any TUI framework or no framework at all - vim, htop, bubbletea, textual, ink, inquirer, trend, ncurses, whatever.
A bash tool runs discrete commands - each invocation is fire-and-forget. The process exits, the output comes back. tui-mcp maintains a persistent, interactive session. The pty stays alive between calls. This matters when:
mysql shell, you've USEd a database, you're in a transaction. A bash tool can't hold that session open between calls.git rebase -i drops you into an editor. These are conversational flows that a stateless bash tool can't handle.xterm-256color, so everything works as expected.A bash tool is exec(). tui-mcp is "sit down at a terminal and use it like a human." One runs commands, the other operates software.
Some example outputs of the screenshot tool:

| Tool | Description |
|---|---|
| launch | Spawn a TUI app in a managed pty |
| kill | Terminate a session |
| list_sessions | List sessions, including recently exited ones |
| status | Get one session's state and exit code |
| resize | Resize the terminal |
| screenshot | Capture terminal as PNG |
| snapshot | Capture terminal as plain text |
| scrollback | Read the buffer including scrolled-off history |
| output | Read the raw pty byte stream (escape sequences included) |
| read_region | Read a rectangular area of the buffer |
| cursor | Get cursor position |
| send_keys | Send a keystroke or combo (Enter, Ctrl+C, Ctrl+Up, q) |
| send_text | Type a string of characters |
| send_mouse | Send mouse events |
| wait_for_text | Wait for a regex pattern to appear |
| wait_for_idle | Wait until the terminal stops changing |
| wait_for_exit | Wait for the process to exit and get its exit code |
Most MCP servers wrap one specific tool or API. tui-mcp wraps the terminal itself, which is the universal interface that all tools already speak. It's MCP's eval().
Watch and control all active sessions from your terminal:
Session list on the left, live ANSI-rendered terminal preview on the right. The monitor discovers every running tui-mcp server on the machine and aggregates their sessions.
Keys:
j/k or arrows to move through servers and their sessions, g/G for top/bottom, mouse click and scroll also workenter on a session attaches - everything you type passes through to its pty, ctrl+\ detachesenter on a server opens the launch panel targeting its fetches the session's full scrollback into a scrollable view, esc returns to livel launches a new session on the selected row's server (ctrl+s cycles the target)x twice within 3 seconds kills the selected sessionq quitsAttach, launch, kill, and scrollback need the server to be 1.2 or newer; sessions on older servers are marked ro (read-only) and can still be watched.
The app runs in a real pseudo-terminal via node-pty. Its output is parsed by xterm-headless (the same terminal emulator that powers VS Code's terminal, but without a DOM). The MCP tools read and interact with that parsed buffer.