Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

terminal-use

NPM · TERMINAL-USE

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

Available components

+3 this week 91 Trust /100

Last scanned (21 hours ago)

Scores higher than 94% of npm servers

Category Developer Tools

Trust breakdown (7 categories)

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. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 0 of 24 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to computer-agent-labs/terminal-use). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 13 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability75
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • 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. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management70
  • Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage95
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 86% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 +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.

  • 1 Nov 26 +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.

  • 30 Oct 26 +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.

  • 28 Oct 26 +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.

  • 26 Oct 26 +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.

  • 24 Oct 26 +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.

  • 22 Oct 26 +16
    • Malware scan: unverified → pass ▲ security
  • 21 Oct 26 −2
    • Malware scan: pass → unverified ▼ security
    • Provenance: fail → pass ▲ security
    • The attested source repository moved: computer-agent-labs/terminal-use security
    • Stability: unverified → 0.23 ▲ functional
    • Package version: 0.1.1 → 0.2.1 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Analysed npm/terminal-use@0.2.1

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo computer-agent-labs/terminal-use
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/computer-agent-labs/terminal-use/.github/workflows/release.yml@refs/tags/v0.2.1
Rekor log index 3361597778
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:2e3d99bbd662776183f1340e9dfe255d4b65a8de9af3d73ea66a9f9c749c6f64ab2da4b8da19282e49d80b573921a6dcec582d89703d94386e98e5eb7

Background: How many MCP packages publish verified provenance →

Dependencies 24 packages
Packages resolved 24
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 13 exposed · ~4,001 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
terminal_batch ~427

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.

NameTypeReqDescription
actionsarrayyesThe inputs to send, in order (1 to 50).
idleMsinteger–Settle window after the last action. Default 200.
maxWaitMsinteger–Cap on the settle after the last action. Default 5000.
sessionIdintegeryesNumeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.
stepIdleMsinteger–How long output must be quiet after each action before the next is sent. Default 100. Raise it for programs that redraw slowly.

No output schema declared.

No examples provided.

terminal_click ~494

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.

NameTypeReqDescription
colintegeryes1-indexed column. Column 1 is the leftmost cell on the visible viewport.
filePathstring–Preview only: absolute path to write the PNG to. If unset, image is inlined as base64.
idleMsinteger––
maxWaitMsinteger––
previewboolean–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…
rowintegeryes1-indexed row. Row 1 is the top of the visible viewport.
sessionIdintegeryesNumeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

No output schema declared.

No examples provided.

terminal_create ~527

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).

NameTypeReqDescription
colsinteger––
commandstring–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,…
cwdstring–Override the default working directory.
envobject–Environment variables to set for the session, on top of the server's own environment.
labelstring–Optional human-readable name shown in terminal_list output (e.g. "dev-server").
loginboolean–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…
rowsinteger––
scrollbackinteger––
shellstring–Override the default shell (e.g. "/bin/zsh"; on Windows "pwsh.exe" or "cmd.exe" instead of PowerShell).
themestring–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-…

No output schema declared.

No examples provided.

terminal_destroy ~102

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.

NameTypeReqDescription
sessionIdintegeryesNumeric id from terminal_create or terminal_list.

No output schema declared.

No examples provided.

terminal_list ~92

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

terminal_press ~259

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`.

NameTypeReqDescription
countinteger–Press the key this many times in a row (e.g. ArrowUp x 5). Default 1.
idleMsinteger––
keystringyesKey spec like "Enter", "Ctrl+C", "Shift+Tab", "ArrowUp", "F5", "Ctrl+Shift+ArrowLeft".
maxWaitMsinteger––
sessionIdintegeryesNumeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

No output schema declared.

No examples provided.

terminal_read ~377

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.

NameTypeReqDescription
cursorboolean–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…
highlightsboolean–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.…
joinWrappedboolean–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.
pageinteger–0 = newest screen-sized window. N = scroll up N pages (each page = `rows` lines). Past-top clamps.
rowsinteger–Window height. Default = current screen height. Max 1000.
sessionIdintegeryesNumeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

No output schema declared.

No examples provided.

terminal_reset ~219

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.

NameTypeReqDescription
colsinteger–hardReset only: spawn at this width.
cwdstring–hardReset only: working directory for the new shell.
hardResetboolean–Kill + respawn the shell instead of just clearing the buffer. Default false.
rowsinteger–hardReset only: spawn at this height.
sessionIdintegeryesNumeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.
shellstring–hardReset only: shell command (default $SHELL).

No output schema declared.

No examples provided.

terminal_resize ~129

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).

NameTypeReqDescription
colsinteger–New column count (1..1000). Omit to keep current cols.
rowsinteger–New row count (1..1000). Omit to keep current rows.
sessionIdintegeryesNumeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

No output schema declared.

No examples provided.

terminal_screenshot ~176

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.

NameTypeReqDescription
filePathstring–Absolute path to write the PNG to. If unset, image is inlined as base64.
pageinteger–0 = current live screen. N = the screen-sized window N screens earlier. Past-top clamps.
sessionIdintegeryesNumeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

No output schema declared.

No examples provided.

terminal_scroll ~252

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.

NameTypeReqDescription
amountinteger–Wheel notches. Most programs move about 3 lines per notch. Default 3.
colinteger–1-indexed column the pointer is over. Matters when panes scroll independently. Default: screen center.
directionstringyes"up" moves toward earlier content, "down" toward later.
idleMsinteger––
maxWaitMsinteger––
rowinteger–1-indexed row the pointer is over. Default: screen center.
sessionIdintegeryesNumeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.

No output schema declared.

No examples provided.

terminal_type ~285

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.

NameTypeReqDescription
idleMsinteger–Settle window: silence this long after the last byte counts as settled. Default 200.
maxWaitMsinteger–Overall cap on the settle wait. Default 5000, clamped to 10000. Use terminal_wait for longer.
pasteboolean–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-…
sessionIdintegeryesNumeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.
textstringyesCharacters to type. Embedded \n becomes Enter.

No output schema declared.

No examples provided.

terminal_wait ~662

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.

NameTypeReqDescription
patternstring–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…
quietMsinteger–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…
sessionIdintegeryesNumeric id of the session to target. Get one by calling terminal_create. Use terminal_list to enumerate currently-known ids.
timeoutMsinteger–Give up after this long. Default 30000, max 600000.
untilstring–"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.

No output schema declared.

No examples provided.

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.

npm · terminal-use

# add to Claude Code
claude mcp add computer-agent-labs-terminal-use -- npx -y terminal-use
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 4 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 4 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.