MCP server exposing iTerm2 to agents for observation and non-destructive annotation.
Server has 13 well-named tools with consistent verb_noun patterns (list_, get_, set_, post_). All tools have descriptions (avg ~80 chars, within baseline). Input schemas are present and typed for all tools. However, descriptions are terse and lack context for LLM selection, most are single-sentence statements without WHEN/WHY guidance. Parameter descriptions are minimal (e.g., 'Optional session ID' repeated 11 times). Output schemas are not documented, LLMs cannot predict response structure. Error handling is generic (RuntimeError wrapping). No pagination, no result limits documented, no recovery guidance. Security is reasonable (no secrets in params, read-only tools marked), but write tools lack confirmation patterns.
Return output since the given cursor (or the full available buffer if no cursor).
Return the visible buffer text and cursor position for a session.
Return the last N lines of scrollback (default 200, max 5000).
Return currently-selected text in the session, or empty string.
Return title, working dir, profile, badge, dimensions, TTY for a session.
Read an iTerm2 variable by fully-qualified name. Examples: session.path, user.badge, tab.title, window.name.
List available iTerm2 profiles by name and GUID.
Output schemas not documented. LLMs cannot predict response structure (e.g., what fields does list_sessions return? Is it {windows: [...]} or {sessions: [...]}?). This forces agents to guess and wastes tokens on trial-and-error.
Parameter descriptions are generic and repeated. 11 tools have 'Optional session ID; if not provided, uses ITERM_SESSION_ID environment variable', this is boilerplate that doesn't help LLMs understand when to use each tool or what session_id means in context.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
List all windows, tabs, and sessions iTerm2 currently has open.
Post a macOS notification (banner) with the given title and body.
Set the session badge text. Requires \(user.badge) in the profile's badge format.
Set the tab tint as RGB (each component 0-255).
Override the session title. Rendering depends on profile title settings.
Set a user-scoped session variable. Name must start with 'user.'.
Tool descriptions lack WHEN/WHY context. 'Return the visible buffer text and cursor position for a session' doesn't explain when to call get_screen_contents vs get_scrollback vs get_recent_output. LLMs cannot disambiguate similar read tools.
Write tools (set_badge, set_title, set_tab_color, set_user_variable, post_notification) lack confirmation or dry-run patterns. Agents can invoke destructive operations without safeguards. No guidance on what happens if the operation fails.
Error handling is generic (RuntimeError wrapping). No recovery guidance. If set_badge fails because the profile doesn't have \(user.badge) in its format, the error message doesn't tell the LLM what to do next (e.g., 'Check profile settings' or 'Call list_profiles to find compatible profiles').