interactive-cli
Enables AI agents to interact with interactive CLI processes via a real PTY, allowing them to send keystrokes, read screen output, and handle interactive prompts.
README
interactive-cli
MCP server that lets AI coding agents interact with interactive CLI processes. Uses a real PTY + xterm headless to render terminal output as clean text — no ANSI escape soup.
Works with Claude Code, Cursor, Windsurf, or any MCP-compatible client.
Why
AI agents can run shell commands, but they choke on anything interactive:
$ eas build --platform ios
✔ Select a build profile › (waiting for input...)
This MCP server bridges that gap — spawn the process, read the screen, send keystrokes.
Quick Start
Claude Code
claude mcp add-json interactive-cli '{"command":"npx","args":["-y","interactive-cli-mcp"]}'
Or add to ~/.claude/settings.json manually:
{
"mcpServers": {
"interactive-cli": {
"command": "npx",
"args": ["-y", "interactive-cli-mcp"]
}
}
}
From Source
git clone https://github.com/ohernandezdev/interactive-cli.git
cd interactive-cli
npm install && npm run build
claude mcp add-json interactive-cli '{"command":"node","args":["/absolute/path/to/interactive-cli/dist/index.js"]}'
Other MCP Clients
Point your client's MCP config at:
command: node
args: ["/path/to/interactive-cli/dist/index.js"]
transport: stdio
Tools
| Tool | Description | Read-only |
|---|---|---|
spawn |
Start an interactive process in a PTY | No |
send_input |
Type text (appends Enter by default) | No |
send_keys |
Send special keys in sequence (arrows, ctrl combos, etc.) | No |
get_screen |
Capture current terminal screen, optional regex search | Yes |
wait_for |
Block until a regex pattern appears in output | No |
wait_for_exit |
Block until the process exits | No |
resize |
Change terminal dimensions | No |
list_sessions |
List all active sessions | Yes |
close |
Kill process, clean up session | No |
Typical Flow
sequenceDiagram
participant Agent as AI Agent
participant MCP as interactive-cli
participant PTY as Process (PTY)
Agent->>MCP: spawn("eas build --platform ios")
MCP->>PTY: Start process in PTY
PTY-->>MCP: Initial output
MCP-->>Agent: sessionId + screen
Agent->>MCP: get_screen(sessionId)
MCP-->>Agent: "Select profile: ❯ dev staging prod"
Agent->>MCP: send_keys(["down","down","enter"])
MCP->>PTY: ↓ ↓ ⏎
PTY-->>MCP: "✔ Selected: production"
MCP-->>Agent: updated screen
Agent->>MCP: wait_for("Build complete|error", 600s)
loop Every 1s
MCP->>PTY: check output
end
PTY-->>MCP: "Build complete"
MCP-->>Agent: matched + screen
Agent->>MCP: close(sessionId)
MCP->>PTY: SIGTERM
MCP-->>Agent: final screen + exit code
spawn
spawn({
command: "ssh user@server.com", // full command string
cwd: "/path/to/project", // optional working directory
env: { "NODE_ENV": "production" }, // optional extra env vars
cols: 120, // terminal width (default 120)
rows: 30, // terminal height (default 30)
waitMs: 3000, // ms to wait for initial output (default 2000)
})
Commands run through your shell ($SHELL or /bin/zsh), so pipes, redirects, and builtins work.
send_input
send_input({
sessionId: "s1",
text: "yes", // text to type
pressEnter: true, // append Enter (default true). false for password fields
waitMs: 2000, // ms to wait for response (default 2000)
})
send_keys
Send one or more keys in sequence with a small delay between each:
send_keys({
sessionId: "s1",
keys: ["down", "down", "enter"], // navigate menu
delayBetweenMs: 50, // ms between keys (default 50)
waitMs: 1500, // ms to wait after last key (default 1500)
})
Supported keys: enter tab escape space up down left right backspace delete home end page_up page_down f1–f12 ctrl+c ctrl+d ctrl+z ctrl+l ctrl+a ctrl+e ctrl+r ctrl+w ctrl+u ctrl+k ctrl+p ctrl+n y n 0–9
get_screen
get_screen({
sessionId: "s1",
search: "error|warning", // optional regex to highlight matching lines
})
// Returns: { screen, cursor: { row, col }, searchResults, stats }
wait_for
wait_for({
sessionId: "s1",
pattern: "\\$|#|>", // regex to match (case-insensitive)
timeoutMs: 30000, // max wait (default 30s)
intervalMs: 1000, // check interval (default 1s)
})
// Returns: { matched: true/false, screen, elapsed }
wait_for_exit
wait_for_exit({
sessionId: "s1",
timeoutMs: 60000,
})
// Returns: { alive: false, exitCode: 0, screen }
Resources
Sessions are exposed as MCP resources:
interactive-cli://sessions— JSON list of all sessionsinteractive-cli://sessions/{id}/screen— live screen content
Prompt Templates
Pre-built prompt templates for common flows (appear as slash commands in Claude Code):
eas_build— EAS build with credential handlingssh_session— SSH connection with command executionrepl_session— Start a REPL (Python, Node, psql, etc.)docker_interactive— Run an interactive Docker container
How It Works
graph LR
A[AI Agent] <-->|MCP Protocol| B[interactive-cli server]
B --> C[Session Manager]
C --> D[node-pty<br/><i>real PTY</i>]
C --> E[xterm headless<br/><i>screen render</i>]
C --> F[Truncation<br/><i>80K limit</i>]
D <--> G[Child Process<br/>ssh, eas, python...]
- node-pty spawns a real pseudo-terminal, so the child process thinks it's talking to a human
- xterm headless maintains a virtual terminal buffer that renders ANSI sequences into a clean 2D text grid
- Output is truncated at 80K chars (MCP clients like Claude Code cap at 100K) with smart middle-truncation preserving start and end
- Tool annotations (
readOnlyHint,destructiveHint) tell the client which tools are safe to run in parallel and which need permission
Requirements
- Node.js >= 18
- macOS or Linux (node-pty uses native PTY)
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。