dsh-relay
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DSH_RELAY_HOST_URL | No | Loopback Harness Host URL. | http://127.0.0.1:3080/ |
| DSH_RELAY_MAX_IMAGES | No | Maximum images per message. | 20 |
| DSH_RELAY_STATE_FILE | No | Persistent Relay state location. | %LOCALAPPDATA%/dsh-relay/state.json |
| DSH_RELAY_RUN_STALL_MS | No | No-progress interval before an active run is marked needs_attention; later progress resumes it automatically. | 300000 |
| DSH_RELAY_RPC_TIMEOUT_MS | No | Host RPC timeout. | 30000 |
| DSH_RELAY_MAX_IMAGE_BYTES | No | Maximum decoded bytes per image. | 5242880 |
| DSH_RELAY_MAX_ISTORY_PAGES | No | Maximmum durable-hitory pages read during one reconciliation. | 100 |
| DSH_RELAY_POLL_INTERVAL_MS | No | Active-run polling interval. | 750 |
| DSH_RELAY_CLIENT_PRINCIPAL_ID | No | Stable local caller identity used with idempotency keys. | local-user |
| DSH_RELAY_MAX_TASK_CHARACTERS | No | Maximum text characters in one prompt. | 100000 |
| DSH_RELAY_PERSIST_PROMPT_TEXT | No | Persist prompt summaries when explicitly acceptable. | false |
| DSH_RELAY_PERMISSSION_LEASE_MS | No | Maximmum lifetime recorded for a reused-sesssion permission lease. | 86400000 |
| DSH_RELAY_ALLOWED_WORKSPACE_ROOTS | No | OS-delimited list of additional authorized absolute roots. Without it, Relay accepts only workspaces already registered by Harness. | Harness workspace registry |
| DSH_RELAY_MAX_MESSAGE_IMAGE_BYTES | No | Maximum decoded image bytes per message. | 104857600 |
| DSH_RELAY_MAX_ASSISTANT_TEXT_BYTES | No | Maximum returned assistant-text tail. | 256000 |
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 |
|---|---|
| doctorA | Check the external Harness Host and relay policy without reading credentials. |
| setup_planB | Generate a validated, no-write MCP configuration patch for Codex, Claude Code, Cursor, or OpenCode V2. |
| setup_doctorA | Return a machine-readable setup report from explicitly supplied probes without reading or modifying client configuration. |
| start_serviceA | Attach an authorized workspace to the existing Harness Host. This never starts or modifies Harness. |
| open_serviceB | Open the stable loopback Harness page for an attached service. |
| list_servicesB | List Host attachments restored from durable relay state. |
| list_workspacesA | List the native Harness workspace registry used by Relay routing. |
| list_workspace_sessionsA | List reusable native sessions accounted to one registered Harness workspace without reading conversation content. |
| stop_serviceA | Forget one relay attachment without stopping or changing the external Harness Host. |
| list_capabilitiesA | List native Provider/model/reasoning, agent preset, and permission preset options without guessing names. |
| start_runA | Create or reuse a native Harness session, select provider/model/reasoning, agent preset, and native permission preset, then submit the first task and return a stable session link. Task parameters are path-reference-only: provide the authorized workspace, reviewTargets, contextReadScope, excludedPaths, writeScope, and acceptance criteria. reviewTargets identify what to assess; they are not a read whitelist. contextReadScope declares where Harness may search and read supporting implementation, tests, configuration, and architecture material. Never embed source text, diffs, file dumps, encoded source, or repository archives. Harness reads named files from the authorized workspace itself. These fields are task instructions, not enforced per-path filesystem isolation. The selected Harness model may send content it reads to its configured model provider even though Relay itself uses a loopback address. Sharing webUrl is not completion: keep wait_run until a terminal status, then consume assistantText. |
| start_reviewA | Create or reuse a native Harness session with the permission preset fixed to read-only. Exact provider, model, and authorizationBasis are required so the user's existing named-model request is machine-identifiable on the first attempt; do not ask the user to repeat that authorization solely because provider processing is external. Task parameters are path-reference-only: provide the authorized workspace, reviewTargets, contextReadScope, excludedPaths, writeScope, and acceptance criteria. reviewTargets identify what to assess; they are not a read whitelist. contextReadScope declares where Harness may search and read supporting implementation, tests, configuration, and architecture material. Never embed source text, diffs, file dumps, encoded source, or repository archives. Harness reads named files from the authorized workspace itself. These fields are task instructions, not enforced per-path filesystem isolation. The selected Harness model may send content it reads to its configured model provider even though Relay itself uses a loopback address. After start succeeds, share webUrl and keep wait_run until succeeded/failed/cancelled/needs_attention. The calling agent MUST read assistantText before claiming the review is done. If the parent user asked to review then fix, apply accepted findings only after the run is terminal; do not treat a still-running review as finished. |
| steer_runA | Durably insert a correction into an active run. Task parameters are path-reference-only: provide the authorized workspace, reviewTargets, contextReadScope, excludedPaths, writeScope, and acceptance criteria. reviewTargets identify what to assess; they are not a read whitelist. contextReadScope declares where Harness may search and read supporting implementation, tests, configuration, and architecture material. Never embed source text, diffs, file dumps, encoded source, or repository archives. Harness reads named files from the authorized workspace itself. These fields are task instructions, not enforced per-path filesystem isolation. The selected Harness model may send content it reads to its configured model provider even though Relay itself uses a loopback address. |
| get_runA | Preferred tool to reconcile and return one run snapshot; replaces the deprecated status_run alias. If status is running or unknown, hostPollContract.hostMustCallWaitRunAgain is true and the host must not conclude. |
| get_run_summaryB | Project the current durable run snapshot into stable status, model, permission, elapsed time, and next-action fields. |
| read_notificationsA | Read the bounded in-process notification projection after a cursor; cursor gaps return explicit resynchronization metadata. |
| status_runA | Deprecated compatibility alias; use get_run. Scheduled for removal in 0.3.0. |
| open_runA | Open the native Harness Web session in the operating system default browser. Call only when the user explicitly asks to open or show the Harness page. |
| wait_runA | Poll durable Host history for at most 30 seconds and return the latest snapshot plus hostPollContract. Call this native MCP tool directly; never poll through a temporary Node, PowerShell, Python, or shell client. A timeout is a slice, not completion. If hostPollContract.hostMustCallWaitRunAgain is true, you MUST call wait_run again immediately. Do not send a final user answer, mark the delegated task complete, or skip consuming assistantText while the run is still running. Unrelated shell or background-task notifications are not authorization to stop polling. |
| list_runsC | Reconcile and list runs restored from durable relay state. |
| get_operationA | Read the durable idempotent operation record for a start, reply, steer, or cancel request. |
| reconcile_operationA | Compare an uncertain operation with durable Harness events without submitting a duplicate request. |
| reconcile_permissionsB | Retry restoration of the previous native permission preset for a session that requires attention. |
| reply_runB | Submit a new queued turn to the completed run session, optionally selecting a different model, and track it as a new run. Task parameters are path-reference-only: provide the authorized workspace, reviewTargets, contextReadScope, excludedPaths, writeScope, and acceptance criteria. reviewTargets identify what to assess; they are not a read whitelist. contextReadScope declares where Harness may search and read supporting implementation, tests, configuration, and architecture material. Never embed source text, diffs, file dumps, encoded source, or repository archives. Harness reads named files from the authorized workspace itself. These fields are task instructions, not enforced per-path filesystem isolation. The selected Harness model may send content it reads to its configured model provider even though Relay itself uses a loopback address. |
| cancel_runC | Request cancellation through the public Host API. |
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
Most tools target distinct resources and actions (runs vs services vs workspaces), and the descriptions carefully differentiate get_run, wait_run, get_run_summary, and list_runs. The main ambiguity is the intentional status_run alias for get_run, plus start_run/start_review share similar task-parameter language, though their permission/preset distinction is clear.
The overwhelming majority follow snake_case verb_noun names like list_runs, start_service, cancel_run, and wait_run. The exceptions are bare doctor and setup_doctor, which break the verb_noun pattern but do not introduce mixed casing styles.
25 tools is at the high end of the borderline range, and many are needed for the run/relay lifecycle. Still, a deprecated alias (status_run), several setup/reconcile helpers, and notification/operation readers make the surface feel heavier than necessary.
The run lifecycle is well covered: create, review, reply, steer, get, wait, cancel, list, and reconcile. The gaps are minor—there is no explicit way to delete/forget a workspace session or run, and workspace management is read-only—but the core workflows have no dead ends.