MCP server that renders interactive xterm.js terminals inline in Claude Code and Claude Desktop
Terminal App has clear, well-structured tool definitions with good naming conventions (verb_noun pattern: terminal-show, terminal-write, terminal-read, terminal-create, terminal-list, terminal-close, terminal-refresh). All 7 tools have descriptions (avg ~120 chars, within 10-1024 baseline). Input schemas are present and use Zod validation with type definitions. However, output schemas are not documented, callers cannot see what fields to expect from responses. Error handling is basic (generic 'No such session' text). Tool descriptions lack actionable recovery guidance and dependency hints. Parameters are well-described but lack explicit constraints (e.g., no min/max for height/width pixels, no enum for color format). Missing tool annotations (readOnlyHint, destructiveHint) despite clear risk levels (READ_ONLY, WRITE, DESTRUCTIVE).
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 for a terminal session.
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.
Output schemas not documented. Callers cannot see what fields terminal-list, terminal-read, or terminal-write return. LLMs cannot plan downstream operations or extract required data (e.g., sessionId from terminal-create response).
Missing tool annotations. Tools have explicit risk levels (READ_ONLY, WRITE, DESTRUCTIVE) but do not register readOnlyHint, destructiveHint, or idempotentHint. Agents cannot determine which tools are safe to retry or have side effects.
Error handling lacks recovery guidance. 'No such session' error does not suggest next steps (e.g., 'Call terminal-list to see active sessions'). Errors do not categorize as retryable vs. fatal.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 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.
Parameter constraints missing. height/width accept numbers but lack min/max bounds (e.g., 'height in pixels, 200 - 2000'). color accepts CSS strings but no validation hint. Agents may pass invalid values.
terminal-list description is minimal ('Lists all active terminal sessions with their IDs, labels, and titles'). Does not explain when to call it or what structure it reveals. Should guide: 'Call this first to discover available sessions before writing to one.'