By lorismaz
Generic webhook channel plugin for Claude Code. Accept HMAC-authenticated webhooks from any external service with interactive pairing and reply capability.
Configure the webhook channel plugin -- set port, check status. Use when the user asks to configure webhooks, check webhook status, or set the port.
Complete pairing for a webhook source by entering the pairing code. Use when the user says "pair webhook code XXXXXX" or "/webhook:pair XXXXXX".
List or revoke paired webhook sources. Use when the user asks "show webhook sources", "list paired sources", or "revoke source".
A generic webhook channel plugin for Claude Code. Lets external services push events into Claude Code sessions via HMAC-authenticated webhooks, with interactive pairing and reply capability.
bun install
# Development:
claude --dangerously-load-development-channels server:webhook
# After approval:
claude --channels webhook@lorismaz/webhook-channel-plugin
The HTTP server defaults to port 8788. Override with the WEBHOOK_PORT environment variable.
Pairing establishes a trusted relationship between an external service and your Claude Code session.
The service POSTs to /pair with its name and an optional callback URL:
curl -X POST http://localhost:8788/pair \
-H "Content-Type: application/json" \
-d '{"name": "my-service", "callback_url": "https://my-service.example.com/hook"}'
Response:
{"pairing_code": "A3KX9Z"}
Option A -- in Claude Code terminal (requires the plugin to be installed, not just loaded as a dev channel):
/webhook:pair A3KX9Z
Option B -- via HTTP (works in all setups, including development):
curl -X POST http://localhost:8788/pair/complete \
-H "Content-Type: application/json" \
-d '{"code": "A3KX9Z"}'
Both return the credentials:
{"source_id": "src_abc123...", "hmac_secret": "whsec_xyz789..."}
Store the source_id and hmac_secret -- they are used to authenticate all future webhook requests.
Pairing codes expire after 5 minutes.
Sign requests with HMAC-SHA256 using the full hmac_secret (including the whsec_ prefix):
sha256=HMAC-SHA256(request_body, hmac_secret)
Example:
BODY='{"event": "deploy", "status": "success"}'
SECRET="whsec_your_hmac_secret"
TIMESTAMP=$(date +%s)
SIG=$(echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | sed 's/.*= //')
curl -X POST http://localhost:8788/webhook \
-H "Content-Type: application/json" \
-H "X-Source-Id: src_your_source_id" \
-H "X-Signature: sha256=$SIG" \
-H "X-Timestamp: $TIMESTAMP" \
-d "$BODY"
A successful delivery returns:
{"received": true}
Claude can send a reply back to the originating service using the webhook_reply tool:
webhook_reply(source_id, payload)
This POSTs the payload as JSON to the source's callback_url, signed with HMAC using the same secret. The request includes X-Source-Id, X-Signature, and X-Timestamp headers so the receiving service can verify authenticity.
timingSafeEqual to prevent timing attacks./pair/complete endpoint.| Method | Path | Auth | Description |
|---|---|---|---|
| GET | /health | None | Returns {"status": "ok"} |
| POST | /pair | None | Initiate pairing; returns a pairing code |
| POST | /pair/complete | None | Complete pairing with code; returns credentials |
| GET | /pair/status | None | Check pairing status (?code=XXXXXX) |
| POST | /webhook | HMAC | Deliver a signed webhook event to Claude Code |
Paired sources are persisted at:
~/.claude/channels/webhook/sources.json
Each entry stores the source name, HMAC secret, callback URL, and the time it was paired.
The .mcp.json in this repo registers the server:
{
"mcpServers": {
"webhook": {
"command": "bun",
"args": ["run", "src/index.ts"],
"cwd": "/path/to/webhook-channel-plugin"
}
}
}
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
npx claudepluginhub lorismaz/claude-plugins --plugin webhook-channel-pluginRuby LSP for Claude Code — code intelligence, diagnostics, and navigation for Ruby files
Build smooth, reactive Rails UIs using Turbo Morphing, View Transitions, and Stimulus optimistic UI patterns
Build beautiful, interactive CLI tools in Ruby using the charm-ruby ecosystem (Bubble Tea, Lipgloss, Bubbles, Huh, and more)
Expert agent for webhook implementation, HMAC signature verification, retry logic with exponential backoff, idempotency, webhook security, and testing with ngrok
Create secure webhook endpoints with signature verification and retry logic
WeChat (微信) channel for Claude Code — messaging bridge via iLink Bot API with built-in access control.
WhatsApp channel for Claude Code — linked-device messaging bridge with built-in access control. Manage pairing, allowlists, and policy via /whatsapp-claude-channel:access.
Matrix channel for Claude Code — two-way messaging bridge with E2EE, access control, and permission relay
Harness-native ECC operator layer - 67 agents, 271 skills, 92 legacy command shims, reusable hooks, rules, selective install profiles, and production-ready workflows for Claude Code, Codex, OpenCode, Cursor, and related agent harnesses