关于 terminal-mcp
terminal-mcp 是面向需要持久交互式终端会话的 AI Agent 的 MCP 服务。它通过 PTY 支持 SSH、REPL、数据库命令行、TUI 应用和长时间运行的进程,并提供会话控制与命令安全检查。
主要功能
- 01持久化 PTY 会话
- 02交互式 SSH、REPL 和数据库命令行
- 03TUI 屏幕快照与差异
- 04按模式等待输出
- 05危险命令确认机制
适用场景
- 01在 SSH 会话中连续执行命令
- 02在 Python REPL 中交互操作
- 03通过数据库命令行检查和查询
- 04监控构建或操作 TUI 应用
MCP 相关
它向 MCP 客户端提供九种工具,用于创建、交互、读取、调整大小、列出和关闭终端会话,以及执行一次性命令。MCP 客户端可通过这些工具控制持久终端会话。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
7收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| cols | integer | 否 | 终端宽度(列数) |
| rows | integer | 否 | 终端高度(行数) |
| label | string | 否 | 会话的易读标签 |
| command | string | 是 | 要运行的 Shell 命令(例如 'bash'、'python3'、'ssh user@host') |
| idle_timeout | integer | 否 | 空闲会话自动关闭前的秒数 |
| enable_snapshot | boolean | 否 | 启用用于快照读取的 pyte 屏幕缓冲区 |
| scrollback_lines | integer | 否 | 要保留的回滚历史行数(需要 enable_snapshot) |
详细介绍
为你的 AI 配备真正的终端。持久会话。交互式程序。毫无限制。
问题所在
每款 AI 编码工具都会遇到同一个瓶颈:无法真正访问终端。
Claude Code 的 Bash 工具、GitHub Copilot 和 Codex 都在隔离的子进程中运行命令。每条命令都会重新启动,状态无法延续。这意味着:
- 无法建立 SSH 会话 - 不能连接远程服务并运行多条命令
- 无法使用 REPL - 不能交互式使用 Python、Node 或 Ruby 解释器
- 无法使用数据库 CLI - 不能维持 psql、mysql 或 redis-cli 连接
- 无法使用 TUI 应用 - 不能用方向键操作 htop、vim 或 fzf
- 无法运行长时间进程 - 不能监控构建、查看日志或运行开发服务
解决方案
terminal-mcp 为 AI Agent 提供真正的终端。持久的 PTY 会话可在多次工具调用之间持续存在。发送命令、读取输出、按下按键、操作 TUI——就像人在终端前操作一样。
uvx terminal-mcp
只需一条命令。兼容 Claude Code、Claude Desktop、VS Code、Cursor 和 Windsurf。
快速开始
1. 安装(30 秒)
# No install needed - run directly
uvx terminal-mcp
# Or install globally
pip install terminal-mcp
2. 连接到你的 AI 客户端
Claude Code
添加到 ~/.claude.json 或项目的 .mcp.json:
{
"mcpServers": {
"terminal": {
"command": "uvx",
"args": ["terminal-mcp"]
}
}
}
Claude Desktop
添加到 claude_desktop_config.json:
{
"mcpServers": {
"terminal": {
"command": "uvx",
"args": ["terminal-mcp"]
}
}
}
VS Code / Cursor
点击上方的一键安装徽章,或添加到 .vscode/mcp.json:
{
"servers": {
"terminal-mcp": {
"command": "uvx",
"args": ["terminal-mcp"]
}
}
}
Windsurf
添加到 ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"terminal": {
"command": "uvx",
"args": ["terminal-mcp"]
}
}
}
3. 验证
session_exec exec="echo hello from terminal-mcp"
可以用它做什么?
通过 SSH 登录远程服务
session_create command="ssh [email protected]" label="prod"
session_interact session_id="a1b2c3d4" input="df -h" wait_for="\$"
session_interact session_id="a1b2c3d4" input="docker ps" wait_for="\$"
session_close session_id="a1b2c3d4"
运行交互式 REPL
session_create command="python3" label="python"
session_interact session_id="e5f6g7h8" input="import pandas as pd" wait_for=">>>"
session_interact session_id="e5f6g7h8" input="df = pd.read_csv('data.csv')" wait_for=">>>"
session_interact session_id="e5f6g7h8" input="df.describe()" wait_for=">>>"
session_close session_id="e5f6g7h8"
查询数据库
session_create command="psql -U admin mydb" label="db"
session_interact session_id="x1y2z3w4" input="SELECT count(*) FROM users;" wait_for="row"
session_interact session_id="x1y2z3w4" input="\dt" wait_for="#"
session_close session_id="x1y2z3w4"
操作 TUI 应用
session_create command="htop" label="monitor"
session_read session_id="a1b2c3d4"
# Auto-detects TUI, returns screen snapshot
session_send session_id="a1b2c3d4" key="F6"
session_read session_id="a1b2c3d4" mode="diff"
# Returns only changed lines - saves tokens
session_send session_id="a1b2c3d4" key="F10"
session_close session_id="a1b2c3d4"
监控长时间运行的构建
session_create command="bash" label="build"
session_send session_id="a1b2c3d4" input="npm run build"
session_wait_for session_id="a1b2c3d4" pattern="Build complete|ERROR" timeout=120
运行一次性命令
session_exec exec="git log --oneline -10"
session_exec exec="docker compose ps" timeout=10
功能一览
| 功能 | 说明 |
|---|---|
| 持久会话 | 真正的 PTY 会话,可在多次工具调用之间保持运行 |
| 一次调用中发送并读取 | session_interact 可将大模型往返次数减半 |
| 基于模式读取 | wait_for 会阻塞,直到匹配正则表达式,无需猜测超时时间 |
| 自动检测 TUI | 检测 htop、vim 等,并自动切换到屏幕快照模式 |
| 输出差异模式 | 仅返回发生变化的屏幕行,最大限度减少 token |
| 特殊按键 | 方向键、Tab、F1-F12、Home/End、Page Up/Down |
| 控制字符 | Ctrl-C、Ctrl-D、Ctrl-Z、Ctrl-L、telnet 转义 |
| 危险命令拦截 | 拦截 rm -rf、DROP TABLE、curl|sh,需要确认 |
| OSC 133 Shell 集成 | 自动检测命令边界和退出码 |
| 智能截断 | 提供四种策略,防止上下文溢出 |
| 机密输入 | 发送密码时不记录日志 |
| 动态调整大小 | 使用 SIGWINCH 即时调整终端大小 |
| 空闲清理 | 自动关闭空闲会话 |
| 跨平台 | 支持 Linux、macOS 和 Windows |
工具参考
terminal-mcp 提供 9 个 MCP 工具。完整详情请参阅 docs/tools.md。
| 工具 | 用途 |
|---|---|
session_create | 启动持久终端会话 |
session_send | 发送文本、按键或控制字符 |
session_read | 读取输出(流式、快照、自动、差异模式) |
session_interact | 在一次调用中发送并读取 |
session_wait_for | 等待输出中出现正则表达式模式 |
session_exec | 执行一次性命令 |
session_close | 正常关闭会话 |
session_resize | 调整终端尺寸 |
session_list | 列出活动会话 |
架构
flowchart LR
Client[AI Client] -->|MCP JSON-RPC| Server[terminal-mcp]
Server --> SM[Session Manager]
SM --> S1[PTY 1: bash]
SM --> S2[PTY 2: python3]
SM --> S3[PTY 3: ssh user@host]
S1 & S2 & S3 -.->|PTY output| Reader[Reader Thread]
Reader -.->|buffer| Server
每个会话都由 pexpect.spawn(Windows 上为 PopenSpawn)通过真正的 PTY 支持。完整的架构详情请参阅 docs/architecture.md。
配置
所有设置都可通过 TERMINAL_MCP_* 环境变量进行配置。完整参考请参阅 docs/configuration.md。
| 设置 | 环境变量 | 默认值 |
|---|---|---|
| 最大会话数 | TERMINAL_MCP_MAX_SESSIONS | 10 |
| 空闲超时 | TERMINAL_MCP_IDLE_TIMEOUT | 1800(30 分钟) |
| 安全拦截 | TERMINAL_MCP_SAFETY_GATE | on |
| 缓冲区上限 | TERMINAL_MCP_MAX_BUFFER_BYTES | 1000000(1MB) |
| 截断方式 | TERMINAL_MCP_TRUNCATION_MODE | tail |
使用自定义设置的示例:
{
"mcpServers": {
"terminal": {
"command": "uvx",
"args": ["terminal-mcp"],
"env": {
"TERMINAL_MCP_MAX_SESSIONS": "20",
"TERMINAL_MCP_IDLE_TIMEOUT": "3600",
"TERMINAL_MCP_TRUNCATION_MODE": "head_tail"
}
}
}
}
文档
| 文档 | 说明 |
|---|---|
| 工具参考 | 全部 9 个 MCP 工具的完整 API |
| 架构 | terminal-mcp 的底层工作原理 |
| 配置 | 所有设置和环境变量 |
| 安全与防护 | 危险命令检测和安全拦截 |
| 用例与示例 | 实际应用示例和模式 |
| 更新日志 | 版本历史和发布说明 |
| 贡献 | 如何参与贡献 |
Supported Clients
| Client | Status | Install |
|---|---|---|
| Claude Code (CLI) | Supported | ~/.claude.json or .mcp.json |
| Claude Desktop | Supported | One-click install |
| VS Code (Copilot Chat) | Supported | One-click install or .vscode/mcp.json |
| Cursor | Supported | One-click install or Settings |
| Windsurf | Supported | ~/.codeium/windsurf/mcp_config.json |
Running Tests
pip install -e ".[dev]"
pytest tests/ -v
Contributing
Contributions welcome! See docs/contributing.md for guidelines.
License
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。