Skip to content
Pagr

The bridge

Claude Channels (preview)

A flagged, off-by-default path that lets a message reach a Claude Code turn already in flight. It is a research preview on Anthropic's side and a development flag on ours. Pagr does not depend on it, and neither should you.

Why this exists#

On the default path, a follow-up instruction sent while Claude Code is mid-turn is queued and delivered when the turn ends. That is usually fine and occasionally maddening — when you can see from a progress message that it is about to do the wrong thing and you want to say so now.

Claude Code “channels” are the mechanism that would allow it. With a channel attached, a message is injected into the running session instead of queued.

Why it is off by default#

  • It is a research preview. Custom channels are not on Anthropic's approved allowlist, so the only way to load one is a flag whose name is itself a warning.
  • It widens who can act inside your session. With the channel attached, anyone who can send you a Pagr message can also approve or deny tool use in that session. That is a materially different trust boundary from the rest of Pagr.
  • It is not needed. Nothing in Pagr's general availability path depends on it. Turning it off returns you to queued follow-ups, which is the documented behaviour everywhere else.

Setting it up#

The channel server is a separate, optional package. The daemon and CLI work without it, so a missing install is a precondition error with an install hint rather than a crash.

npm i -g @pagr/claude-channel

Then, inside the project you want to steer, wire it into that project's .mcp.json:

pagr claude channel-setup✓ wrote `pagr` into /Users/you/code/checkout-api/.mcp.json  node /usr/local/lib/node_modules/@pagr/claude-channel/dist/server.mjs ! research preview  Claude Code channels are a RESEARCH PREVIEW. … Then, in this project:  claude --dangerously-load-development-channels server:pagr

The command adds or replaces only the pagr entry under mcpServers. Every other server and top-level key in that file is preserved, and it refuses outright to overwrite a .mcp.json it cannot parse.

Three things all have to be true before anything is injected:

  1. the entry is in .mcp.json
  2. the server is also named on the command line — server:pagr — because being in the file is not enough
  3. the daemon is running with PAGR_CLAUDE_CHANNEL=1, so it accepts the channel rather than falling back to queueing.
PAGR_CLAUDE_CHANNEL=1 pagr daemon run# in the project, in another terminal:claude --dangerously-load-development-channels server:pagr

What it changes#

A project counts as channel-attached from the first moment a Pagr channel server actually polls from inside a Claude Code session for it. From then on, follow-ups to sessions in that project are injected live rather than queued. The agent's reported mode changes from cli-hooks to approved-channel.

Nothing else changes. Approvals, risk tiering, path containment and the protocol command set are exactly the same — see approvals.

Removing it#

pagr claude channel-setup --remove✓ removed `pagr` from /Users/you/code/checkout-api/.mcp.json  other MCP servers in that file were left untouched

Unset PAGR_CLAUDE_CHANNEL and restart the daemon, and Claude Code goes back to queued follow-ups.