Skip to content

Tool Reference

Complete reference for all 38 MCP tools available to AI coding agents, plus the sandbox tools for agents without an account. Parameters, return types, and usage examples for endpoint, request, email, forwarding, and webhook operations.

Updated Oct 2026

Endpoint management

create_endpoint

Create a new webhook endpoint. Returns the endpoint slug and full URL.

ParameterTypeRequiredDescription
namestringnoDisplay name for the endpoint
ephemeralbooleannoAuto-delete after 12 hours
expiresInstringnoCustom expiry duration (e.g., "2h", "7d")
mockResponseobjectnoMock response config (see fields below)
responseRulesarraynoConditional response rules (method/path/header/body conditions + responses)
notificationUrlstringnoURL to POST a JSON summary on each request
signingProviderstringnoProvider for automatic signature verification (e.g., stripe, github)
signingSecretstringnoSigning secret (encrypted server-side). Required when signingProvider is set
signingHeaderstringnoCustom header name (only for generic-hmac provider)

mockResponse fields:

FieldTypeRequiredDescription
statusnumberyesHTTP status code (100-599)
bodystringnoResponse body
headersRecord<string, string>noResponse headers
delaynumbernoResponse delay in ms (0-30000)

create_endpoints

Create 1--20 endpoints in a single call. Returns an array of created endpoints.

ParameterTypeRequiredDescription
countnumberyesNumber of endpoints to create (1--20)
namePrefixstringnoPrefix for auto-generated names
ephemeralbooleannoAuto-delete after 12 hours
expiresInstringnoCustom expiry duration

list_endpoints

List the endpoints you own (each with sharedWith) and those shared with you through a subscribed team (each with fromTeam, the oldest share, and fromTeams, every one of your teams it is shared with).

ParameterTypeRequiredDescription
teamstringnoTeam id or unique name; keeps only endpoints tied to that team via fromTeams, fromTeam, or sharedWith. Ambiguous names are an error

get_endpoint

Get details for an endpoint by slug.

ParameterTypeRequiredDescription
slugstringyesEndpoint slug

update_endpoint

Update an endpoint's name, mock response, notification webhook, signing configuration, or whether codes and links are picked out of its emails.

ParameterTypeRequiredDescription
slugstringyesEndpoint slug
namestringnoNew display name
mockResponseobjectnoMock response config (see fields above), or null to clear
responseRulesarraynoConditional response rules, or null to clear
notificationUrlstringnoNotification webhook URL, or null to clear
signingProviderstringnoSigning provider (e.g., stripe), or null to disable
signingSecretstringnoNew signing secret (encrypted server-side), or null to clear
signingHeaderstringnoCustom header name (only for generic-hmac), or null to clear
showEmailExtractsbooleannoPick codes and links out of emails (dashboard and forwarded JSON); owner only

delete_endpoint

Delete an endpoint and all its captured requests.

ParameterTypeRequiredDescription
slugstringyesEndpoint slug

delete_endpoints

Delete 1--100 endpoints in a single call.

ParameterTypeRequiredDescription
slugsstring[]yesArray of endpoint slugs to delete (1--100)

Sending and testing

send_webhook

Send a test webhook to a hosted webhooks.cc endpoint. Supports manual payloads and provider templates, including signed templates for providers that support shared-secret or token-style signing.

ParameterTypeRequiredDescription
slugstringyesEndpoint slug
methodstringnoHTTP method (default: "POST")
headersobjectnoHTTP headers to include
bodyanynoRequest body
providerstringnoProvider template (stripe, github, shopify, twilio, slack, paddle, linear, sendgrid, clerk, discord, vercel, gitlab, typeform, standard-webhooks, meta, lemonsqueezy, coinbase-commerce, razorpay, cal, intercom, telegram, square, hubspot, mailgun, calendly, mux, sentry, bitbucket, docusign, adyen, paypal, plaid, resend, workos)
templatestringnoTemplate name (e.g., checkout.session.completed or form_response)
eventstringnoEvent type override
secretstringyes (for signed providers)Template signing input. Required for signed provider templates; sendgrid, discord, and plaid templates are unsigned and need no secret.

Example provider-template call:

{
  "slug": "abc123",
  "provider": "typeform",
  "template": "form_response",
  "secret": "typeform_test_secret"
}

send_to

Send a webhook directly to any URL -- localhost, staging, production. Same signing support as send_webhook.

ParameterTypeRequiredDescription
urlstringyesTarget URL (http or https)
methodstringnoHTTP method (default: "POST")
headersobjectnoHTTP headers to include
bodyanynoRequest body
providerstringnoProvider for signing
templatestringnoTemplate name
eventstringnoEvent type override
secretstringyes (for signed providers)Signing secret (not needed for sendgrid, discord, plaid)

preview_webhook

Build a webhook request without sending it. Returns the computed URL, method, headers, and body so you can inspect signatures before delivery.

ParameterTypeRequiredDescription
urlstringyesTarget URL
methodstringnoHTTP method
headersobjectnoHTTP headers
bodyanynoRequest body
providerstringnoProvider for signing
templatestringnoTemplate name
eventstringnoEvent type override
secretstringyes (for signed providers)Signing secret (not needed for sendgrid, discord, plaid)

test_webhook_flow

Run a full end-to-end test: create endpoint, set mock response, send webhook, wait for capture, verify signature, replay to target, clean up.

ParameterTypeRequiredDescription
providerstringnoProvider template to use
eventstringnoEvent type
secretstringnoSigning secret
mockStatusnumbernoHTTP status for mock response
targetUrlstringnoURL to replay the captured request to
verifySignaturebooleannoVerify the webhook signature after capture
cleanupbooleannoDelete the endpoint after the test (default: true)

Request management

list_requests

List captured requests for an endpoint, newest first. Emails come back with kind: "email" and the parsed message in email, without the raw message or the HTML part (email.htmlSize gives its length; size is the message size in bytes), and with the text cut at 8,000 characters. An email that is still too big loses its headers (headersOmitted), then sender, address and attachment entries past the first 5, then text, and as a last resort everything but its subject, first sender (fromTotal), tag, date and text (trimmed), so each email fits on its own. The other request tools and the MCP resources return emails the same way; use get_email for the HTML.

ParameterTypeRequiredDescription
endpointSlugstringyesEndpoint slug
limitnumbernoMax results to return
sincenumbernoOnly return requests after this timestamp in ms
kindstringnohttp for HTTP requests only, email for emails only

get_request

Get full details of a captured request, including headers and body.

ParameterTypeRequiredDescription
requestIdstringyesRequest ID

wait_for_request

Poll until a request arrives at an endpoint, then return it.

ParameterTypeRequiredDescription
endpointSlugstringyesEndpoint slug
timeoutnumbernoMax wait time in milliseconds
pollIntervalnumbernoInterval between polls in milliseconds

wait_for_requests

Poll until a specified number of requests arrive at an endpoint.

ParameterTypeRequiredDescription
endpointSlugstringyesEndpoint slug
countnumberyesNumber of requests to wait for
timeoutnumbernoMax wait time in milliseconds
pollIntervalnumbernoInterval between polls in milliseconds
methodstringnoFilter by HTTP method

search_requests

Full-text search across captured requests. Supports time ranges, method filters, and pagination.

ParameterTypeRequiredDescription
slugstringnoFilter by endpoint slug
methodstringnoFilter by HTTP method
kindstringnohttp for HTTP requests only, email for emails only
qstringnoSearch query (searches headers and body)
fromstringnoStart time -- relative duration like "1h" or ISO timestamp
tostringnoEnd time -- relative duration or ISO timestamp
limitnumbernoMax results
offsetnumbernoPagination offset
orderstringno"asc" or "desc"

count_requests

Count requests matching the given filters. Accepts the same filter parameters as search_requests.

ParameterTypeRequiredDescription
slugstringnoFilter by endpoint slug
methodstringnoFilter by HTTP method
kindstringnohttp or email
qstringnoSearch query
fromstringnoStart time
tostringnoEnd time
limitnumbernoMax results
offsetnumbernoPagination offset
orderstringno"asc" or "desc"

clear_requests

Delete captured requests for an endpoint without deleting the endpoint itself.

ParameterTypeRequiredDescription
slugstringyesEndpoint slug
beforestringnoDelete only requests before this timestamp

Emails

Every endpoint on an account receives email at {slug}@mailhooks.cc, and at {slug}+{tag}@mailhooks.cc for any tag, which lands on the same endpoint. Use a fresh tag for each test run so an agent finds its own email. Each email counts as one request. The one-time code and main link come from the same finder as the dashboard; they are left out when the endpoint's owner turned off "Show codes and links found in emails".

list_emails

List the emails an endpoint received, newest first, one line each: id, receivedAt, address, tag, subject, from, code, link, and the number of attachments. A main link over 8,000 characters is left out (linkOmitted).

ParameterTypeRequiredDescription
endpointSlugstringyesEndpoint slug
limitnumbernoMax emails to return (1 to 100, default 25). With tag, subject or from, the newest 100 emails are searched
sincenumbernoOnly emails received after this timestamp in ms
tagstringnoOnly emails sent to this +tag (case-sensitive)
subjectstringnoOnly emails whose subject contains this text
fromstringnoOnly emails from this address (case-insensitive)

get_email

Get one email: by requestId, or the newest at endpointSlug (optionally with a tag). Pass exactly one of the two. Returns the parsed message in the shape of forwarded JSON (subject, from, to, text, attachments, auth, headers, ...) with code and link first. The text is cut at 8,000 characters (textTruncated: true), and the HTML is left out (htmlSize gives its length) unless includeHtml is set. Tool output is capped at 32 KB, so a large email is trimmed to fit and stays valid JSON: first its headers are left out (headersOmitted), then codes and links past the first 10 (codesTruncated, linksTruncated), then address and attachment entries past the first 5 (toTotal, attachmentsTotal, ...); then the HTML and the text are cut (htmlTruncated, textTruncated), and as a last resort only the essentials stay (trimmed), without a main link too long to use (linkOmitted).

ParameterTypeRequiredDescription
requestIdstringnoThe email's request ID
endpointSlugstringnoGet the newest email at this endpoint instead
tagstringnoWith endpointSlug: only this +tag
includeHtmlbooleannoInclude the HTML part (default false)

wait_for_email

Wait for an email to arrive, for example after the agent submitted a signup form, then return it like get_email. Looks back five minutes unless since is given.

ParameterTypeRequiredDescription
endpointSlugstringyesEndpoint slug
tagstringnoOnly emails sent to this +tag
subjectstringnoOnly emails whose subject contains this text
fromstringnoOnly emails from this address
timeoutstring | numbernoHow long to wait (default "30s"). Keep it under your MCP client's request timeout, often 60 seconds
sincenumbernoOnly emails received after this timestamp in ms
includeHtmlbooleannoInclude the HTML part (default false)

send_test_email

Deliver a sample email with a 6-digit code and a link, to try the email tools before wiring up a real sender. It counts as one request and skips SMTP, so no sender checks run on it. Returns status, requestId and the address it went to.

ParameterTypeRequiredDescription
slugstringyesEndpoint slug
tagstringnoDeliver to {slug}+{tag}@mailhooks.cc

Forwarding

Forwarding sends every HTTP request and email an endpoint captures to a URL or a Slack or Discord channel, queued, retried and logged with its timing. Only the endpoint's owner can manage it.

configure_forwarding

Change the forwarding settings; only the arguments passed change. Saving the first URL creates the signing secret, so the agent can send a test delivery before turning forwarding on. Turning forwarding (or a kind) off fails the deliveries still waiting. Returns every forwarding setting, with header values masked.

ParameterTypeRequiredDescription
slugstringyesEndpoint slug
urlstring | nullnohttps URL on a public host name, or null to remove it (when off)
enabledbooleannoTurn forwarding on (needs a URL) or off
httpbooleannoForward HTTP requests
emailbooleannoForward emails
format"auto" | "as_received" | "json" | "chat"noHow deliveries go out; auto picks chat for Slack and Discord URLs
headers{ name, value | null }[]noYour own headers (at most 10); replaces the list, null keeps a stored value
appendPathbooleannoAdd the path after the slug to the URL for relayed requests (default true)
retrySeconds0 | 3600 | 86400noHow long failed deliveries are retried (default a day)
keepOrderbooleannoOne delivery at a time, in capture order
sentFieldstring | nullnoJSON body field with the sender's timestamp, such as publishedAt, for timing

get_forwarding_secret

Read the whsec_ secret deliveries are signed with, or replace it with rotate: true. The value is a credential and ends up in the agent's context: have the agent put it in the handler's environment, not in code.

ParameterTypeRequiredDescription
slugstringyesEndpoint slug
rotatebooleannoReplace the secret (default false)

test_forwarding

Send the newest captured request of a kind (or a sample, if none has arrived) to the saved URL once, exactly as a delivery would go out, and report the status, durationMs, the start of the answer (excerpt), error, delivered, the format and target used, and the sender's own timestamp when the request had one. Works with forwarding on or off; nothing is retried or logged.

ParameterTypeRequiredDescription
slugstringyesEndpoint slug
kind"http" | "email"noWhich kind (default: HTTP when HTTP requests are forwarded)

list_deliveries

With endpointSlug, return the endpoint's delivery log with its counts: { summary, deliveries, nextCursor }. Rows carry senderAt when the request had the sender's own timestamp, so receivedAt - senderAt is the time to reach webhooks.cc. With requestId, return every delivery and try of one request or email. Pass exactly one.

ParameterTypeRequiredDescription
endpointSlugstringnoThe endpoint's delivery log
requestIdstringnoEvery delivery of this request, with each try
limitnumbernoWith endpointSlug: 1 to 100 (default 20)
status"all" | "pending" | "failed"noWith endpointSlug: filter (default all)
beforestringnoWith endpointSlug: nextCursor, for older rows

redeliver

Forward again with the current settings: one request or email (requestId, which also sends one that was never forwarded), or every request whose latest delivery failed (endpointSlug, oldest first, up to 1,000 at a time). Pass exactly one. Fails while forwarding is off.

ParameterTypeRequiredDescription
requestIdstringnoThe request or email to send again
endpointSlugstringnoSend every failed delivery of this endpoint

Request analysis

replay_request

Replay a captured request to a target URL. Sends the original method, headers, and body.

ParameterTypeRequiredDescription
requestIdstringyesID of the captured request
targetUrlstringyesURL to send the replayed request to

compare_requests

Diff two captured requests. Returns structured differences in method, headers, and body.

ParameterTypeRequiredDescription
leftRequestIdstringyesFirst request ID
rightRequestIdstringyesSecond request ID
ignoreHeadersstring[]noHeader names to exclude from comparison

extract_from_request

Extract specific JSON fields from a captured request body using dot-notation paths.

ParameterTypeRequiredDescription
requestIdstringyesRequest ID
jsonPathsstring[]yesDot-notation paths to extract (e.g., ["data.object.id", "type"])

verify_signature

Verify the webhook signature on a captured request. Supports two modes:

  1. Stored result (no provider/secret) — returns the pre-computed server-side verification result when signing is configured on the endpoint
  2. Client-side (with provider + secret for HMAC providers, or provider + publicKey for Discord) — performs verification on demand
ParameterTypeRequiredDescription
requestIdstringyesRequest ID
providerstringnoProvider name (stripe, github, shopify, twilio, slack, paddle, linear, discord, clerk, vercel, gitlab, typeform, standard-webhooks, meta, lemonsqueezy, coinbase-commerce, razorpay, cal, intercom, telegram, square, hubspot, mailgun, calendly, mux, sentry, bitbucket, docusign, adyen, paypal). Omit to return stored result
secretstringnoSigning secret (required for client-side HMAC-based verification)
publicKeystringnoPublic key (required for Discord Ed25519 verification)
urlstringnoRequest URL (required for Twilio, Square, and HubSpot signature verification)
methodstringnoHTTP method used when the signature was generated (used by HubSpot v3; the SDK assumes POST when omitted)

Teams

An API key carries the team access of the account it belongs to. Shared endpoints already appear in list_endpoints and work with every request tool by slug except clear_requests, which only the owner may call; these tools manage the teams. Invites are not exposed: accepting one claims a paid seat and inviting sends email, so those stay with people (dashboard, whk teams, or the SDK).

list_teams

List the teams you own or belong to: role, seats, requestsUsed and requestLimit of the pooled quota, periodEnd, and whether the team is suspended. No parameters.

list_team_members

List a team's members and pending invites.

ParameterTypeRequiredDescription
teamIdstringyesTeam id from list_teams

share_endpoint

Share an endpoint you own with a team. The team needs an active subscription; the endpoint's requests then draw from the team's pooled quota.

ParameterTypeRequiredDescription
slugstringyesSlug of an endpoint you own
teamIdstringyesTeam id from list_teams

unshare_endpoint

Stop sharing an endpoint you own with a team. Same parameters as share_endpoint.

Utilities

get_usage

Your plan's request usage, remaining quota, and period end, plus a teams array with the pooled quota of every subscribed team you belong to. No parameters.

list_provider_templates

List supported webhook providers, available templates, and signing metadata. Use this before send_webhook when an agent needs to pick a realistic provider payload.

ParameterTypeRequiredDescription
providerstringnoFilter to a single provider

Example:

{
  "provider": "typeform"
}

describe

Self-documenting schema of all available operations and their parameters. No parameters.

Without an API key: the agent sandbox

A server started without WHK_API_KEY registers these ten tools instead of the ones above. The seven endpoint and request tools have the same names and arguments as the full tools, but run in the agent sandbox (auth.md): up to 3 endpoints at a time, 25 captured requests each and 100 in all, deleted 24 hours after the sandbox was created. Captures are readable only by this agent.

ToolIn the sandbox
create_endpointCreates a capture endpoint. The first call registers the sandbox (a few seconds of proof of work). mockResponse, responseRules, notificationUrl and the signing options are refused; name and expiresIn are ignored.
list_endpointsThis agent's sandbox endpoints; empty before the first create_endpoint. team is refused.
get_endpointOne sandbox endpoint, with its limits and usage
delete_endpointFrees a slot; the 100-request budget is not refunded
list_requestsCaptured requests, newest first (HTTP only)
get_requestOne captured request
wait_for_requestWaits for a capture

connect_account

Connect the agent to a human's account. Returns verificationUri, a 6-digit userCode and a tellTheHuman line to show them: they sign in or sign up with that email and enter the code. With a sandbox, its endpoints move into the account with what they captured; without one, the agent registers for that human directly. Calling it again gives a new code.

ParameterTypeRequiredDescription
emailstringyesThe human's email address; only someone signed in as it can connect

wait_for_connection

Wait for the human to enter the code. On success the full tools for their account replace the sandbox tools (the server sends notifications/tools/list_changed). Otherwise it returns status waiting (call it again), expired (call connect_account for a new code) or declined. The connection lasts while the server runs; set WHK_API_KEY for a lasting setup.

ParameterTypeRequiredDescription
timeoutSecondsnumbernoHow long to wait, 1 to 600 seconds (default 45)

about_sandbox

The sandbox limits, what needs an account, and how to connect one. No parameters and no network call.

For provider templates in send_webhook and send_to, secret is required for every signed provider. Only sendgrid, discord, and plaid templates are unsigned and need no secret. The MCP server does not inject a default secret.

MCP Overview

Installation, setup, and getting started with the MCP server.

Agent Workflows

Multi-turn conversation examples for common webhook tasks.