Human-in-the-Loop Agent Task Management for Claude Code
AgentRQ / Features
Real-Time · Zero Polling

Instant Push.
No Polling.
No Delay.

When you reply to a task, Claude receives it instantly — via Claude's native notification channel protocol. No HTTP polling loop. No waiting. The agent continues the moment you respond.

Notification Stream LIVE
14:32:05 · task.created
Approve DB schema change
From: Claude Sonnet · Workspace: my-api
14:33:41 · reply.received
You replied: "Approved — use UUID pk"
Delivered to Claude in <50ms
14:33:42 · status.updated
Task marked: ongoing → completed
Claude continues migration...
Under the Hood

How the Push Works

Three layers of real-time delivery — all within Claude's native notification protocol.

1

SSE Event Bus

The dashboard holds an open Server-Sent Events connection per workspace. Every task create, reply, and status change is immediately pushed over this stream — no WebSocket complexity, no polling overhead.

SSE Events
task.created
task.updated
reply.received
status.updated
agent.connected
2

MCP SSE Transport

Claude Code connects to AgentRQ over SSE MCP transport (type: "sse"). The MCP server holds the connection open and streams tool responses and notification messages back to Claude in real-time.

Endpoint
GET /mcp/{workspaceID}
?token=TOKEN
3

Channel Protocol

Human replies are delivered to Claude using the notifications/claude/channel protocol — Claude's native mechanism for receiving push messages mid-session. Claude processes them as structured channel messages.

Protocol
notifications/claude/channel
Channel Protocol

What Claude Receives

When you reply in the AgentRQ dashboard, Claude sees a channel message injected directly into its active context — with your text, the task ID, your username, and a timestamp.

Claude processes this exactly like any other input — reading it, acting on your instructions, and continuing the session. No restarts, no re-prompting.

Claude reads chat_id to know which task thread to reply in
user="human" confirms the message is from you, not another agent
Attachments (files you uploaded) arrive as IDs — Claude calls downloadAttachment to fetch them
Claude Code — channel message received
<channel
  source="agentrq"
  chat_id="0ZRgCquBZ7R"
  ts="2026-03-24T14:33:41Z"
  user="human">

[Response to task 0ZRgCquBZ7R]

Approved — but use UUID primary key
instead of auto-increment. Also add
an index on expires_at for cleanup jobs.

</channel>
Claude:
Got it — switching to UUID primary key and adding the expires_at index. Running the updated migration now...

Why Not Polling?

Traditional approaches add seconds of unnecessary delay between your reply and Claude's reaction.

❌ Polling Approach
Claude checks for updates every N seconds
You reply T+0s
Claude polls... waits... T+5–30s
Claude finally sees reply T+30s avg
Claude resumes work T+35s avg
+ Wastes API calls + tokens just to check
✓ AgentRQ Push
Your reply is delivered immediately via SSE
You reply T+0s
SSE pushes to Claude <50ms
Claude reads channel message T+0.1s
Claude resumes work T+1–2s
Zero wasted API calls. Pure push delivery.
Free During Beta

Experience Zero-Latency Human-in-the-Loop

Set up in 60 seconds. Your first reply reaches Claude before you close the dashboard tab.

More Features