Native Herdr MCP runtime and supervisor - gated workstation control, Edge routing, browser continuity, and handoff
herdr-mcp provides 14 tools with generally clear naming (verb_noun pattern: herdr_inspect, herdr_exec_start, herdr_fs_read) and detailed descriptions (avg ~250 chars, well above baseline 194). However, schema completeness is inconsistent: some tools (herdr_exec_start, herdr_git) have full JSON Schema with types and descriptions; others (herdr_inspect, herdr_since, herdr_methods) show only {} or minimal input specs in the provided source. Output schemas are undocumented across all tools, LLMs cannot predict return structure. Error handling descriptions exist but lack recovery guidance (e.g., 'agent_blocked' status mentioned but no suggested next steps). Security is strong (no secrets in params, path validation via fs_security module), but composition could be tighter: herdr_call is a generic passthrough that duplicates functionality of domain-specific tools.
Generic passthrough to the herdr socket API, VALIDATED against the live schema (schema reflected from the installed herdr binary, 60s cache). Params are checked before sending: missing required / wrong type / wrong enum -> invalid_params error (no socket call); unknown params -> warnings. Call herdr_methods first when the schema is unknown; prefer explicit pane_id/workspace_id over bare names. For agent.prompt prefer herdr_prompt (fire-and-forget + idempotency_key + delivery evidence); do not pass wait on mutations unless you intentionally want submit+wait. Never blind-retry a mutating call after failure — delivery may be uncertain; verify with herdr_inspect / herdr_since first. Status-wait timeouts are failure agent_status_wait_timeout (not herdr_transport).
Terminate an execution session
Read output from an execution session with stream selection and offset/limit
Start an execution session with command or program+args, with optional protected transport for sensitive paths
Wait for execution session output with bounded timeout and polling
herdr_inspect, herdr_since, herdr_methods have empty or minimal input schemas ({}). LLMs cannot validate parameters before calling.
No output schemas documented for any tool. LLMs cannot predict return structure (fields, types, pagination). Baseline: 100% of A+ tools document return types.
herdr_call is a generic passthrough that duplicates domain-specific tools (herdr_prompt, herdr_exec_start, herdr_git). Violates single-responsibility principle; increases LLM reasoning overhead.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Search files with regex pattern and glob matching
Read and preview image files with automatic format conversion and resizing
List directory contents with optional recursion and filtering
Read file content with line/byte range selection and truncation handling
Execute git operations (status, diff, log, identity) with bounded output and compaction
Check herdr connection and list workspaces (with cwd), tabs, panes, and agents in one call. Also returns workstation_info: default_cwd hints, server/build, readonly/write_roots, and a short exec_environment summary (PATH binaries relevant to local coding). Agents come from the shared SnapshotCache (live events + 30s snapshot fallback) and carry started_at + last_activity_at. If session.snapshot blips (TaskGroup), falls back to workspace.list / pane.list / agent.list and sets warnings[] — do not treat that as a repo blocker; keep using herdr_fs_* / herdr_git / herdr_exec. YOU (web) are the planner/orchestrator. Prefer herdr_fs_* / herdr_exec / herdr_git before any herdr_prompt. Agent lists soft-hide expensive kinds (Claude/OMP/Codex); only allowlisted workers (pi, cline, opencode, anti) and auditors (droid, grok) appear — override with HERDR_MCP_AGENT_ALLOW. herdr_prompt by known name/pane_id is NOT blocked. Prefer explicit pane_id/workspace_id from this view.
Discover herdr socket API methods and parameter schemas. LIVE reflection from the installed herdr binary (herdr api schema, 60s cached). Use before herdr_call when you don't know the exact method or argument names.
Send a prompt to a herdr agent via socket agent.prompt (NEVER pane.send_text). Prefer herdr_fs_* / herdr_exec when the work is deterministic file/shell IO (no local API burn). Target a cheap/fast worker (pi, flash, …) with a self-contained task; do NOT prompt Claude/OMP/main to plan or to command other panes — the web client owns orchestration. DEFAULT: fire-and-forget (omit wait); confirm with herdr_since / herdr_inspect. Strongly prefer idempotency_key (replays return stored result; never auto-retried). Returns delivery evidence: submitted, before/after, state_observation ({changed:true|false|"unknown", fresh}), plus legacy state_changed. Blocked target -> status 'agent_blocked', submitted:false. Optional wait {until, timeout_ms} is submit+wait; a status-wait timeout is failure_phase post_submission_status_wait (not a socket transport failure) — verify before re-sending. Worker invariant: project root == pane cwd == foreground cwd.
Incremental digest since a cursor — cheap conversation-resume primitive (❺). MCP clients only run when the user sends a message, so polling is not an option; pass the cursor from your last call to get only NEW events. Returns: events[] (pane/workspace/tab changes with cursor+at), current agents[] (status/started_at/last_activity_at/cwd), workspaces[], and a new cursor. First call (cursor=0) returns the recent tail. The server keeps a live events.subscribe stream (A-2) so this is a single round-trip instead of inspect+read+explain. Events/agents carry explicit pane_id/workspace_id — prefer those IDs over labels when addressing targets later.
Error descriptions lack recovery guidance. E.g., 'agent_blocked' status mentioned in herdr_prompt but no suggested next steps. Baseline: error responses must tell LLM what to do next.
herdr_fs_read, herdr_fs_list, herdr_fs_grep, herdr_fs_image descriptions are generic (55-60 chars). Missing context on when to use each vs alternatives, and no dependency hints (e.g., 'call herdr_fs_list first to discover files').