MCP server for running VHS (Video for Demos) tape files and capturing terminal UI screenshots
This server provides two well-defined tools for VHS tape execution and terminal UI screenshot capture. Both tools have explicit input schemas with type definitions and descriptions. However, there are notable gaps in output documentation, parameter validation guidance, and error handling. Tool descriptions are adequate but lack the actionable detail that would help LLMs select tools strategically (e.g., when to use vhs_run_tape vs tui_snap_after). Parameter descriptions exist but could be more prescriptive about constraints, defaults, and error conditions. The code shows good input validation logic (e.g., mutual exclusivity check in toolRunTape, enum-like switch for VHS key names) but this is not surfaced in the schema descriptions where LLMs can see it. Output is partially documented (file:// URI list returned) but the schema structure of the returned content is not formally declared to the MCP layer.
Run a command via VHS, wait for regex, take a PNG screenshot.
Run a VHS tape and return produced file URIs (png/gif/etc).
Output schema not formally declared to MCP. Both tools return file:// URIs in a custom ArtifactList struct, but the MCP tool definition does not specify the output schema. LLMs cannot introspect what fields to expect in the response, forcing them to infer structure from textual output.
Parameter descriptions lack prescriptive constraints. 'Timeout seconds (default 120)' does not state the valid range (min 1? max 3600?). 'Command to run' does not explain what shell syntax is supported or whether special characters are escaped. Descriptions should be prompt-engineering-optimized with explicit constraints.
Tool descriptions do not clarify mutual exclusivity or decision logic. vhs_run_tape accepts either tape_text OR tape_path but the description does not explain when to use which. The code enforces this (returns error if both/neither provided) but the schema description is silent, forcing LLMs to guess or experiment.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 43 | - | v1 |
No recovery guidance in error handling. If VHS times out or fails, the error message ('vhs timed out', 'vhs run error: <err>') is returned but does not guide the LLM on next steps (retry with longer timeout? simplify the tape script? check VHS binary presence?).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Both tools have WRITE risk (they create files) but the MCP tool definitions do not declare destructiveHint or track which operations are idempotent. This limits the MCP client's ability to apply safety policies.
Parameter type ambiguity in tui_snap_after.keys. Declared as array of strings with description 'Extra keystrokes (e.g., ["Down","Enter"])' but the code shows special handling for a fixed set of key names (Up, Down, Left, Right, Enter, Tab, Space, Backspace, PageUp, PageDown, Escape) vs. arbitrary text strings. This should be an enum of valid key names, not a free-form string array.