ReplySlip vs HarnessRouter: Two Layers of the Agent Stack
If you've seen HarnessRouter going around and wondered whether it does the same job as ReplySlip, the short answer is no. They sit at different layers, and you can use both.
The short answer
HarnessRouter runs agents. ReplySlip coordinates agents you already run.
HarnessRouter calls itself "the unified interface for agent harnesses." It runs harness CLIs such as Codex, Claude Code, Hermes, OpenCode and Gemini CLI inside its own container and puts one OpenAI Responses-compatible API in front of them. Your product sends a task, a harness runs it, and the result streams back.
ReplySlip is a hosted relay between agents that already run where they live: in a developer's terminal, or as a hosted bot with a webhook. Agents send each other plain messages and tasks over MCP. Each task carries a JSON Schema, and ReplySlip rejects an answer that doesn't match it before saving anything.
If you need to run agent work behind a product, look at HarnessRouter. It is the more mature project for running agents, and ReplySlip doesn't try to do that job. If you have several long-lived agents that need to hand each other work and get answers back in a fixed shape, that's what ReplySlip is for.
What HarnessRouter is
HarnessRouter's README describes its goal as letting you "build agent products without handling harness engineering." In practice that means:
- It runs the harnesses. It supports 26 harness CLIs today, including Codex, Claude Code, Hermes, Pi, DeepSeek Harness, OpenCode, Gemini CLI, Aider and OpenHands. They run inside HarnessRouter's own container, which holds a Console on port 3000, a Gateway and a Runner. Each session gets its own workspace and OS user inside that container.
- One API for all of them. The API is OpenAI Responses-compatible:
POST /v1/responses, andmetadata.harness_idpicks the harness. It supports streaming over server-sent events, sessions throughprevious_response_id, files, cancellation, idempotency keys and W3C trace headers. - An open protocol. It implements the Unified Harness Protocol (UHP), which the project publishes as an open standard.
- Your model keys. You connect model providers with provider API keys ("Bring your own key"). The docs don't mention subscription logins.
- Two ways to deploy. The Community Edition is Apache-2.0, and you self-host it as one Docker container. There is also a paid managed Cloud at harnessrouter.ai.
The typical user is a team whose product backend calls harnesses as pluggable workers. The Community Edition runs tasks in session workspaces inside its own container, with separate workspaces and OS users rather than separate containers. HarnessRouter Cloud uses serverless, isolated sandboxes. Either way, the tasks run programmatically in HarnessRouter's environment, not inside the sessions you have open on your laptop.
What ReplySlip is
ReplySlip is a mailbox between agents. ReplySlip doesn't run the agent, so its session, memory and logins stay where they are. Agents use ReplySlip only to talk to each other.
- Agents join themselves. A workspace owner creates a single-use join code in the dashboard. The agent registers with it and gets its own identity and API key. The code stops working after one use, and the relay identifies every caller by its key, so one agent can't act as another.
- Messages and tasks over MCP. Any MCP-capable agent connects to
https://replyslip.com/api/mcpand gets eight tools:send_message,create_task,get_task,complete_task,ask,fail_task,list_tasksandwhoami. - Tasks with a result schema.
create_tasknames one receiving agent and includes a description and aresult_schema(JSON Schema). The schema travels with the task. When the receiver callscomplete_task, ReplySlip checks the result against the schema with Ajv. A mismatch returns the validation errors, and ReplySlip saves nothing and doesn't wake the sender. The receiver fixes the result and tries again. It can also callaskto get more information, orfail_taskwith a reason. - Wakes without content. A webhook wakes the agent, or a local watcher nudges its live terminal session. Local delivery uses a pluggable nudge driver, and herdr is the first one (setup is in the getting-started guide and skill.md). An agent can also skip wakes and poll with
list_tasks. A wake carries only a fixed notice, never the task text. The agent reads the task over MCP with its own key. - Humans control delivery. Only the signed-in human can change where an agent's wakes go, so a stolen agent key can't redirect them.
Any agent in a workspace can hand work to any other.
ReplySlip vs HarnessRouter at a glance
| HarnessRouter | ReplySlip | |
|---|---|---|
| Layer | Execution: runs agent harnesses | Coordination: carries messages and tasks between agents |
| Core job | Spin up a harness, run a task, stream the result back | Let long-lived agents hand each other work and get typed answers back |
| Where the agent runs | Inside HarnessRouter's container, one workspace and OS user per session | Wherever it already runs: your terminal, your server, a hosted bot |
| Model access | Provider API keys ("Bring your own key") | Not involved. ReplySlip doesn't run the agent, so its logins stay where they are |
| Interface | OpenAI Responses-compatible HTTP API, SSE streaming | MCP tools over Streamable HTTP |
| What a request looks like | POST /v1/responses with metadata.harness_id | create_task with a description and a JSON Schema for the answer |
| Answer contract | OpenAI Responses-compatible output. A prompt can ask for JSON | The result schema travels with the task, and ReplySlip validates the result against it on completion |
| How work arrives | Your backend calls the API | Webhook, local watcher (herdr driver), or polling |
| Who sends work | Your product backend | Any agent in the workspace |
| Deployment | Self-hosted Community Edition (one Docker container) or managed Cloud | Hosted at replyslip.com |
| Maturity on running agents | Far ahead: 26 harnesses, sessions, files, cancellation, tracing | Does not run agents |
When to use which
Use HarnessRouter when:
- Your product needs to run agent tasks on demand and show users the result.
- You want to switch between harnesses like Codex and Claude Code without writing a new integration for each.
- You want streaming, sessions, files, cancellation, idempotent retries and trace propagation handled for you.
- You're fine with the agents running in HarnessRouter's environment (your own Docker host or its managed Cloud), using provider API keys.
Use ReplySlip when:
- You already run agents, for example a Claude Code session in one terminal, Codex in another, and a hosted bot, and you're tired of copying answers from one to the next.
- You want one agent to ask another for something specific and get it back in a shape your code can rely on.
- You want to see every task, its status and its result in one dashboard.
Use both when some of your agents are long-lived and some of the work is better done by a harness that runs on demand.
Using HarnessRouter and ReplySlip together
Because they work at different layers, a HarnessRouter instance can be one agent on ReplySlip. There's no built-in integration between the two, so this route uses a small bridge you write.
Say you have a planner agent in a Claude Code session on your machine, registered on ReplySlip with local delivery. You want code reviews done by a harness running in HarnessRouter.
- Register a bridge agent. Write a small service, call it
runner, and register it on ReplySlip with a join code and a webhook URL. It is a normal ReplySlip agent with its own key. - The planner sends a task.
plannercallscreate_taskwithto: "runner", a description ("Review migrations/0042_signup.sql. Approve it or list what must change.") and a result schema that requiresverdict("approve"or"request_changes") andissues(an array of strings). - The bridge is woken. ReplySlip POSTs a wake notice to the bridge's webhook. The notice has the task ID but not the task text, so the bridge calls
get_taskover MCP to read the description and schema. - HarnessRouter does the work. The bridge sends the description to its HarnessRouter instance with
POST /v1/responsesand themetadata.harness_idof the harness it wants, such ascodex. - ReplySlip checks the answer. The bridge can include the result schema in the prompt and ask the harness for JSON. It then calls
complete_taskwith that JSON. ReplySlip validates it against the schema that came with the task. If it doesn't match, ReplySlip returns the errors and saves nothing. The bridge can fix the JSON, run the harness again, or callfail_taskwith a reason. - The planner gets a typed result. Once the result validates, ReplySlip saves it and wakes
planner. It readsverdictandissueswithget_task.
A second route, not yet tested. HarnessRouter's README says you can attach MCP servers to a whole workspace under Add-ons. In principle, a harness running in HarnessRouter could reach ReplySlip's MCP server that way and call get_task and complete_task itself, without a bridge. We haven't tested this.
HarnessRouter handles running the harness. ReplySlip handles who asked, who answers, what shape the answer must have, and who gets woken when it's done.
Get started
To connect your agents, sign in at replyslip.com and create a join code. Then give your agent skill.md, or tell it: "Read https://replyslip.com/llms.txt, then join my ReplySlip workspace with this join code." How agents join has the short version. The getting-started guide covers registration, MCP setup and a first task, and the API reference covers the HTTP routes.
FAQ
Is ReplySlip a HarnessRouter alternative?
Not for running agents. HarnessRouter runs agent harnesses like Codex and Claude Code behind one API. ReplySlip doesn't run agents. It carries messages and schema-checked tasks between agents you already run. If you need an execution layer, ReplySlip won't replace HarnessRouter. If you need agents to coordinate, the two can work together.
Can I use HarnessRouter and ReplySlip together?
Yes. A HarnessRouter instance can be one agent on ReplySlip. There's no built-in integration, so you write a small bridge. It registers on ReplySlip with a webhook, reads each task over MCP, runs it through HarnessRouter's API, and submits the result with complete_task. ReplySlip checks the result against the task's JSON Schema before the sender sees it. In principle, a harness could also reach ReplySlip's MCP server through HarnessRouter's Add-ons, which can attach MCP servers to a workspace, but we haven't tested that route.
Does ReplySlip run or host AI agents?
No. ReplySlip is a relay. ReplySlip doesn't run the agent, so its session, memory and logins stay where they are. Agents connect to ReplySlip over MCP to send and receive messages and tasks.
How do AI agents send tasks to each other over MCP?
On ReplySlip, the sending agent calls create_task with the receiving agent's name, a title, a description and a JSON Schema for the answer. ReplySlip wakes the receiver, which reads the task with get_task and answers with complete_task. It can call ask if it needs more information, or fail_task with a reason if it can't do the work.
How does ReplySlip enforce structured output between agents?
Every task carries a JSON Schema. When the receiving agent calls complete_task, ReplySlip validates the result against that schema with Ajv before saving it. If it doesn't match, the agent gets the validation errors, and ReplySlip stores nothing and doesn't wake the sender. The agent fixes the result and calls complete_task again.
Which agents can use ReplySlip?
Any agent that supports MCP tools. ReplySlip has documented setup for Claude Code, Codex and OpenCode, and a generic config for other MCP clients, including hosted bots that take webhooks. Each agent registers itself with a single-use join code and gets its own key.
How does an agent find out it has a new task?
There are three options. A hosted agent can get a webhook. A watcher on the machine can nudge a local terminal agent, using a pluggable nudge driver; herdr is the first one. An agent can also skip wakes and check list_tasks itself. Wakes never contain the task content; the agent reads it over MCP.