korb
OfficialReceives and manages GitHub webhook events through korb, enabling agents to inspect failed deliveries, retrieve payloads, replay events, and send test events for GitHub webhooks.
Receives and manages Shopify webhook events through korb, enabling agents to inspect failed deliveries, retrieve payloads, replay events, and send test events for Shopify webhooks.
Receives and manages Stripe webhook events through korb, enabling agents to inspect failed deliveries, retrieve payloads, replay events, and send test events for Stripe webhooks.
korb
Catch every webhook. Never drop one again.
korb is a receive-side webhook gateway: point Stripe, Shopify, GitHub, or any HTTP POST source at your korb URL, and korb verifies, stores, and fans events out to your destinations — with retries, logs, and replay.
Web: https://korb.sh
GitHub: https://github.com/korb-sh/korb
Zero runtime dependencies. Node >= 18.
Setup
npm i -g @korb-sh/korb
korb login # approve access in your browserlogin opens a device-style handshake and saves a token to
~/.korb/credentials.json (0600). For CI, create an API token in the
dashboard (Settings → API tokens) and export it:
export KORB_TOKEN=korb_...
export KORB_API_BASE=https://korb.sh # override the default endpointRelated MCP server: webhook-mcp
Commands
korb login / whoami / logout
korb forward <url> [--source id] [--interval ms] live events -> localhost
korb sources / destinations / routes
korb events [--hours N] [--status s] [--source id]
korb events get <id> headers + body of one event
korb replay <id> redeliver one event
korb presets preset catalog (public)
korb test <source> fire the preset's test event
korb delete <source|destination|route> <id-or-name>MCP server
korb mcp runs a Model Context Protocol
server over stdio — let your agent operate your webhooks: find failed
deliveries, inspect payloads, replay, fire test events.
Tools: list_failed, get_payload, replay, send_test
(replay + send_test need a read+write token; the server refuses politely on
read-only tokens).
Claude Desktop / Cursor config:
{
"mcpServers": {
"korb": {
"command": "korb",
"args": ["mcp"],
"env": { "KORB_TOKEN": "korb_..." }
}
}
}Without KORB_TOKEN it uses the saved korb login credentials.
Typical agent flow: list_failed → what broke? → get_payload → what was
sent? → replay after fixing the consumer → send_test to verify
end-to-end.
Scoped tokens
API tokens are minted in the dashboard and are read-only or read+write. Write actions through a read-only token are refused locally (clear message) and re-enforced server-side. Billing and account deletion are always dashboard-session-only — a token can never touch them.
Available Tools
4 toolsget_payloadARead-only
Fetch one stored webhook event: headers and full body exactly as received. The id comes from list_failed (or the dashboard inbox).
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | event id from list_failed / korb events |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the description isn't carrying that burden. It adds a useful fidelity guarantee ('exactly as received', implying no transformation or truncation), but says nothing about retention windows, missing-event behavior, or payload size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences; the core action and the returned content are front-loaded and the id source follows as a secondary note. No filler whatsoever.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description compensates by naming exactly what is returned (headers and full body, unmodified). For a single-parameter read-only fetch with full schema coverage, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's description already says 'event id from list_failed / korb events'. The prose repeats that source rather than adding new meaning, so this is the baseline case where the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Fetch one stored webhook event' — and defines the payload scope as 'headers and full body exactly as received'. The singular 'one' and 'stored' cleanly distinguish it from the list-oriented sibling list_failed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear provenance for the required id ('comes from list_failed (or the dashboard inbox)'), which tells the agent the prerequisite step. It does not, however, state when to use this versus replay or send_test, so no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_failedARead-only
List webhook events whose deliveries failed or partially failed, newest first. Use this first when a webhook consumer is misbehaving; follow up with get_payload to inspect what was sent and replay to redeliver once fixed.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | lookback window in hours (default 24, max 720) | |
| limit | No | max rows (default 25, max 100) | |
| source | No | source id or name (default: all sources) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuine behavioral context beyond that: the result ordering (newest first) and the inclusion of partially-failed deliveries alongside fully-failed ones, which shapes how the agent interprets results. It stops short of discussing pagination or result volume.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the scope and ordering are front-loaded, and the second sentence carries the workflow guidance without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter, read-only list tool with no output schema, the description covers purpose, ordering, and the triage workflow. It could say slightly more about what fields each event row carries or result-volume expectations, but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents hours, limit, and source, including defaults and maxes. The description adds nothing about parameter syntax or behavior, so the baseline of 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List), resource (webhook events), and filter scope (deliveries failed or partially failed) plus ordering (newest first). This clearly distinguishes it from siblings get_payload (inspect a payload), replay (redeliver), and send_test (synthetic send).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: "Use this first when a webhook consumer is misbehaving," then names the follow-up tools get_payload and replay and the condition for each (inspect what was sent; redeliver once fixed). This is a complete when-to-use and what-next sequence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replayA
Redeliver one stored event to its routed destinations (same event id, korb-replay header set, receivers' own dedupe applies). Requires a read+write token.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | event id to redeliver |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description carries most of the burden and does it well: it discloses the auth requirement ('read+write token'), the korb-replay header side effect, preservation of the original event id, and that receiver-side dedupe applies. It stops short of saying what happens on failure or whether the redelivery is retried.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action, with each parenthetical clause carrying distinct operational value (header, dedupe, auth). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation with no output schema, the description covers the important operational context (auth, header, dedupe). It could be more complete by noting where to obtain a valid event_id (list_failed/get_payload) and the outcome of a failed redelivery.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single event_id parameter is documented in the schema. The description adds the meaningful nuance that the id is the stored event's id and is preserved on redelivery, but no format or lookup guidance, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Redeliver one stored event to its routed destinations' precisely states the action and its scope. It does not name or contrast with siblings (list_failed, get_payload, send_test), so an agent must infer that this replays an already-stored event rather than sending a new one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'one stored event' and the sibling set, but there is no explicit when-to-use/when-not or pointer to the alternative (e.g. send_test for new events, list_failed to find candidates). No prerequisites are stated beyond the token requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_testA
Fire a preset's test event through a source (e.g. a Stripe checkout.session.completed) — a REAL event in the REAL lane, useful to verify a fix end-to-end. Requires a read+write token.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | source id or name (unique prefix works) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful context beyond the readOnlyHint=false annotation: it emphasizes the event is REAL and side-effecting in the REAL lane, and states the auth requirement (read+write token). That auth prerequisite is exactly the kind of information the annotation does not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact single sentence with the action front-loaded, followed by the effect warning and auth requirement. No filler, though the em-dash clauses make it slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation tool with no output schema, the description covers the key agent concerns: it mutates real state and requires a read+write token. Return format is unspecified but not critical here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'source' parameter is fully documented in the schema, so baseline 3 applies. The description's Stripe example adds mild flavor but no syntax beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fire a preset's test event through a source') with a concrete example event. The 'REAL event in the REAL lane' framing implicitly distinguishes it from the replay sibling, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a use case ('verify a fix end-to-end') but never states when not to use it or points to replay/list_failed as alternatives. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
get_payload - First observed
list_failed - First observed
replay - First observed
send_test
TDQS
Scored across 4 tools
Each tool occupies a distinct stage of the webhook debugging workflow: list_failed discovers problems, get_payload inspects a specific event, replay redelivers one, and send_test generates a new test event. There is no overlap — an agent can unambiguously pick the right tool for each intent.
All names use lowercase snake_case, and three follow a verb_noun pattern (list_failed, get_payload, send_test). 'replay' is a bare verb with no noun, a minor deviation, but the style remains readable and predictable overall.
Four tools is reasonable for a focused webhook troubleshooting server, and each one clearly earns its place in the detect-inspect-fix-verify loop. It sits at the lean end of the ideal 3-15 range, but not awkwardly so.
The surface covers a full debugging lifecycle (list failures, inspect payload, replay, send a verification test), which is coherent and complete for the stated purpose. Minor gaps exist — no tool to list successful/all events or search/filter beyond failed deliveries — though the dashboard inbox mentioned in descriptions partly offsets this.
Maintenance
Related MCP Connectors
Webhooks for AI agents: send events, manage endpoints, inspect and retry deliveries.
Webhook URLs for AI agents: receive, wait for, replay, sign and verify webhooks (Stripe, GitHub…).
Debug webhooks from your AI agent: inspect and replay captured webhooks on localhost.
Webhook, email, WebSocket and tunnel testing for AI agents: capture, wait, verify, replay.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI agents to create disposable webhook URLs, capture incoming HTTP requests, inspect headers and bodies, and replay them against local or remote endpoints, streamlining the webhook handler development loop.59 npmMIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that sends webhook notifications to a configured URL, enabling AI assistants to notify users when long-running tasks complete.36 npm3-
- FlicenseNot gradedqualityBmaintenanceWebhook management and debugging. Validate signatures, log events, replay, and analyze webhook traffic.51 PyPI-
- AlicenseAqualityDmaintenanceWebhook management and testing tools for AI agents. Provides tools for sending, validating, generating, and debugging webhooks.532 npmMIT