herdr-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HC_SESSION | No | The hc session to reach, as for `hc` itself | |
| HERDR_MCP_HC | No | The `hc` binary (default: `hc` on `PATH`) | hc |
| HERDR_MCP_APP | No | The `herdr-app` binary (default: `herdr-app` on `PATH`) | herdr-app |
| HC_TERMINAL_ID | No | Set automatically inside a Herdr terminal. Passed as the caller, so terminals you start are your children and `herdr_wait` with `children` works. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| herdr_listA | Live terminals on this machine and every connected machine, with their status, cwd, labels and parent. Includes the user's other work, not just yours. |
| herdr_getB | One terminal's facts, live or finished: argv, cwd, state, status, exit code, labels, foreground process. |
| herdr_runA | Start a program in a new terminal that stays alive. argv runs as given; line runs in the shell; neither opens that machine's shell. If argv[0] names a template (see herdr_templates), its command starts and its body plus |
| herdr_sendA | Paste text into a terminal and press Enter (once nobody has typed for ~3 s). Refuses a blocked program unless force. With wait=true, also waits for the turn it starts and returns how it ended. Do not resend after an unclear result: read first. |
| herdr_waitA | Wait until a program is not working (an agent reports idle/done/blocked/error, or a program exits), or with |
| herdr_readB | The terminal's screen plus |
| herdr_keysB | Press named keys in a terminal: enter, esc, tab, up, down, ctrl+c, alt+x, f5, a, ... (e.g. to answer a dialog with down, enter). |
| herdr_interruptA | Press the stop key (esc for agents, ctrl+c for programs) and report what happened. Stops the current turn, not the process. |
| herdr_killA | End the program: hangup, then terminate, then kill. Only clean up terminals you started. |
| herdr_rmC | Remove a finished terminal from the list. |
| herdr_labelB | Set or remove labels (free-form key=value). An empty string removes a label. |
| herdr_putA | Write a file beside a live terminal, on its machine, for its program to read (an image to paste, a patch). Returns where it landed. |
| herdr_templatesA | Ready-made agent roles (reviewer, implementer, ...) by name and description. Run one with herdr_run argv=[name] and a task. |
| herdr_execA | Run one command here or on another machine without a terminal and return its exit code and exactly what it wrote. For short commands (git diff, ls, cat). Everything it started ends with it at exit or timeout. Use herdr_run for anything long or interactive. |
| herdr_file_readA | Read a text file here or on another machine: lines from offset, at most limit. Returns the text and how many lines the file has. |
| herdr_file_writeA | Write a whole file here or on another machine, making missing folders. Atomic: a reader sees old or new, never half. |
| herdr_file_editA | Replace exact text in a file here or on another machine. Each |
| herdr_machinesA | The other machines this core has added (over ssh or a command), with their connection state. Use their names in |
| herdr_statusB | herdr-core's identity, version, pid, uptime and terminal counts, plus this server's connection details. |
| herdr_rpcA | Call any herdr-core JSON-RPC method directly (rpc.discover lists them all with their schemas). For methods without a dedicated tool: doc.get, doc.set, machine.add, machine.connect, machine.rename, machine.rm, terminal.keep. server.stop and server.restart are refused: they affect every terminal the user has. |
| herdr_app_lsA | Spaces, their tabs and terminals (with pane IDs) in the open Herdr window. Inspect before acting; use these IDs rather than guessing. |
| herdr_app_statusB | What the window shows: layout, selected space and tab, focused pane, overlays, zoom, and any file or mod errors. |
| herdr_app_commandsA | Every window command herdr_app_do can run, with its arguments and what it does. |
| herdr_app_doA | Run a window command: space.new {name, folder, machine, argv, task}, tab.new {name, space, folder, argv, task}, pane.split {direction, pane}, agent.focus {terminal}, tab.select {id}, space.rename {id, name}, ... (herdr_app_commands lists them all). Returns the created IDs. Supply every required argument: commands from an agent never open a dialog. New spaces and tabs are shown immediately: only create them when the user asks, and give them explicit names. |
| herdr_app_shotA | Save the window's last rendered frame as a PNG (its own rendering, even when covered) and return its absolute path. Needs a running window. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 25 tools
Tools are well-differentiated: exec vs run (short vs long/interactive), read (screen) vs get (facts) vs file_read, and send (text) vs keys (named keys) have clear boundaries. The only mild overlaps are put vs file_write (file beside terminal vs atomic whole-file write) and app_do vs rpc, but descriptions draw the line.
Consistent herdr_ prefix with predictable verb_noun (herdr_file_read, herdr_app_do, herdr_kill). A few are nouns (herdr_templates, herdr_machines) for list-like resources, but the herdr_app_* family is grouped cleanly and no style mixing (camelCase) appears.
25 tools is at the heavy edge and spans several sub-domains (terminal control, file ops, app/window, machines, templates). Each earns its place, but some could consolidate (exec/run, app_ls/app_status), landing it borderline rather than well-scoped.
Strong lifecycle coverage: run/send/keys/interrupt/kill/rm/wait/read for terminals, full read/write/edit for files, plus window and machine introspection. A few operations (machine add/connect) are only reachable via herdr_rpc, but that escape hatch plus rpc.discover prevents dead ends.