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-channelThen, 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:pagrThe 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:
- the entry is in
.mcp.json - the server is also named on the command line —
server:pagr— because being in the file is not enough - 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:pagrWhat 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 untouchedUnset PAGR_CLAUDE_CHANNEL and restart the daemon, and Claude Code goes back to queued follow-ups.