MCP server and CLI giving AI agents persistent, PTY-backed shell sessions. On Unix a background daemon keeps them alive across client restarts and attach/watch put a human at the same terminal; on Windows there is no daemon and sessions end with the client.
Holdfast defines 8 tools with complete input schemas and descriptions. Naming follows verb_noun convention (start_session, read_output, send_input, terminate, status, list_sessions, get_command_history, wait_for_pattern). Descriptions are present and substantive (80-200 chars typical). However, output schemas are not documented, LLMs cannot predict response structure for downstream chaining. Parameter descriptions are good but lack explicit constraints (e.g., max_bytes has a default and max but no enum/pattern). Error handling is mentioned in code but not surfaced in tool descriptions. Security considerations (redaction_disabled flag, secret injection via profiles) are present but not explicitly documented in parameter descriptions.
Get the command history for a PTY-backed session
List all active and retained PTY-backed sessions
Read output from a PTY-backed session, with optional redaction and formatting
Send input to a PTY-backed session with a hard cap of 64 KiB per payload
Start a new PTY-backed shell session, either with a direct command or via an operator-declared profile
Get the status of a PTY-backed session
Terminate a PTY-backed session with optional grace period
Output schemas not documented. LLMs cannot predict response structure (e.g., what fields does status() return? Is it {state, exit_code, pid}?). This breaks tool chaining and forces agents to guess.
Parameter constraints not fully specified in descriptions. max_bytes has a default (32 KiB) and max (256 KiB) but description does not state these bounds. timeout_secs similarly lacks explicit range in description text (only in schema). LLMs cannot read JSON Schema, they need constraints in descriptions.
Error handling not documented in tool descriptions. Tools can fail (e.g., session not found, regex timeout, invalid profile) but descriptions do not guide LLM recovery. No 'try X first' hints or error classification.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Wait for a regex pattern to appear in session output with configurable timeout
Mutually exclusive parameters (command vs profile in start_session) documented in description but not enforced at schema level. LLMs may pass both, causing ambiguity.
Security-sensitive parameters (redaction_disabled, profile with keychain credentials) lack explicit warnings in descriptions. LLMs may not understand the risk of disabling redaction or passing credentials.