
Security News
Axios Maintainer Confirms Social Engineering Attack Behind npm Compromise
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.
@hyperdrive.bot/resilient-channel
Advanced tools
Transport-agnostic self-healing MCP channel middleware for Claude Code
Transport-agnostic self-healing MCP channel middleware for Claude Code.
Events buffer during session disconnects and replay automatically on reconnection. Works with Telegram, Slack, webhooks, or any custom transport.
Claude Code channels are session-scoped — when a session ends, events are lost. Resilient Channel adds a persistence layer so nothing gets dropped:
update_context toolInspired by NVIDIA NemoClaw's state persistence patterns.
.mcp.jsonPick a transport and add it to your project or user-level .mcp.json:
Webhook (simplest — test with curl):
{
"mcpServers": {
"resilient-webhook": {
"command": "bunx",
"args": ["-y", "@hyperdrive.bot/resilient-channel/src/server.ts"]
}
}
}
Telegram:
{
"mcpServers": {
"resilient-telegram": {
"command": "bunx",
"args": ["-y", "@hyperdrive.bot/resilient-channel/src/server-telegram.ts"]
}
}
}
Slack:
{
"mcpServers": {
"resilient-slack": {
"command": "bunx",
"args": ["-y", "@hyperdrive.bot/resilient-channel/src/server-slack.ts"]
}
}
}
Or clone locally:
git clone https://github.com/hyperdrive-bot/claude-code-resilient-channel.git
cd claude-code-resilient-channel
bun install
Then use absolute paths in .mcp.json:
{
"mcpServers": {
"resilient-telegram": {
"command": "bun",
"args": ["/path/to/claude-code-resilient-channel/src/server-telegram.ts"]
}
}
}
# Set env vars for your transport, then:
claude --dangerously-load-development-channels server:resilient-webhook
# Webhook
curl -X POST localhost:8788 -d "build failed on main"
# Telegram — DM your bot
# Slack — DM @your-bot or @mention it in a channel
HTTP POST listener on localhost. No auth, no external deps. Perfect for CI webhooks, monitoring alerts, or testing.
claude --dangerously-load-development-channels server:resilient-webhook
# Send events
curl -X POST localhost:8788 -d "deploy succeeded"
curl -X POST localhost:8788 -H "x-chat-id: ci" -d "tests passed (42/42)"
Polls Telegram for messages. Supports text, voice notes (auto-transcribed via Whisper), photos, documents, and video (with key frame extraction + transcription).
TELEGRAM_BOT_TOKEN=<token> \
TELEGRAM_ALLOWED_IDS=<your-user-id> \
claude --dangerously-skip-permissions \
--dangerously-load-development-channels server:resilient-telegram
Setup:
OPENAI_API_KEY for voice/video transcription (optional)File support:
| Type | Handling |
|---|---|
| Text | Forwarded directly |
| Voice/Audio | Downloaded + transcribed via Whisper |
| Photo | Downloaded, passed as file_path (Claude sees it) |
| Video | Audio transcribed + up to 4 key frames extracted |
| Document | Downloaded, passed as file_path |
Uses Socket Mode — no public URL needed. Reacts with :eyes: to channel mentions, replies via DM.
SLACK_BOT_TOKEN=xoxb-... \
SLACK_APP_TOKEN=xapp-... \
SLACK_ALLOWED_IDS=U12345678 \
claude --dangerously-skip-permissions \
--dangerously-load-development-channels server:resilient-slack
Also reads from CLAUDE_CODE_SLACK_BOT_TOKEN, CLAUDE_CODE_SLACK_APP_TOKEN, CLAUDE_CODE_SLACK_USER_ID env vars.
Slack App requirements:
connections:writemessage.im, message.channels, app_mentionchat:write, channels:history, im:history, app_mentions:readBehavior:
| Interaction | Response |
|---|---|
| DM | Reply in same DM thread |
| @mention in channel | :eyes: react + reply via DM with thread link |
| Thread follow-up | Forwarded (no re-mention needed) |
External System → ChannelTransport → ResilientChannel → MCP stdio → Claude Code
(thin adapter) (self-healing core)
| Mechanism | How |
|---|---|
| State persistence | ~/.claude/channels/{name}/state.json updated after every event |
| Event buffering | Events queue to disk when Claude disconnects |
| Session replay | Buffered events replayed with is_replay="true" on reconnect |
| Instructions survival | Injected into system prompt, survives context compaction |
| Deduplication | externalId tracking prevents double-processing |
| Audit trail | Per-session events.jsonl in runs/{runId}/ |
| Context handoff | update_context tool persists summaries across sessions |
{
"runId": "ch-20260321-143022-a1b2c3d4",
"sessionCount": 3,
"lastEventId": "evt-42",
"pendingEvents": [],
"contextSummary": "User debugging CI pipeline failure",
"status": "connected"
}
Implement the ChannelTransport interface:
import type { ChannelTransport, InboundEvent } from './src/types.js'
class MyTransport implements ChannelTransport {
name = 'my-transport'
onEvent: (event: InboundEvent) => void = () => {}
async start() { /* connect to your system */ }
async stop() { /* disconnect */ }
// Optional: two-way
async send(destination: string, text: string) { /* send reply */ }
}
Then create an entry point:
import { ResilientChannel } from './src/resilient-channel.js'
import { MyTransport } from './my-transport.js'
const channel = new ResilientChannel({
name: 'my-channel',
transport: new MyTransport(),
twoWay: true,
allowlist: new Set(['allowed-sender-id']),
})
channel.start()
Register in .mcp.json:
{
"mcpServers": {
"my-channel": {
"command": "bun",
"args": ["./server-my-channel.ts"]
}
}
}
All transports enforce deny-first sender gating. No allowlist = no messages get through.
TELEGRAM_ALLOWED_IDS is mandatorySLACK_ALLOWED_IDS / CLAUDE_CODE_SLACK_USER_ID is mandatoryx-sender-id header + allowlistOPENAI_API_KEY for voice/video transcription (optional)ffmpeg for video key frame extraction (optional)MIT
FAQs
Transport-agnostic self-healing MCP channel middleware for Claude Code
We found that @hyperdrive.bot/resilient-channel demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.