# terminal-use (npm · terminal-use)

Lets AI agents drive a real terminal: type, press keys, click, read the screen, take screenshots.

- Trust score: 91/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `terminal-use`: 91/100 (this document), [markdown](https://verifymcp.io/servers/computer-agent-labs-terminal-use/terminal-use.md), [page](https://verifymcp.io/servers/computer-agent-labs-terminal-use/terminal-use)

## Channel facts

- Registry: `npm`
- Package: `terminal-use`
- Version: `0.2.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 0 of 24 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to computer-agent-labs/terminal-use).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 14 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 75/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4560 tokens (~268/item across 17 items; 13 tools + 4 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 73/100
  - Stability observed for 22 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 95/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 86% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the terminal-use MCP server?

terminal-use runs locally as an npm package, launched with npx -y terminal-use. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add computer-agent-labs-terminal-use -- npx -y terminal-use
```

### Cursor

```json
{
  "mcpServers": {
    "computer-agent-labs-terminal-use": {
      "command": "npx",
      "args": [
        "-y",
        "terminal-use"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "computer-agent-labs-terminal-use": {
      "command": "npx",
      "args": [
        "-y",
        "terminal-use"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add computer-agent-labs-terminal-use -- npx -y terminal-use
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "computer-agent-labs-terminal-use": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "terminal-use"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add computer-agent-labs-terminal-use --command npx --arg -y --arg terminal-use
```

### Hermes

```yaml
mcp_servers:
  computer-agent-labs-terminal-use:
    command: "npx"
    args: ["-y", "terminal-use"]
```

### Netclaw

```json
{
  "McpServers": {
    "computer-agent-labs-terminal-use": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "terminal-use"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add computer-agent-labs-terminal-use -t stdio -c npx -a -y terminal-use
```

### Other

```json
{
  "mcpServers": {
    "computer-agent-labs-terminal-use": {
      "command": "npx",
      "args": [
        "-y",
        "terminal-use"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 91, +1)

No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-01 (score 90, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-30 (score 89, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-28 (score 88, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-26 (score 87, +1)

No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-24 (score 86, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-22 (score 85, +16)

- [security improvement] Malware scan: unverified → pass

### 2026-10-21 (score 69, −2)

- [security regression] Malware scan: pass → unverified
- [security improvement] Provenance: fail → pass
- [security] The attested source repository moved: computer-agent-labs/terminal-use
- [functional improvement] Stability: unverified → 0.23
- [functional] Package version: 0.1.1 → 0.2.1

## MCP tools (13)

### `terminal_batch` (~427 tokens)

Run several terminal inputs

Send a sequence of inputs in one call and get the screen back once at the end — for driving a full-screen program without a round trip per keystroke (open a menu, move down three, press Enter, type a name, confirm). Actions run in order, each given a moment to take effect before the next.

Each action is an object with a `type` and the fields that type uses:
\- `type`: `text` — typed as keystrokes; \n presses Enter.
\- `paste`: `text` — delivered as one bracketed paste where the program supports it.
\- `press`: `key`, optional `count` — same key specs as terminal_press.
\- `click`: `col`, `row` — left click, sent immediately with no preview; needs the program to track the mouse.
\- `scroll`: `direction`, optional `amount`, `col`, `row` — as terminal_scroll.
\- `wait`: `ms` for a fixed pause, or `pattern` (optional `timeoutMs`) to continue once a regex matches the screen.

The batch is validated before anything is sent. It stops at the first action that fails (a pattern that never appears, a click the program cannot receive, the process exiting) and reports how far it got, with the screen as it stands. Use it when you already know the steps; when you need to look between steps, use the individual tools.

Input parameters:

- `actions` (array, required): The inputs to send, in order (1 to 50).
- `idleMs` (integer): Settle window after the last action. Default 200.
- `maxWaitMs` (integer): Cap on the settle after the last action. Default 5000.
- `sessionId` (integer, required): Numeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.
- `stepIdleMs` (integer): How long output must be quiet after each action before the next is sent. Default 100. Raise it for programs that redraw slowly.

### `terminal_click` (~494 tokens)

Click in terminal

Deliver a left mouse-button click at a cell in the terminal. Only works when the program currently in the foreground has opted into mouse tracking (vim with `set mouse=a`, fzf, lazygit, less with mouse mode, etc.) — at a plain shell prompt mouse mode is off and the click would just print escape sequences as text, so we refuse the actual click in that case.

Coordinates are 1-indexed and refer to the live screen viewport: col 1, row 1 is the top-left cell, and the bottom-right cell is (terminal width, terminal height) which you can see via `terminal_read`'s state header.

PREVIEW MODE (default `preview: true`): does NOT click. Returns a PNG with a bright magenta ring + dot drawn around the target cell so you can verify your coordinates. Always do this first when you are not 100% sure where the click should land — TUIs often have destructive actions one click away (delete branch, kill process, etc.).

EXECUTE MODE (`preview: false`): actually sends the mouse press+release sequence and settles for output. Use this only after you've previewed and confirmed, or when you're confident.

CAVEATS: `idleMs` and `maxWaitMs` are ignored in preview mode (preview doesn't settle). When the target cell is near the right edge of the viewport, the coordinate label drawn next to the magenta ring may be clipped — the ring itself is always within frame, so trust it over the label.

Input parameters:

- `col` (integer, required): 1-indexed column. Column 1 is the leftmost cell on the visible viewport.
- `filePath` (string): Preview only: absolute path to write the PNG to. If unset, image is inlined as base64.
- `idleMs` (integer)
- `maxWaitMs` (integer)
- `preview` (boolean): When true (DEFAULT), render a PNG with a bright magenta ring around the target cell WITHOUT actually clicking. When false, deliver the click and settle for output. Set to false explicitly when you ar…
- `row` (integer, required): 1-indexed row. Row 1 is the top of the visible viewport.
- `sessionId` (integer, required): Numeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

### `terminal_create` (~527 tokens)

Create terminal session

Spawn a new terminal session and return its sessionId. You must call this before any per-session tool — there is no shared default session. By default the session is an interactive shell. Pass `command` to run one program in the terminal instead (a TUI, a test run, a CLI under test): the session then lasts as long as that program, reports its exit status when it ends, and keeps its final screen readable until you destroy it. If the server already holds 50 live sessions, the least-recently-used one is evicted to make room (its sessionId is tombstoned and any later call against it will respawn with an 'evicted' notice).

Input parameters:

- `cols` (integer)
- `command` (string): Run this command line instead of an interactive shell, e.g. "vim notes.txt" or "npm test". It is run through the session's shell (`sh -c`; on Windows PowerShell `-Command`, or `cmd /c`), so quoting,…
- `cwd` (string): Override the default working directory.
- `env` (object): Environment variables to set for the session, on top of the server's own environment.
- `label` (string): Optional human-readable name shown in terminal_list output (e.g. "dev-server").
- `login` (boolean): Start the shell as a login shell (`-l`), so it reads the profile files (~/.zprofile, ~/.bash_profile, ~/.profile) where PATH is usually set up. Use it when tools that work in the user's own terminal…
- `rows` (integer)
- `scrollback` (integer)
- `shell` (string): Override the default shell (e.g. "/bin/zsh"; on Windows "pwsh.exe" or "cmd.exe" instead of PowerShell).
- `theme` (string): Color palette used by terminal_screenshot and terminal_click previews for THIS session. Persists across auto-respawn / hardReset. Default "dark" (VS Code Dark+). Options: "dark", "light", "solarized-…

### `terminal_destroy` (~102 tokens)

Destroy terminal session

Kill a session and forget the sessionId entirely. The shell process is terminated and the sessionId is *not* tombstoned — future calls against it will error with "Unknown sessionId". Use this when you're explicitly done with a session. Tombstones (which auto-respawn on next access) only happen for system-driven terminations: idle-kill, eviction, or shell exit.

Input parameters:

- `sessionId` (integer, required): Numeric id from terminal_create or terminal_list.

### `terminal_list` (~92 tokens)

List terminal sessions

List every active session and every tombstoned (recently-killed but reserved) sessionId. Tombstones are reservations: the shell is gone but the sessionId can still be called against — doing so respawns a fresh shell under the same id and surfaces the original termination reason (shell-exit, idle-killed, or evicted). Tombstones expire after 30 days; after that the id is gone.

### `terminal_press` (~259 tokens)

Press key in terminal

Press a single named key or key combination. Examples of supported `key` values: `Enter`, `Tab`, `Escape`, `Backspace`, `Space`, `ArrowUp` / `ArrowDown` / `ArrowLeft` / `ArrowRight`, `Home`, `End`, `PageUp`, `PageDown`, `Delete`, `Insert`, `F1`..`F12`, `Ctrl+C`, `Ctrl+D`, `Ctrl+L`, `Ctrl+A`..`Ctrl+Z`, `Shift+Tab`, `Alt+B`, `Ctrl+ArrowLeft`, `Ctrl+Shift+ArrowRight`, etc. Same settle behavior as `terminal_type`.

Input parameters:

- `count` (integer): Press the key this many times in a row (e.g. ArrowUp x 5). Default 1.
- `idleMs` (integer)
- `key` (string, required): Key spec like "Enter", "Ctrl+C", "Shift+Tab", "ArrowUp", "F5", "Ctrl+Shift+ArrowLeft".
- `maxWaitMs` (integer)
- `sessionId` (integer, required): Numeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

### `terminal_read` (~377 tokens)

Read terminal text

Read a window of the terminal buffer. The buffer is the full xterm-emulated state (scrollback + visible viewport) in one contiguous index space. The window is paged from the bottom upward in multiples of `rows`. `rows` defaults to the current screen height and is capped at 1000. `page: 0` is the most recent screen-sized chunk; `page: 1` is the screen before that, and so on. Trailing blank rows are trimmed implicitly.

Input parameters:

- `cursor` (boolean): When true (default), mark the cursor inline with "▌". On an empty cell it takes the place of the blank; on a character it is inserted in front of that character, which shifts the rest of that one lin…
- `highlights` (boolean): When true (default), list text on the current screen that is drawn in reverse video or on a background color — how TUIs show the selected menu entry, tab or button — with its screen row and columns.…
- `joinWrapped` (boolean): When true (default), rows the terminal soft-wrapped at its right edge are joined back into the single long line the program printed. Set to false to get one line per screen row.
- `page` (integer): 0 = newest screen-sized window. N = scroll up N pages (each page = `rows` lines). Past-top clamps.
- `rows` (integer): Window height. Default = current screen height. Max 1000.
- `sessionId` (integer, required): Numeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

### `terminal_reset` (~219 tokens)

Reset terminal

Wipe the terminal buffer and scrollback. By default the shell process keeps running (env vars, cwd, history all preserved). Pass `hardReset: true` to kill the current shell and spawn a brand-new one — anything mid-execution gets killed. When `hardReset: true`, you can also override `cols`, `rows`, `shell`, and `cwd`. In a session created with `command`, a hard reset runs that command again.

Input parameters:

- `cols` (integer): hardReset only: spawn at this width.
- `cwd` (string): hardReset only: working directory for the new shell.
- `hardReset` (boolean): Kill + respawn the shell instead of just clearing the buffer. Default false.
- `rows` (integer): hardReset only: spawn at this height.
- `sessionId` (integer, required): Numeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.
- `shell` (string): hardReset only: shell command (default $SHELL).

### `terminal_resize` (~129 tokens)

Resize terminal

Change the terminal size. Both `cols` and `rows` are optional; omitting one preserves the current value. Resizes both the PTY and the emulator (so programs running inside see the change via SIGWINCH).

Input parameters:

- `cols` (integer): New column count (1..1000). Omit to keep current cols.
- `rows` (integer): New row count (1..1000). Omit to keep current rows.
- `sessionId` (integer, required): Numeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

### `terminal_screenshot` (~176 tokens)

Screenshot terminal

Render a screen-sized window of the terminal to a PNG. Height is always the current screen height (`term.rows`); use `page` to walk back through scrollback in screen-sized increments at the same dimensions as the live screen. If `filePath` is set, the PNG is written there and the path is returned. Large images (>2097152 bytes) are also spilled to a temp file automatically.

Input parameters:

- `filePath` (string): Absolute path to write the PNG to. If unset, image is inlined as base64.
- `page` (integer): 0 = current live screen. N = the screen-sized window N screens earlier. Past-top clamps.
- `sessionId` (integer, required): Numeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

### `terminal_scroll` (~252 tokens)

Scroll in terminal

Turn the mouse wheel over a cell of a full-screen program: scroll a pager, a file list, a log pane. Behaves as a terminal emulator does — programs that track the mouse receive wheel events at that cell (so the pane under it scrolls); full-screen programs that do not (less, man) receive arrow keys instead. At a plain shell prompt there is nothing to scroll and the call fails: earlier output is read with `terminal_read` and its `page` argument, not by scrolling.

Input parameters:

- `amount` (integer): Wheel notches. Most programs move about 3 lines per notch. Default 3.
- `col` (integer): 1-indexed column the pointer is over. Matters when panes scroll independently. Default: screen center.
- `direction` (string, required): "up" moves toward earlier content, "down" toward later.
- `idleMs` (integer)
- `maxWaitMs` (integer)
- `row` (integer): 1-indexed row the pointer is over. Default: screen center.
- `sessionId` (integer, required): Numeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

### `terminal_type` (~285 tokens)

Type into terminal

Type literal characters into the terminal as if a human were pressing keys. Embedded `\n` is normalized to `\r` so `"git push\n"` actually submits. Always waits for the buffer to settle (or to time out) before returning. The wait is capped at 10s; for anything slower (builds, installs, test runs) follow up with `terminal_wait`, which blocks until the command actually finishes.

Input parameters:

- `idleMs` (integer): Settle window: silence this long after the last byte counts as settled. Default 200.
- `maxWaitMs` (integer): Overall cap on the settle wait. Default 5000, clamped to 10000. Use terminal_wait for longer.
- `paste` (boolean): Deliver the text as a single paste instead of keystrokes. Use it for multi-line text going into an editor, a REPL or a shell prompt: programs that support bracketed paste insert it verbatim (no auto-…
- `sessionId` (integer, required): Numeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.
- `text` (string, required): Characters to type. Embedded \n becomes Enter.

### `terminal_wait` (~662 tokens)

Wait for terminal

Block until the terminal reaches a state, instead of guessing with sleeps or polling `terminal_read`. Use it after `terminal_type` for anything that outlives the settle window: builds, installs, test runs, servers starting up.

DEFAULT (no `pattern`): waits for the running command to finish — i.e. for the shell to take the terminal's foreground back and its prompt to go quiet. This asks the kernel who owns the terminal, so it works with any prompt and stays correct while a command is silent (`sleep 60`) or chatty. Returns immediately if the shell is already at its prompt. On Windows this cannot be detected in a shell session: the call waits for a stretch of silence instead and says so — prefer `pattern` there. In a session created with `command`, it waits for that command to exit and reports its exit status. Background jobs (`cmd &`) do not count as running, and inside a nested program (ssh, a REPL, a TUI) the outer shell never regains the foreground until that program exits — use `pattern` there.

\`until: "quiet"`: waits until nothing has been printed for `quietMs` (default 1000), whatever owns the terminal. This is the same "settled" rule `terminal_type` uses, without its 10s cap — for nested programs where completion cannot be detected and no pattern fits.

WITH `pattern`: waits until the regex matches the text on screen (the viewport plus the 200 rows above it). Use this for servers that never exit ("Listening on"), REPL prompts, or TUI states. Text that is already on screen counts, so pick a pattern that only the new output can satisfy.

Returns the screen when the condition is met, or when `timeoutMs` runs out (not an error — the response says the command is still running). In a shell session this does not report an exit status; run `echo $?` afterwards if you need it.

Input parameters:

- `pattern` (string): JavaScript regular expression matched against the screen text, lines joined with "\n" (e.g. "Listening on .*:3000", "^>>>\\s*$", "(?i)error"). `^` and `$` match at the start and end of each line; tra…
- `quietMs` (integer): How long the output must stay silent. With until="command" (default 300) it applies once the shell is back in the foreground, so the prompt has finished drawing; with until="quiet" (default 1000) it…
- `sessionId` (integer, required): Numeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.
- `timeoutMs` (integer): Give up after this long. Default 30000, max 600000.
- `until` (string): "command" (default): the running command has finished and the shell is back at its prompt. "quiet": output has been silent for `quietMs`. Ignored when `pattern` is given.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/computer-agent-labs-terminal-use/terminal-use#diagnostics

## Score history

- 2026-11-05: 91
- 2026-11-04: 91
- 2026-11-03: 90
- 2026-11-02: 90
- 2026-11-01: 90
- 2026-10-31: 89
- 2026-10-30: 89
- 2026-10-29: 88
- 2026-10-28: 88
- 2026-10-27: 87
- 2026-10-26: 87
- 2026-10-25: 86
- 2026-10-24: 86
- 2026-10-23: 85
- 2026-10-22: 85
- 2026-10-21: 69
- 2026-10-20: 71
- 2026-10-19: 71
- 2026-10-18: 71
- 2026-10-17: 71
- 2026-10-16: 71
- 2026-10-15: 71
- 2026-10-14: 71
- 2026-10-13: 40
- 2026-10-12: 39

## Common questions

### What is the terminal-use MCP server?

terminal-use is an MCP server listed in the public MCP registry as io.github.computer-agent-labs/terminal-use. Lets AI agents drive a real terminal: type, press keys, click, read the screen, take screenshots. This page covers its npm package (terminal-use).

### Is the terminal-use MCP server safe to use?

terminal-use scores 91 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the terminal-use MCP server expose?

terminal-use exposes 13 tools: terminal_batch, terminal_click, terminal_create, terminal_destroy, terminal_list, and 8 more. Their descriptions and schemas cost roughly 4,001 tokens of context every time the server is loaded.

### Is the terminal-use MCP server still maintained?

terminal-use is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the terminal-use MCP server under?

terminal-use declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/terminal-use
- Socket report: https://socket.dev/npm/package/terminal-use
- Repository: https://github.com/computer-agent-labs/terminal-use
- Changelog RSS feed: https://verifymcp.io/servers/computer-agent-labs-terminal-use/terminal-use.xml
- Changelog JSON feed: https://verifymcp.io/servers/computer-agent-labs-terminal-use/terminal-use.json
- HTML version of this page: https://verifymcp.io/servers/computer-agent-labs-terminal-use/terminal-use
