Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Lets AI agents drive a real terminal: type, press keys, click, read the screen, take screenshots.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"terminal-use": {
"command": "npx",
"args": [
"-y",
"terminal-use"
]
}
}
}在终端中运行这条命令
claude mcp add terminal-use -- npx -y terminal-use粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"terminal-use": {
"command": "npx",
"args": [
"-y",
"terminal-use"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"terminal-use": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"terminal-use"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 computer-agent-labs 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.2.1)于16天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同一分类中有:Spec Driven Development, Remote Desktop Commander, Rystic
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Start, seed, clock, inspect and diff Rystic API simulators from your agent.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
An MCP server that lets an AI agent use a real terminal the way a person does: type, press keys, click, read the screen, take a screenshot.
*Every frame above was drawn by terminal-use's own screenshot renderer; the caption on each is the tool call that produced it.*
Most agent shell tools run a command and hand back its output. That breaks down for anything interactive — vim, htop, a REPL, an installer asking questions, git rebase -i, an SSH session. terminal-use gives the agent a shell on a real pseudo-terminal, rendered by a real terminal emulator, so full-screen and interactive programs work and the agent sees what you would see.
Requires Node.js 22.12 or newer, on macOS, Linux or Windows.
Pick your client:
| Client | How to add it |
|---|---|
| Claude Code | claude mcp add terminal-use --scope user -- npx -y terminal-use |
| Cursor | Add to Cursor |
| VS Code | Add to VS Code |
| Codex | codex mcp add terminal-use -- npx -y terminal-use |
| Gemini CLI | gemini mcp add -s user terminal-use npx -y terminal-use |
Claude Desktop, and any other client that takes a command: add this to its MCP configuration (for Claude Desktop: Settings → Developer → Edit Config).
{
"mcpServers": { "terminal-use": { "command": "npx", "args": ["-y", "terminal-use"] } } }
Start a new session in your client and ask it to do something in a terminal, for example: *"Open vim, write a haiku into /tmp/haiku.txt, save and quit, then show me a screenshot of cat-ing it."*
Server options go after the command: npx -y terminal-use --cols 100 --rows 40.
| Option | Default | |
|---|---|---|
--shell | $SHELL or /bin/bash; PowerShell on Windows | Shell to run in new sessions |
--cwd | where the server was started | Working directory for new sessions |
--cols / --rows | 120 / 30 | Terminal size |
--scrollback | 5000 | Lines of history kept |
--login | off | Start shells as login shells (see below) |
If programs that work in your own terminal (node, brew, pyenv…) are missing inside a session, the server probably inherited a bare environment. That happens when the MCP client is started from the Dock or a launcher instead of a terminal: your PATH is set up by your shell's profile files (~/.zprofile, ~/.bash_profile, ~/.profile), and nothing has read them.
A login shell reads those files. Turn it on for every session with the --login server flag, or for one session with login: true on terminal_create. It is off by default because it makes each shell slower to start and runs whatever your profile runs. It has no effect in PowerShell or cmd.exe, which have no login mode.
Every tool except terminal_create and terminal_list takes the sessionId that terminal_create returns.
| Tool | What it does |
|---|---|
terminal_create | Start a session: an interactive shell, or one program with command. Optional label, cols, rows, shell, cwd, env, login, scrollback, theme. |
terminal_list | List sessions. |
terminal_destroy | End a session. |
terminal_type | Type text. \n presses Enter. paste: true sends it as one paste. |
terminal_press | Press a key or combination: Enter, Ctrl+C, ArrowUp, Shift+Tab, Alt+Enter, F5… |
terminal_wait | Wait for the running command to finish, for a regex to appear, or for output to go quiet. |
terminal_read | Read the screen or scrollback as text. |
terminal_screenshot | Render the screen as a PNG. |
terminal_click | Left-click a cell, with a preview step. |
terminal_scroll | Turn the mouse wheel over a cell. |
terminal_batch | Send several inputs in one call and get the screen back once. |
terminal_resize | Change the terminal size. |
terminal_reset | Clear the screen and scrollback, or restart the shell with hardReset: true. |
The repository has a Dockerfile for running the server in a container:
docker build -t terminal-use .
docker run -i --rm -v "$PWD":/workspace terminal-use
In an MCP client, use docker as the command with run -i --rm terminal-use as its arguments. The terminals the agent gets are then shells inside the container, not on your machine: it sees only what you mount, which is the point if you want it boxed in. Attaching from your own terminal is not available in this setup.
terminal-use comes with an Agent Skill: a short guide for the agent on how to use these tools well — when to use a command session, how to wait, how to read what is selected — plus recipes for vim, pagers, REPLs, menu-driven programs, ssh prompts and end-to-end testing of a TUI. It lives in skills/terminal-use.
io.modelcontextprotocol/skills): the skill is listed by skills/list and its files are served as skill://terminal-use/... resources. Few hosts support this yet. cp -r "$(npx -y terminal-use skills-dir)/terminal-use" ~/.claude/skills/
The skill is optional. Without it the agent still has the tool descriptions and the server's built-in instructions.
By default a session is an interactive shell: type commands into it as you would at a prompt.
Pass command to terminal_create to run one program in the terminal instead:
{"command": "npm test -- --watch", "cwd": "/path/to/project", "env": {"CI": "1"}}
The command goes through the session's shell (sh -c, PowerShell -Command, or cmd /c), so quoting, pipes and redirection work as they do at that shell's prompt. Input goes straight to the program. When it exits:
terminal_wait, and in terminal_list);terminal_read and terminal_screenshot;terminal_reset with hardReset: true runs it again, and terminal_destroy removes it.This is the mode for testing a CLI or TUI: launch it, drive it, check how it ended.
terminal_create returns a command you can run in your own terminal to join the session:
node /path/to/terminal-use/bin/terminal-use.js attach 3 --socket /tmp/terminal-use-501/41234-3.sock
You see what the agent sees and can type into the same shell. It works like a shared tmux session: several people can attach at once, and Ctrl+] detaches.
--resize makes the session follow your window size. By default the session keeps its own.--socket picks the server. Each MCP client runs its own terminal-use, and they all number sessions from 1; without --socket, attach works when only one running server has that id and lists the candidates otherwise.0600, inside a 0700 directory under the system temp dir). Anyone who can connect gets a shell as you, so they are not exposed any further than that.agent ──MCP──▶ terminal-use ──▶ node-pty ──▶ your shell
│ └─ @xterm/headless ◀── everything the shell prints │ ├─ terminal_read (text) └─ terminal_screenshot (PNG)
node-pty runs the shell on a pseudo-terminal. Everything it prints is fed to a headless xterm.js emulator, and that emulator's buffer is the single source of truth: reads and screenshots both come from it, so the agent gets the rendered screen rather than a stream of escape codes.
terminal_type, terminal_press and terminal_click return once output has been quiet for a moment (idleMs, default 200 ms) and never wait longer than 10 seconds. That suits keystrokes. It doesn't suit a build, which can be silent for a while long before it is done. For anything slow, follow up with terminal_wait:
Listening on port), REPL prompts, or a particular state of a TUI. ^ and $ match at line starts and ends; a leading (?i) or (?s) sets further flags.quietMs (default 1 s). The same rule the typing tools use, without the 10-second cap.In a command session, the default mode waits for the program to exit and reports its exit status.
timeoutMs defaults to 30 seconds (maximum 10 minutes). A timeout isn't an error: the response says the command is still running, and you can wait again.
On Windows there is no way to ask who owns the terminal, so in a shell session the default mode waits for two seconds of silence instead, and says it is a guess. Prefer a pattern there, or run the program as a command session, where waiting for it to exit works on every platform.
Limits worth knowing: background jobs (cmd &) don't count as running. Inside a nested program such as ssh or a REPL, the outer shell doesn't get the foreground back until that program exits, so use pattern or until: "quiet" there. No exit status is reported; run echo $?.
terminal_read returns text in screen-sized pages: page: 0 is the current screen, page: 1 the one before it, and so on back through scrollback.
Lines the terminal wrapped at its right edge are joined back into the single line the program printed (joinWrapped: false gives one line per screen row).
Text can't show color, so it can't show which menu entry is selected. Reads therefore end with a list of what is highlighted on screen — text in reverse video or on a background color — with the row and columns terminal_click takes:
Highlighted on screen (reverse video or background color; screen row, columns):
row 7, cols 3-18: "Unstaged changes"
If most of the screen is colored panels, the list is replaced by a pointer to terminal_screenshot. Turn it off with highlights: false.
The cursor is marked with ▌. On an empty cell it simply tak
只显示了开头部分;其余内容请在仓库中阅读