Skip to main content
Glama

slinghook CLI

Forwards webhooks captured by a SlingHook server to a server on your machine, such as localhost:3000. A hosted SlingHook instance can't reach your localhost, so the CLI makes the connection outbound, the same way stripe listen does.

slinghook listen forwarding Stripe webhooks to localhost:3000, retrying a 500

Requires Node 20.17+.

npm install -g slinghook

slinghook auth login --server https://slinghook.co.za
slinghook auth status          # who you're logged in as
slinghook endpoints            # list your endpoint UUIDs
slinghook mcp                  # MCP server for AI agents (see below)
slinghook listen <uuid> --forward http://localhost:3000/webhooks
# <uuid> can also be the catch URL you copied, e.g. https://slinghook.co.za/c/<uuid>

Every command also works with the short name shk, e.g. shk auth login or shk listen <uuid> --forward …. login, status and logout also work without auth, as in earlier versions.

● Listening on endpoint 3f1c…
  Forwarding to http://localhost:3000/webhooks

14:02:11 POST   #1234 → 200 37ms sig:valid
14:02:15 POST   #1235 → ✗ Connection refused (is your local server running?) 2ms

How it works

  1. Auth. slinghook login works like gh auth login. It asks how you want to log in:

    • Web browser. The CLI shows a one-time code (like BCDF-GHJK) and opens the dashboard. Sign in there however you normally do (password, Google, GitHub, SAML, two-factor) and approve the code. The CLI then receives a new API token named after your computer. The token works in the workspace you approved it from. --web skips the question. Codes expire after 15 minutes.

    • Personal access token. Create one under User Settings → API Tokens (/app/?settings=tokens) and paste it. In scripts and CI use slinghook login --with-token < token.txt, --token shk_…, or set SLINGHOOK_TOKEN.

    Only the token is saved, in ~/.config/slinghook/config.json (mode 0600). The server stores only a SHA-256 hash of it. You can see and revoke tokens under User Settings → API Tokens.

  2. Stream. listen opens GET /v1/events/<uuid> with Authorization: Bearer <token>. This is the same SSE stream the dashboard uses. On first connect the server sends recent history, which the CLI skips. It forwards only new log events.

  3. Reconnect. The server closes the stream every ~55s by design. The CLI reconnects with Last-Event-ID, so webhooks that arrive during the gap are delivered once and in order. Network errors back off from 1s up to 30s.

  4. Forward. Each webhook is re-sent with its original method, body, query string, and headers. Hop-by-hop headers such as Host and Content-Length are dropped. Signature headers are kept, so your app's verification runs for real. The CLI adds X-Webhook-Replay: true and X-SlingHook-Log-Id. Deliveries run one at a time with a 15s timeout. Payloads that were truncated at capture are skipped. If your server is down, times out, or answers 408, 425, 429 or 5xx, the CLI retries 3 more times (after 1s, 2s and 4s) before moving on. Later webhooks wait, so they still arrive in order. --retries N changes the count (0 to 10).

  5. Report. Each result is posted to POST /api/logs/<id>/replays, so it appears in the dashboard's replay history. Use --no-report to turn this off.

Related MCP server: Webhook Capture MCP

Team routing: one provider URL, many developers

On the Team plan, a whole team can share one endpoint (Stripe and Shopify only allow a few webhook URLs) and still each get their own events on their own machine. Claim the events that are yours, then listen with --mine:

# Events whose body has metadata.dev = "alice" go to Alice's localhost
slinghook listen <uuid> --forward http://localhost:3000/webhooks \
  --claim data.object.metadata.dev=alice

# Or claim by a header or query parameter
slinghook listen <uuid> --forward http://localhost:3000/webhooks --claim header:X-Dev=alice

--claim saves your claim on the endpoint (replacing your earlier one) and implies --mine. Repeat it to require several conditions. You can also edit claims under Endpoint Settings → Team routing in the dashboard, then run listen --mine without --claim.

With --mine, the CLI forwards only the events routed to you, and the open stream counts you as online. Events nobody claims stay in the shared feed for everyone to see, unless the endpoint is set to give them to whoever is online, in which case they go round-robin to the people running listen --mine. Viewers can watch but can't claim events.

Don't run the CLI and the dashboard's Auto-Relay toggle for the same endpoint at the same time, or each webhook will be delivered twice.

Chaos mode: is your handler idempotent?

On Pro and Team, slinghook chaos takes a saved scenario (or one captured request) and sends it to your handler the way providers really behave:

slinghook chaos <uuid> --forward http://localhost:3000/webhooks --scenario 12 \
  --check http://localhost:3000/debug/orders/count

Each event is first sent once (the baseline). Then, in order:

Test

What is sent

Pass

duplicates

every event again

2xx

concurrent

the same event 3 times at the same moment

2xx for all

out_of_order

the events again, newest first

2xx, or 409/425/429/503 to ask for a retry

malformed

the first body cut in half, empty, and garbage

4xx

late_retry

the first event again after --late-delay seconds

2xx

Deliveries are sent exactly as captured, signature included, without the X-Webhook-Replay header, so your handler treats them like the provider's own redeliveries. Status codes can't show double side effects, so pass --check with a GET on your app that reflects its state (an order count, a balance). It is read after the baseline and after each test; any change fails that test.

Pick tests with --only duplicates,concurrent. Run without --scenario to list the endpoint's scenarios. The report is saved to the dashboard (⌘K → "Chaos mode"), and the command exits with code 1 when a test fails, so it can run in CI.

MCP server: let your AI agent debug webhooks

slinghook mcp is a Model Context Protocol server. AI coding agents such as Claude Code, Cursor and VS Code start it in the background and call SlingHook as a set of tools, logged in as you. Ask your agent "my Stripe webhook is failing, find out why and fix it", and it can run the whole Catch. Debug. Replay loop:

Tool

What it does

Changes anything?

list_endpoints

Your catch URLs and where each one relays

No

list_events

Captured webhooks as short summaries (no bodies). The 50 newest on every plan; query and before_id search full history (Pro)

No

get_event

One webhook in full: headers, query, body (long bodies cut)

No

debug_signature

Why the signature failed, optionally against a candidate secret

No

replay_event

Re-sends the webhook from your machine to your handler, records it, and returns the verdict: fixed, regressed, still failing or still passing

Yes: a real delivery

get_replay_result

Replay history and fix verification verdict (both response bodies on Pro)

No

list_scenarios

Saved scenarios (ordered sets of events) on an endpoint

No

run_scenario

Replays every step of a scenario from your machine to your handler and reports each step (back to back, or recorded gaps capped at 5s with keep_timing; 3 runs a minute)

Yes: real deliveries

generate_handler

Types, a fixture and a test (TypeScript, Python, PHP or Go) from a real event, to build a handler around. Writes no files itself

No

compare_events

What differs between two webhooks, field by field (defaults to the previous event of the same type)

No

create_endpoint

A new catch URL (same name returns the existing one; at most 5 per session; no secrets through the chat)

Yes: adds an endpoint

Every event has a number within your account (#12), shown in the dashboard's feed. Name events to your agent however is natural: "event 12", "the latest event", "the latest invoice.paid", or the provider's own id such as Stripe's evt_1Qx.... The inspector's #12 menu also copies a ready-made prompt.

Add it once, after slinghook login:

# Claude Code (macOS, Linux)
claude mcp add slinghook -- slinghook mcp

# Claude Code on Windows: npm installs slinghook as a .cmd file, which needs cmd /c
claude mcp add slinghook -- cmd /c slinghook mcp

Other clients take the same command in their JSON config:

{ "mcpServers": { "slinghook": { "command": "slinghook", "args": ["mcp"] } } }

In Claude Code, /mcp shows whether it connected. The agent asks before running replay_event, because the tool is marked as one that changes things.

Safety rails:

  • Replays stay local. replay_event only sends to localhost and private networks (10.x, 172.16-31.x, 192.168.x, host.docker.internal). Webhook bodies are written by third parties, and a crafted one could try to talk your agent into sending stored payloads elsewhere. Start the server with slinghook mcp --allow-remote-targets to lift this.

  • Rate limits. One MCP session makes at most 60 tool calls and 10 replays a minute, so a looping agent stops quickly.

  • Your permissions. Every call uses your token, so the server's rules apply: your workspace, your role (viewers can't replay) and your plan.

The server talks JSON-RPC over stdin and stdout, so it prints nothing to stdout itself; its startup note goes to stderr. To see the protocol, pipe a request in:

echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | slinghook mcp

Known gaps

  • Bodies travel through the JSON event stream as text, so binary payloads aren't forwarded byte-for-byte.

  • There are no retries yet. A failed delivery is reported, and you can replay it from the dashboard.

Developing

From a checkout of the SlingHook repo, cd cli && npm link puts your working copy on your PATH, and npm test runs the tests.

Publishing

Bump version in package.json, then run npm publish from this folder. The tests run first (prepublishOnly), and only bin/, src/, this README and package.json are included in the package.

Available Tools

11 tools
compare_eventsCompare eventsA
Read-onlyIdempotent

Shows what differs between two captured webhooks, field by field (JSON paths such as data.items[0].price), plus header differences. Use it for "this one worked and that one failed, what changed?" or to spot a provider changing its payload. Leave out b to compare with the previous event of the same type on the same endpoint. Changes always read from the older event to the newer one. Key order, formatting and per-delivery headers (signatures, request ids, dates) never count.

NameRequiredDescriptionDefault
aYesFirst event. Which event: its number (12 or "#12", from list_events or the dashboard), "latest", "latest <event type>" such as "latest invoice.paid", or the provider's own event id such as evt_1Qx...
bNoSecond event, same forms as `a`. Default: the previous event of the same type on the same endpoint
include_headersNoAlso compare headers

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false. The description adds non-obvious behavioral details: comparison direction is always older-to-newer, key order/formatting/per-delivery headers are ignored, and omitting `b` compares against the previous same-type event on the same endpoint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and compact: the first sentence defines the operation, later sentences cover use cases, default behavior, comparison direction, and ignored differences. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter read-only comparison tool with rich schema descriptions and annotations, the description covers what is compared, how defaults work, comparison direction, and noise exclusions. Although no output schema exists, the field-by-field diff concept is clear enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema itself documents event forms for `a`, the default for `b`, and the `include_headers` boolean. The description reiterates the `b` default and header comparison but adds little new per-parameter meaning beyond the high-coverage schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb-resource pair: shows what differs between two captured webhooks, field by field using JSON paths, plus header differences. This clearly distinguishes it from siblings like get_event, list_events, and replay_event.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage scenarios such as debugging a worked-vs-failed event or spotting provider payload changes, and explains the default comparison when `b` is omitted. It does not explicitly name alternatives or when-not-to-use cases, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_endpointCreate endpointA

Creates a new catch URL (endpoint) in the current workspace and returns the URL to paste into the provider's webhook settings. If an endpoint with the same name already exists, returns that one instead of making a copy. Plan limits apply (Free has 3 endpoints). It does not take a signing secret: secrets are added in the dashboard so they never pass through the conversation.

NameRequiredDescriptionDefault
nameYesWhat it is for, e.g. "Shopify orders (local)"
relay_toNoOptional URL to relay each event to, e.g. http://localhost:3000/webhooks
signature_schemeNoProvider signature to check once a secret is added; auto detects it from headers. Standard covers Standard Webhooks / Svixauto

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real behavior beyond the annotations: same-name calls return the existing endpoint rather than duplicating, plan caps apply, and secrets are deliberately kept out of the conversation. The name-based dedupe sits in mild tension with idempotentHint=false, but it describes a distinct dedupe rule rather than contradicting the hint, so no contradiction is flagged.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the action and return value, then dedupe behavior, limits, and the secret exclusion. Every sentence carries information an agent would otherwise have to guess.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter creation tool with no output schema, the description covers the return value, duplicate handling, quota constraints, and the deliberate omission of secrets. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents name, relay_to, and signature_scheme. The description adds only the negative fact that no signing-secret parameter exists, which is useful but does not deepen per-parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Creates a new catch URL (endpoint) in the current workspace") and even names the return value (the URL to paste into the provider's webhook settings). No sibling tool creates endpoints, so the definition is unambiguous against list_endpoints, run_scenario, and the rest.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when to call it (setting up a provider webhook) and an explicit exclusion: it does not take a signing secret, which is added in the dashboard instead. It also warns about plan limits (Free has 3 endpoints). It stops short of naming an alternative tool, but no sibling performs this action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

debug_signatureDebug signatureA
Read-onlyIdempotent

Explains why a webhook's signature verified or failed: detected provider scheme (Stripe, GitHub, Shopify, Slack, Standard Webhooks, Twilio), wrong secret, stale timestamp, or a body that was modified (reformatted JSON, re-escaped slashes). Checks against the secret saved on the endpoint, or against secret to try a candidate without saving it.

NameRequiredDescriptionDefault
secretNoOptional candidate signing secret to test instead of the saved one (not stored)
event_idYesWhich event: its number (12 or "#12", from list_events or the dashboard), "latest", "latest <event type>" such as "latest invoice.paid", or the provider's own event id such as evt_1Qx...

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint false. The description adds substantive behavior beyond that: which provider schemes it detects, the likely causes it diagnoses, and that a candidate secret can be tested without saving it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with no wasted wording. The core debugging purpose comes first, followed by the saved-versus-candidate secret distinction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only debugging tool with full parameter documentation and no output schema, the definition gives enough context to invoke it confidently. It could say more about the returned diagnostic format, but the listed failure causes cover the essential expectation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents both parameters thoroughly. The description reinforces that `secret` is a candidate tested without saving, but adds little syntax or format meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: explains why a webhook signature verified or failed. It names provider schemes and concrete failure causes, which makes the tool clearly distinct from siblings like replay_event or compare_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The troubleshooting context is clear: use this when a signature verified or failed and you need to know why. It does not explicitly name alternatives or exclusions, but the debugging purpose is strongly implied by the failure-cause list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_handlerGenerate handler codeA
Read-onlyIdempotent

Turns a real captured webhook into code to build a handler around: typed models of its payload, a fixture file with the body, and a test that posts it to the handler. Languages: typescript (types + Jest/Vitest test), python (dataclasses + pytest), php (DTO + Laravel test), go (structs; no test). Returns file contents with suggested names; it writes nothing, so save them with your own file tools. Also says which signature scheme the endpoint checks, so the handler can verify it.

NameRequiredDescriptionDefault
partsNoWhich files to generate. Default: all three
event_idYesWhich event: its number (12 or "#12", from list_events or the dashboard), "latest", "latest <event type>" such as "latest invoice.paid", or the provider's own event id such as evt_1Qx...
languageYesLanguage of the handler
target_urlNoThe handler URL the test posts to. Default: the endpoint's relay URL, or http://localhost:3000/webhooks

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, but the description adds genuinely new behavior: it writes nothing to disk, returns file contents with suggested names, and requires the caller to persist them. Because there is no output schema, the note that the response is unsaved file contents plus a signature-scheme hint is the key information an agent needs before acting. It stops short of describing error behavior for a bad event_id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core transformation, then deliverables, then language variants, then the no-side-effect caveat. Every sentence carries content, though the closing signature-scheme sentence is slightly bolted on and could be folded into the deliverables list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and four parameters at full coverage, the description adequately covers what comes back (file contents with suggested names) and the critical constraint that nothing is written. Remaining gaps, such as failure modes on an unresolvable event_id or size limits on generated output, are minor for a read-only code generator.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so a 3 would be the floor, but the description goes further by explaining what each language actually yields (typescript with Jest/Vitest, python dataclasses with pytest, php DTO with Laravel test, go structs with no test). That per-value meaning is not derivable from the bare enum and directly affects the caller's choice.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('turns a real captured webhook into code') and immediately enumerates the concrete artifacts produced: typed models, a fixture file, and a test. The per-language breakdown makes it unmistakable against siblings like get_event, replay_event, or list_events, which deal in event data rather than generated code.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context is clear: you use this after having a captured event, and the enum of languages signals the required inputs. It implicitly routes the agent to list_events for the event_id format. However, it never says when NOT to use it or names a sibling alternative explicitly, so it falls short of a full when/when-not treatment.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_eventGet eventA
Read-only

Reads one captured webhook in full: method, headers, query string, body and signature status. Long bodies are cut at max_body_chars.

NameRequiredDescriptionDefault
event_idYesWhich event: its number (12 or "#12", from list_events or the dashboard), "latest", "latest <event type>" such as "latest invoice.paid", or the provider's own event id such as evt_1Qx...
max_body_charsNoLongest body to return

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint=false, so the description's added value is the disclosure of truncation behavior ('Long bodies are cut at max_body_chars'), which tells the agent results may be partial. It does not cover error behavior for an unknown event id or what 'signature status' concretely reports.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler; the returned-field list comes first and the truncation caveat is placed last where it belongs as a qualifier.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and only two parameters, the description adequately signals the shape of the response and the one lossy behavior. Missing only edge-case behavior such as a not-found event or the meaning of signature status.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters in detail, including the accepted event_id forms. The description reinforces the truncation semantics of max_body_chars but adds no new syntax or constraints beyond the schema — baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('Reads') plus resource ('one captured webhook') and an enumeration of what is returned: method, headers, query string, body, signature status. The singular 'one' implicitly separates it from list_events, though 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the word 'Reads one' — an agent can infer this is for inspecting a single captured event after finding its id. There is no explicit when-to-use, no pointer to list_events for discovery, and no guidance on when compare_events or replay_event would be preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_replay_resultGet replay resultA
Read-only

Shows the replay history of one event and the fix verification verdict for the latest replay (or replay_id): fixed, regressed, still_failing or still_passing, compared with the attempt before it to the same URL. Includes replays made from the dashboard and by slinghook listen. On Pro and above it also returns both response bodies to compare.

NameRequiredDescriptionDefault
event_idYesWhich event: its number (12 or "#12", from list_events or the dashboard), "latest", "latest <event type>" such as "latest invoice.paid", or the provider's own event id such as evt_1Qx...
replay_idNoA specific replay attempt; default the latest

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: replays from both the dashboard and `slinghook listen` are included, the verdict is computed against the prior attempt to the same URL, and both response bodies are only returned on Pro and above — a tier-gating detail an agent cannot get from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose and verdict semantics, with no filler. Slightly dense with parenthetical asides, but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the necessary work of explaining what comes back: the replay history, the four verdict values, the comparison baseline, and the conditional response bodies. Only the shape of the history list itself is left unspecified, which is a minor gap for a read-only tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already fully documented, including the flexible event_id formats and replay_id defaulting to latest. The description only restates that replay_id selects a specific attempt; it adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Shows the replay history of one event') plus the verdict for the latest replay, and enumerates the verdict values (fixed, regressed, still_failing, still_passing). This clearly separates it from siblings like replay_event (which creates a replay) and compare_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer this is the tool to call after a replay to check whether a fix worked, but the description never says when to use it versus replay_event or compare_events, nor any prerequisites such as needing an existing replay.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_endpointsList endpointsA
Read-only

Lists the catch URLs (endpoints) in the current SlingHook workspace, with where each one relays events. Start here to find the endpoint a webhook was sent to.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful scope information (results are limited to the current SlingHook workspace) but says nothing about ordering, pagination, or what happens with an empty workspace, so it only modestly exceeds the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler: the first states what is returned, the second states when to reach for it. The key information is front-loaded and nothing is repeated from the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read tool with annotations covering the safety profile, the description supplies the essentials: workspace scope, the identity of endpoints as catch URLs, their relay targets, and its role as an entry point. The only real gap is return shape/pagination detail, which is minor for a simple list call with no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description correctly frames the call as scope-free (workspace-determined) rather than implying any filtering input the agent might look for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ("Lists the catch URLs (endpoints)") and immediately disambiguates the term by explaining what an endpoint is and that its relay destination is included. This makes it clearly distinct from siblings such as list_events, get_event, or create_endpoint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The sentence "Start here to find the endpoint a webhook was sent to" gives concrete entry-point guidance and implies this should precede event-level lookups like list_events or get_event. It stops short of naming those alternatives or stating exclusions, so it is clear context rather than explicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_eventsList eventsA
Read-only

Lists webhooks captured on an endpoint, newest first, as short summaries (number, time, method, event type, signature status) without bodies. Use get_event for one event in full. Without query or before_id it reads the newest events (up to 50, every plan). query and before_id search the whole retained history, which needs the Pro plan.

NameRequiredDescriptionDefault
limitNoHow many events to return
queryNoPro: free text to find in bodies, headers and notes, or a JSON path match such as `type = invoice.paid` or `data.object.id = in_123` (`!=` to exclude)
methodNoOnly this HTTP method, e.g. POST
endpointYesEndpoint UUID, catch URL (https://…/c/<id>) or reserved slug, as list_endpoints shows it
before_idNoPro: page further back; pass next_before_id from the previous result
signatureNoOnly events whose signature check had this result

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish a safe read (readOnlyHint, openWorldHint=false), but the description adds real substance: summaries are body-less, results are ordered newest-first, the non-paged read caps at 50 on every plan, and whole-history search requires Pro. It does not mention pagination cursor semantics beyond before_id or result envelope details, but coverage is strong for a list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly packed sentences: what it returns, where to go for the full event, then the two modes and their plan constraints. No filler and the core behavior leads.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly spends its words on the returned summary fields and the body exclusion, which an agent needs to know. Plan limits, ordering, and the alternate tool are all covered, leaving no material gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns more by explaining the coupling between the absence/presence of query and before_id and which data set (newest vs. retained history) is scanned. It repeats the Pro gating already present in the schema descriptions, so it stops short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lists webhooks captured on an endpoint') plus scope ('newest first') and the exact shape of what comes back (number, time, method, event type, signature status, no bodies). It also distinguishes itself from get_event, so an agent can pick it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to get_event for a full single event, and explains that omitting query/before_id gives the newest events while supplying them searches retained history. It even names the plan gating each mode, which is the main decision factor for an agent choosing a call strategy.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_scenariosList scenariosA
Read-only

Lists the saved scenarios on an endpoint: ordered sets of captured events (for example subscription created, payment failed, canceled) that run_scenario replays in sequence. Scenarios are built in the dashboard.

NameRequiredDescriptionDefault
endpointYesEndpoint UUID, catch URL (https://…/c/<id>) or reserved slug, as list_endpoints shows it

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine context beyond that—scenarios are ordered event sequences and are authored in the dashboard, so they cannot be created through this API—but it says nothing about pagination, ordering of the returned list, or behavior for an unknown endpoint slug.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action, and every clause earns its place—the parenthetical example makes 'scenario' concrete, and the dashboard note is a real scope signal rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the burden of describing the return value. It conveys that a list of scenarios comes back but not whether each entry includes an identifier (needed to call run_scenario) or a name/count, which is the key detail for the natural follow-up call. Otherwise adequate for a single-parameter read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the endpoint parameter's schema text already specifies UUID, catch URL, and reserved slug formats. The description only echoes 'on an endpoint' without adding format or resolution details, so the schema does the heavy lifting and the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lists the saved scenarios on an endpoint') and goes further by defining what a scenario is: an ordered set of captured events that run_scenario replays. That definition separates it cleanly from siblings like run_scenario (which replays) and list_events (which returns raw events) without the agent needing to open any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: by describing scenarios as the thing run_scenario replays, the description hints this is the discovery step before running one, and 'built in the dashboard' implies there is no create_scenario equivalent. It never explicitly states when to call this versus list_events or what to do with the result, so the agent must infer the workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

replay_eventReplay eventA
Destructive

Re-sends a captured webhook to a URL from this machine (e.g. the local handler at http://localhost:3000/webhooks), with its original method, headers and body, so signature checks run for real. Records the result in the dashboard's replay history and returns the verdict against the previous attempt to the same URL: fixed, regressed, still_failing or still_passing. For an event whose signature is invalid, the handler passes by rejecting it (4xx). It can change state in the receiving app (it is a real webhook delivery).

NameRequiredDescriptionDefault
event_idYesWhich event: its number (12 or "#12", from list_events or the dashboard), "latest", "latest <event type>" such as "latest invoice.paid", or the provider's own event id such as evt_1Qx...
target_urlYesWhere to deliver it, e.g. http://localhost:3000/webhooks

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive, open-world and non-idempotent behavior, and the description adds substantive context on top: the original method/headers/body are preserved, the attempt is written to dashboard replay history, and the returned verdict is defined against the prior attempt to the same URL (fixed, regressed, still_failing, still_passing). The explicit warning that it can change state in the receiving app reinforces rather than repeats the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action and its target come first, followed by side effects and return semantics, so it is well front-loaded. Four sentences is a reasonable length for the behavioral payload, though the parenthetical example URL slightly duplicates the target_url example in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and a destructive, open-world delivery, the description does the heavy lifting by naming the four verdict outcomes and the history recording. It stops short of saying what else is returned about the delivery (status code, response body), which matters for diagnosing a failing local handler.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains both event_id forms and target_url. The description contributes nothing parameter-specific beyond the generic 'a URL from this machine' phrasing, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb+resource ('Re-sends a captured webhook to a URL') and pins the scope to deliveries made from this machine with a concrete example URL. It implicitly separates itself from retrieval-style siblings by emphasizing that a real delivery is made, but it never names an alternative tool, so the differentiation is inferential rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear when-to-use rationale ('so signature checks run for real') plus a practical caveat that a correctly configured handler passes an invalid-signature event by rejecting it with 4xx. It does not name when NOT to use it or point to siblings such as get_replay_result or debug_signature, which an agent choosing between replay-style tools would want.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_scenarioRun scenarioA
Destructive

Replays every event of a saved scenario, in order, from this machine to a URL (e.g. the local handler), and reports each step: status, pass or fail, and the verdict against that event's previous replay to the same URL. Use it after a fix to prove a whole flow works, not just one event. Steps go back to back unless keep_timing is set (gaps capped at 5 seconds). Each step is a real webhook delivery recorded in replay history, so it can change state in the receiving app.

NameRequiredDescriptionDefault
scenarioYesScenario id, from list_scenarios
target_urlYesWhere to deliver each step, e.g. http://localhost:3000/webhooks
keep_timingNoWait the recorded gap between steps, up to 5 seconds each
stop_on_failureNoStop at the first failing step

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations that already flag destructive and open-world behavior, the description discloses that each step is a real webhook delivery recorded in replay history and can change state in the receiving app. It also clarifies timing behavior: steps run back to back unless keep_timing is set, with gaps capped at 5 seconds.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and scope, then adds usage, timing, and side-effect context without filler. Every sentence contributes operational detail an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-step, state-changing tool with no output schema, the description covers what is returned (status, pass/fail, verdict against prior replay), timing behavior, and real side effects. The remaining parameter details are fully covered by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are documented in the schema. The description reinforces keep_timing semantics and target_url behavior but adds little beyond the schema and does not mention stop_on_failure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it replays every event of a saved scenario in order to a target URL and reports per-step results. It also contrasts the scope with single-event replay, so an agent can distinguish it from replay_event without inspecting the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear usage context: use after a fix to prove a whole flow works, not just one event. The alternative single-event tool is implied rather than named, so the routing signal is strong but not fully explicit.

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.

  1. 11 tool updatesv0.1.0
    • First observedcompare_events
    • First observedcreate_endpoint
    • First observeddebug_signature
    • First observedgenerate_handler
    • First observedget_event
    • First observedget_replay_result
    • First observedlist_endpoints
    • First observedlist_events
    • First observedlist_scenarios
    • First observedreplay_event
    • First observedrun_scenario

TDQS

A4.2/5.0

Scored across 11 tools

Disambiguation5/5

Each tool pairs a distinct action with a distinct object: listing endpoints/scenarios/events, reading a single event, comparing events, debugging a signature, replaying one event, running a scenario, and fetching a replay result. The only cluster with any risk is replay_event vs run_scenario vs get_replay_result, and the descriptions sharply separate perform-one, perform-sequence, and read-history. An agent can select correctly without guessing.

Naming Consistency5/5

Every name follows the same snake_case verb_noun convention (list_endpoints, get_event, replay_event, debug_signature, generate_handler, compare_events, create_endpoint). The verbs map predictably to the action performed and resource names are reused consistently across list/get/create.

Tool Count5/5

Eleven tools map cleanly onto the workflow stages of capturing, inspecting, replaying, and debugging webhooks, with no filler tools. Each entry earns its place without inflating the surface.

Completeness4/5

Coverage is strong for the agent's core loop: discover endpoints, list/get/compare events, debug signatures, replay, verify fixes, and generate handler scaffolding. Gaps (no delete or rename endpoint, no event deletion, secrets intentionally dashboard-only) are deliberate and manageable from the dashboard rather than agent dead ends.

Maintenance

ActivityActive
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    5
    8 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables coding agents to receive and inspect real webhook payloads locally, send signature-valid test events for seven providers, and replay deliveries — all without leaving the machine.
    MIT