Atlas / MCP servers / kroqdotdev / webhooks-cc

webhooks-ccBLOCK

mcp/kroqdotdev/webhooks-cc

Webhook inspection and testing service

Verdict
BLOCK
Grade
F
Trust score
37 /100
Exposed tools
42 28r · 11w · 3d
Transport
stdio
License
AGPL-3.0
Stars
2
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Inspect and debug webhooks without deploying to production.

Get a unique URL, point your webhook there, and see every request in real-time. No signup required.

[Try it now →](https://webhooks.cc)

Getting Started

  1. Visit webhooks.cc
  2. Copy your unique webhook URL
  3. Send a test request: curl -X POST https://go.webhooks.cc/w/ -d '{"test": true}'
  4. Watch it appear in the dashboard

Features

  • Capture requests — Store incoming webhooks with headers, body, query params, and metadata
  • Inspect in real-time — See requests the moment they arrive via WebSocket
  • Configure responses — Return custom status codes, headers, and body for testing error paths
  • Forward to localhost — Tunnel webhooks to your local server during development
  • CLI with interactive TUI — Manage endpoints, tunnel, and stream requests from your terminal
  • TypeScript SDK — Access webhook data programmatically for automation and testing
  • MCP server — Connect AI coding agents (Claude Code, Cursor, VS Code, Codex) to your webhooks

Use Cases

Testing payment integrations — Point Stripe's test webhooks at your endpoint. Inspect the payload structure before writing handlers.

Debugging CI/CD hooks — See exactly what GitHub sends when a push, PR, or deployment occurs.

Developing locally — Forward production-like webhooks to localhost without exposing your machine to the internet.

Mocking failure scenarios — Configure your endpoint to return 500 errors and test your retry logic.

Pricing

Free — 50 requests/day, 7-day data retention. Enough for development and testing.

Pro ($8/month) — 100,000 requests/month, 30-day retention. For production monitoring and high-volume testing.

See webhooks.cc for details.

Install

CLI

curl -fsSL https://webhooks.cc/install.sh | sh

Then launch interactive terminal:

whk

SDK

npm install
Read from source at commit 085f6835cbfaOBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add sdk --env AGENT_ASSERTION_SIGNING_KEY=${AGENT_ASSERTION_SIGNING_KEY} --env AGENT_IDJAG_MAX_AUTH_AGE_SECONDS=${AGENT_IDJAG_MAX_AUTH_AGE_SECONDS} --env AGENT_POW_SECRET=${AGENT_POW_SECRET} --env AGENT_POW_SECRET_PREVIOUS=${AGENT_POW_SECRET_PREVIOUS} -- npx -y @webhooks-cc/[email protected]
claude-desktop
{
  "mcpServers": {
    "sdk": {
      "command": "npx",
      "args": [
        "-y",
        "@webhooks-cc/[email protected]"
      ],
      "env": {
        "AGENT_ASSERTION_SIGNING_KEY": "${AGENT_ASSERTION_SIGNING_KEY}",
        "AGENT_IDJAG_MAX_AUTH_AGE_SECONDS": "${AGENT_IDJAG_MAX_AUTH_AGE_SECONDS}",
        "AGENT_POW_SECRET": "${AGENT_POW_SECRET}",
        "AGENT_POW_SECRET_PREVIOUS": "${AGENT_POW_SECRET_PREVIOUS}"
      }
    }
  }
}
03

Exposed tools (42)

28 read · 11 write · 3 destructive. Blast radius: 3 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
Orderwritewebhooks.cc test charge
about_sandboxreadExplain what this agent can do without a webhooks.cc account, the sandbox limits, and how to connect an account. No network call.
clear_requestsdestructiveDelete captured requests for an endpoint without deleting the endpoint itself.
compare_requestsreadCompare two captured requests and show the structured differences.
configure_forwardingwriteSet the URL captured emails are forwarded to (as signed JSON) and turn forwarding on or off. Owner only. Saving the first URL creates the signing secret.
connect_accountreadConnect this agent to a human
count_requestsreadCount captured webhook requests that match the given filters.
create_endpointwriteCreate a temporary webhook capture endpoint in the agent sandbox (no account needed): ${limits}. The first call registers the sandbox, which takes a few seconds of proof of work. Mock responses, notifications and signature verification need an account: see connect_account.
create_endpointswriteCreate multiple webhook endpoints in one call.
delete_endpointdestructiveDelete one of this agent
delete_endpointsdestructiveDelete multiple webhook endpoints in one call.
describereadDescribe all available SDK operations, parameters, and types.
extract_from_requestreadExtract specific JSON fields from a captured request body.
get_emailreadGet one captured email: by requestId, or the newest at an endpoint (optionally with a tag). Returns the parsed message with its one-time code and main link.
get_endpointreadGet one of this agent
get_forwarding_secretreadRead (or with rotate: true, replace) the whsec_ secret forwarded emails are signed with. Owner only. Treat the value as a credential: put it in the handler
get_requestreadGet full details for a request captured by a sandbox endpoint.
get_usagereadCheck current request usage, remaining quota, plan, and period end, plus the pooled quota of every subscribed team you belong to.
list_deliveriesreadList forwarding deliveries: an endpoint
list_emailsreadList the emails an endpoint received at its mailhooks.cc address, newest first: subject, sender, tag, and the one-time code and main link found in each.
list_endpointsreadList this agent
list_provider_templatesreadList supported webhook providers, templates, and signing metadata.
list_requestsreadList recent requests captured by a sandbox endpoint, newest first.
list_team_membersreadList a team
list_teamsreadList the teams you own or belong to, with role, seats, pooled request usage (requestsUsed/requestLimit), period end, and whether the team is suspended for lack of a subscription.
preview_webhookreadPreview a webhook request without sending it. Returns the exact URL, method, headers, and body.
redeliver_emailreadForward a captured email again with the endpoint
replay_requestreadReplay a previously captured request to a target URL.
search_requestsreadSearch captured webhook requests across endpoints using retained full-text search.
send_test_emailwriteDeliver a sample email (with a 6-digit code and a link) to an endpoint, optionally to a +tag address. It counts as one request and skips SMTP, so sender checks do not run on it.
send_towriteSend a webhook directly to any URL with optional provider signing.
send_webhookwriteSend a test webhook to a hosted endpoint. Supports provider templates and signing.
share_endpointreadShare an endpoint you own with a team so its members can inspect, stream, and edit it. The team needs an active subscription; the endpoint
test_forwardingwritePost the endpoint
test_webhook_flowwriteRun a full webhook test flow: create endpoint, optionally mock, send, wait, verify, replay, and clean up.
unshare_endpointwriteStop sharing an endpoint you own with a team. Works even when the team is suspended.
update_endpointwriteUpdate an endpoint name, mock response, conditional response rules, signing configuration, or whether codes and links are picked out of its emails.
verify_signaturereadVerify the webhook signature on a captured request. When called without provider/secret, returns the server-side pre-computed result (if signing is configured on the endpoint). When called with provider+secret, performs client-side verification.
wait_for_connectionreadWait for the human to enter the code from connect_account. On success the full webhooks.cc tools for their account replace these sandbox tools. Returns after timeoutSeconds (default ${DEFAULT_WAIT_SECONDS}) if they have not finished yet; call it again to keep waiting.
wait_for_emailreadWait for an email to arrive at an endpoint (for example after triggering a signup), then return it with its one-time code and main link. Use a tag per run to find your own email.
wait_for_requestreadWait for a request to arrive at a sandbox endpoint.
wait_for_requestsreadWait for multiple requests to arrive at an endpoint.
04

Trust audit

BLOCKgrade F · trust 37/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (9 observation(s))
Network
declared (17 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
apps/receiver-rs/src/handlers/webhook.rs:330
|| v4.is_link_local()                      // 169.254.0.0/16 (includes metadata 169.254.169.254)
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
apps/receiver-rs/src/handlers/webhook.rs:1686
assert!(is_blocked_ip("169.254.169.254".parse::<IpAddr>().unwrap()));
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
apps/receiver-rs/src/handlers/webhook.rs:1711
"::ffff:169.254.169.254".parse::<IpAddr>().unwrap()
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
apps/receiver-rs/src/handlers/webhook.rs:1734
resolve_notification_target("http://169.254.169.254/meta")
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.env.example:6
SUPABASE_DB_URL=postgresql://postgres:password@your-supabase-host:5433/postgres
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.env.example:9
DATABASE_URL=postgresql://postgres:password@your-supabase-host:5432/postgres
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
.env.example:79
# MAIL_INGEST_URL=http://127.0.0.1:3002
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/cli-rs/src/api/stream.rs:717
(format!("http://127.0.0.1:{}", addr.port()), shared)
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/mx-rs/src/ingest.rs:479
ingest("http://127.0.0.1:1").check("[email protected]").await,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/mx-rs/src/ingest.rs:533
ingest("http://127.0.0.1:1").deliver(delivery()).await,
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
apps/receiver-rs/src/handlers/notification_vectors.json:76
"path": "/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
apps/receiver-rs/src/handlers/notification_vectors.json:90
"path": "/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
apps/receiver-rs/src/handlers/notification_vectors.json:132
"body": "{\"Application\": \"Acme\", \"Pad\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
apps/receiver-rs/src/handlers/notification_vectors.json:143
"text": "New webhook on *demo4slug1* (`POST /`)\nReceived 2026-10-10T08:00:00.123Z (UTC)\n```\n{\"Application\": \"Acme\", \"Pad\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
apps/receiver-rs/src/handlers/notification_vectors.json:155
"body": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/receiver-rs/src/tests/verification_tests.rs:341
let secret = "slack_signing_secret";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/receiver-rs/src/tests/verification_tests.rs:371
let secret = "paddle_webhook_secret";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/receiver-rs/src/tests/verification_tests.rs:1633
let secret = "sentry_client_secret";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/receiver-rs/src/tests/verification_tests.rs:1667
let secret = "sentry_client_secret";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/receiver-rs/src/tests/verification_tests.rs:1733
let secret = "bitbucket_webhook_secret";
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
clear_requests, delete_endpoint, delete_endpoints
Why it matters. 3 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
apps/web/lib/ui-style.test.ts:40
new Function("document", "localStorage", "window", "Math", script)(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
Makefile:20
cd apps/receiver-rs && $$HOME/.cargo/bin/cargo build --release && cp target/release/webhooks-receiver ../../dist/receiver
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
Makefile:21
cd apps/cli-rs && cargo build --release && cp target/release/whk ../../dist/whk

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 085f6835cbfafull audit observations/trust-audit/mcp-server/kroqdotdev__webhooks-cc.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11085f6835cbfaBLOCKF37first audit
06

Questions

What is the webhooks-cc MCP server?

Webhook inspection and testing service

What tools does webhooks-cc expose?

42 in total: 28 read-only, 11 that write, and 3 that can delete or overwrite (clear_requests, delete_endpoint, delete_endpoints). Every one is listed on this page with its risk.

Is webhooks-cc safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (37/100) and found 6 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 3 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does webhooks-cc need?

It reads AGENT_ASSERTION_SIGNING_KEY, AGENT_IDJAG_MAX_AUTH_AGE_SECONDS, AGENT_POW_SECRET, AGENT_POW_SECRET_PREVIOUS, APPSIGNAL_PUSH_API_KEY, BLOG_API_SECRET, CAPTURE_SHARED_SECRET, FORWARD_SECRET, NEXT_PUBLIC_POSTHOG_KEY, NEXT_PUBLIC_SUPABASE_ANON_KEY, NOTIFY_SECRET and POLAR_WEBHOOK_SECRET from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does webhooks-cc run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as @webhooks-cc/sdk at 1.13.0.

How current is this page?

The grade is for one exact copy of the source (085f6835cbfa), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement