MCP server that renders interactive xterm.js terminals inline in Claude Code and Claude Desktop
This server demonstrates moderate definition quality with some strengths and notable gaps. All 7 tools are explicitly registered with names and descriptions visible in server.ts. Tool names follow clear verb-noun patterns (terminal-show, terminal-write, terminal-read, terminal-create, terminal-list, terminal-close, terminal-refresh). Descriptions are present and contextually helpful, most fall in the 100-200 character range, which is reasonable. However, parameter descriptions vary significantly in completeness. The tabConfigSchema (used by terminal-show and terminal-create) has well-described nested properties via Zod annotations. The sessionId parameter is consistently documented across tools. Notable gap: terminal-write's data parameter description mentions real newlines and PTY conversion but lacks guidance on what happens when data is omitted (polling behavior). Output schemas are not explicitly documented in the visible code, we infer structure from descriptions (e.g., terminal-read returns ANSI-stripped output, terminal-list returns active sessions) but this is not formally stated. Error handling is present but minimal: no guidance on recovery paths, no categorization of retryable vs fatal errors. No tool annotations (readOnlyHint/destructiveHint/idempotentHint) are visible despite the risk model being partially present (WRITE, READ_ONLY, DESTRUCTIVE, REVERSIBLE are labeled but not expressed in tool metadata). No security documentation regarding secret injection or permission gates. Overall, the server is usable but would benefit from explicit output schemas, structured error guidance, and tool annotations.
Closes a terminal session.
Creates one or more terminal tabs/sessions. Use this instead of terminal-show when the terminal UI is already open. New sessions appear as tabs automatically. Defaults to one bash tab if tabs is omitted.
Lists all active terminal sessions with their IDs, labels, and titles.
Returns recent terminal output (ANSI-stripped). Use this to read what's on screen.
Clears the output buffer of a terminal session without affecting the running process.
Opens the terminal UI and starts one or more sessions. Only call this ONCE to open the terminal. To create additional sessions (tabs) after the terminal is already open, use the terminal-create tool instead — calling terminal-show again will duplicate the UI. Defaults to one bash tab if tabs is omitted.
No formal output schema documentation. Tool return types are inferred from descriptions (e.g., 'Returns recent terminal output') but not explicitly specified as JSON Schema. LLMs cannot reliably plan downstream tool chains without documented response structures.
No tool annotations for risk classification. Tools are internally labeled as WRITE/READ_ONLY/DESTRUCTIVE/REVERSIBLE but this is not exposed via MCP tool metadata (readOnlyHint, destructiveHint, idempotentHint). Agents cannot determine which tools are safe to retry or have side effects.
Minimal error handling and recovery guidance. Errors return bare text ('No such session') without categorizing whether the error is retryable, user-fixable, or fatal. No suggestions for recovery paths (e.g., 'Try terminal-list to find valid sessionIds').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 50 | 2026-07-28+ | v2 |
Writes input to a terminal session. To press Enter, include a real newline character in the data value (not a literal backslash-n). Real newlines are converted to \r (carriage return) for PTY compatibility. Omit data to poll for new output (returns buffered output). Use terminal-read to see full terminal history.
Vague descriptions for read-only tools. terminal-read description is only 37 characters ('Returns recent terminal output (ANSI-stripped). Use this to read what's on screen.'). It does not specify output format, buffering strategy, or when to use it vs terminal-write with data omitted (polling). terminal-list description is even shorter at 48 characters.
Incomplete parameter documentation for terminal-read and terminal-close. Both accept only sessionId, which is documented, but there is no guidance on what happens if the sessionId is invalid or the session has already exited. Users must infer behavior from error messages.
terminal-write description conflates two distinct operations (writing data + polling). The description says 'Omit data to poll for new output' but this is a single parameter that toggles behavior. This ambiguity risks the LLM not understanding when to use it for polling vs writing, or mixing the two intentions.
No documented limits or constraints. MAX_HISTORY (100K) and MAX_OUTPUT_BUFFER (100K) are hardcoded in the implementation but not exposed in tool descriptions. Agents cannot know buffer limits or predict when history will be truncated.