Launch, screenshot and interact with any TUI app.
tui-mcp
以下摘录自该仓库的 README(片段) · 在 GitHub 读完整 README →
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.
How is this different from a bash tool?
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:
- **The tool has state** - you're in a mysql shell, you've USEd a database, you're in a transaction. A bash tool can't hold that session open between calls.
- **The tool has UI** - htop, vim, k9s, lazygit. A bash tool gets garbage back because these apps paint full-screen interfaces with ANSI escape codes. tui-mcp renders them into a readable screenshot or text snapshot through xterm emulation.
- **The interaction is multi-step** - SSH prompts for a password, then a 2FA code, then you're in. An interactive installer asks questions. git rebase -i drops you into an editor. These are conversational flows that a stateless bash tool can't handle.
- **You need to watch something** - tail a log, monitor a build, wait for a deploy to finish. The session stays open, the agent can snapshot whenever it wants to check progress.
- **The tool requires a TTY** - some CLIs behave differently (or refuse to run) without a real terminal. node-pty gives them a real pty with 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:
Setup
Tools
| 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 |
Interesting use cases
- remote ops: agent SSHs into a production box, tails logs, greps for errors, restarts a service, watches it come back up. it's reading the same terminal output a human SRE would see. no custom APIs needed.