Tool Reference
Complete reference for all 48 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 Nov 2026
Endpoint management
create_endpoint
Create a new webhook endpoint. Returns the endpoint slug and full URL.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | no | Display name for the endpoint |
ephemeral | boolean | no | Auto-delete after 12 hours |
expiresIn | string | no | Custom expiry duration (e.g., "2h", "7d") |
mockResponse | object | no | Mock response config (see fields below) |
responseRules | array | no | Conditional response rules (method/path/header/body conditions + responses) |
notificationUrl | string | no | Adds a Notifications destination: a chat message, at most one a second |
signingProvider | string | no | Provider for automatic signature verification (e.g., stripe, github) |
signingSecret | string | no | Signing secret (encrypted server-side). Required when signingProvider is set |
signingHeader | string | no | Custom header name (only for generic-hmac provider) |
site | string | no | Which site's dashboard lists it: webhooks, mailhooks or both (default) |
mockResponse fields:
| Field | Type | Required | Description |
|---|---|---|---|
status | number | yes | HTTP status code (100-599) |
body | string | no | Response body |
headers | Record<string, string> | no | Response headers |
delay | number | no | Response delay in ms (0-30000) |
create_endpoints
Create 1--20 endpoints in a single call. Returns an array of created endpoints.
| Parameter | Type | Required | Description |
|---|---|---|---|
count | number | yes | Number of endpoints to create (1--20) |
namePrefix | string | no | Prefix for auto-generated names |
ephemeral | boolean | no | Auto-delete after 12 hours |
expiresIn | string | no | Custom 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). Each carries favorite, whether you marked it as a favourite.
| Parameter | Type | Required | Description |
|---|---|---|---|
team | string | no | Team 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, including favorite, whether you marked it as a favourite.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
favorite_endpoint
Mark an endpoint as one of your favourites, or unmark it. A favourite is your own choice, never the endpoint's, so endpoints shared with you through a team can be marked too. Idempotent; returns { slug, favorite }.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
favorite | boolean | no | true marks it (the default), false unmarks it |
update_endpoint
Update an endpoint's name, mock response, notification webhook, signing configuration, or whether codes and links are picked out of its emails. Forwarding has its own tools.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
name | string | no | New display name |
mockResponse | object | no | Mock response config (see fields above), or null to clear |
responseRules | array | no | Conditional response rules, or null to clear |
notificationUrl | string | no | Sets the Notifications destination, or null removes it |
signingProvider | string | no | Signing provider (e.g., stripe), or null to disable |
signingSecret | string | no | New signing secret (encrypted server-side), or null to clear |
signingHeader | string | no | Custom header name (only for generic-hmac), or null to clear |
showEmailExtracts | boolean | no | Pick codes and links out of emails (dashboard and forwarded JSON); owner only |
site | string | no | Which site's dashboard lists it: webhooks, mailhooks or both; owner only |
emailFields | array | no | Named fields to pick out of every email, { name, from, header?, pattern } (RE2), at most 20; replaces the list, null or [] removes them; owner only. See Fields you pick out |
layouts | array | no | How the endpoint reads each sender's emails: { id, name, enabled?, match?, fields?, lineItems?, parseAttachments? }, the first whose match holds applies; replaces the list, null or [] removes them; owner only. See Layouts |
preview_layouts
A dry run of the endpoint's layouts on a captured email: which layout matches, the fields and line items it finds, and what earlier parses of its attachments held. Nothing is saved and no pages are used. Pass layouts to try them before saving them with update_endpoint.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
requestId | string | no | A captured email on the endpoint (default: the newest) |
layouts | array | no | Layouts to try instead of the saved ones |
Returns any problems with the layouts tried, the plan's layoutsCap, the request it ran on and parsed: the status (matched or no_layout), the layout, fields, lineItems with lineItemColumns, attachments and pages. Long results keep the first 20 line items and leave out sheet rows and attachment text.
preview_response
A dry run of the endpoint's responses: which response rule answers a captured request, and the response with its {{ placeholders }} filled in, exactly as the receiver would send it. Nothing is sent. Pass mockResponse or responseRules to try settings before saving them with update_endpoint.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
requestId | string | no | A captured request on the endpoint (default: the newest HTTP request) |
mockResponse | object | no | A default response to try instead of the saved one, or null for none |
responseRules | array | no | Rules to try instead of the saved ones, or null for none |
Returns the rule that answered (rule.index, from 0, or null for the default response), the response (status, headers, body, delay; null means the plain 200 OK), any unknownPlaceholders, and the request it ran against.
delete_endpoint
Delete an endpoint and all its captured requests.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
delete_endpoints
Delete 1--100 endpoints in a single call.
| Parameter | Type | Required | Description |
|---|---|---|---|
slugs | string[] | yes | Array 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
method | string | no | HTTP method (default: "POST") |
headers | object | no | HTTP headers to include |
body | any | no | Request body |
provider | string | no | Provider 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) |
template | string | no | Template name (e.g., checkout.session.completed or form_response) |
event | string | no | Event type override |
secret | string | yes (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.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | yes | Target URL (http or https) |
method | string | no | HTTP method (default: "POST") |
headers | object | no | HTTP headers to include |
body | any | no | Request body |
provider | string | no | Provider for signing |
template | string | no | Template name |
event | string | no | Event type override |
secret | string | yes (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.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | yes | Target URL |
method | string | no | HTTP method |
headers | object | no | HTTP headers |
body | any | no | Request body |
provider | string | no | Provider for signing |
template | string | no | Template name |
event | string | no | Event type override |
secret | string | yes (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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | no | Provider template to use |
event | string | no | Event type |
secret | string | no | Signing secret |
mockStatus | number | no | HTTP status for mock response |
targetUrl | string | no | URL to replay the captured request to |
verifySignature | boolean | no | Verify the webhook signature after capture |
cleanup | boolean | no | Delete 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
endpointSlug | string | yes | Endpoint slug |
limit | number | no | Max results to return |
since | number | no | Only return requests after this timestamp in ms |
kind | string | no | http for HTTP requests only, email for emails only |
get_request
Get full details of a captured request, including headers and body.
| Parameter | Type | Required | Description |
|---|---|---|---|
requestId | string | yes | Request ID |
wait_for_request
Poll until a request arrives at an endpoint, then return it.
| Parameter | Type | Required | Description |
|---|---|---|---|
endpointSlug | string | yes | Endpoint slug |
timeout | number | no | Max wait time in milliseconds |
pollInterval | number | no | Interval between polls in milliseconds |
wait_for_requests
Poll until a specified number of requests arrive at an endpoint.
| Parameter | Type | Required | Description |
|---|---|---|---|
endpointSlug | string | yes | Endpoint slug |
count | number | yes | Number of requests to wait for |
timeout | number | no | Max wait time in milliseconds |
pollInterval | number | no | Interval between polls in milliseconds |
method | string | no | Filter by HTTP method |
search_requests
Full-text search across captured requests. Supports time ranges, method filters, and pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | no | Filter by endpoint slug |
method | string | no | Filter by HTTP method |
kind | string | no | http for HTTP requests only, email for emails only |
q | string | no | Search query (searches headers and body) |
from | string | no | Start time -- relative duration like "1h" or ISO timestamp |
to | string | no | End time -- relative duration or ISO timestamp |
limit | number | no | Max results |
offset | number | no | Pagination offset |
order | string | no | "asc" or "desc" |
count_requests
Count requests matching the given filters. Takes the filters of search_requests, without its paging and order.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | no | Filter by endpoint slug |
method | string | no | Filter by HTTP method |
kind | string | no | http or email |
q | string | no | Search query |
from | string | no | Start time |
to | string | no | End time |
clear_requests
Delete captured requests for an endpoint without deleting the endpoint itself.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
before | string | no | Delete 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
endpointSlug | string | yes | Endpoint slug |
limit | number | no | Max emails to return (1 to 100, default 25). With tag, subject or from, the newest 100 emails are searched |
since | number | no | Only emails received after this timestamp in ms |
tag | string | no | Only emails sent to this +tag (case-sensitive) |
subject | string | no | Only emails whose subject contains this text |
from | string | no | Only 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
requestId | string | no | The email's request ID |
endpointSlug | string | no | Get the newest email at this endpoint instead |
tag | string | no | With endpointSlug: only this +tag |
includeHtml | boolean | no | Include 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
endpointSlug | string | yes | Endpoint slug |
tag | string | no | Only emails sent to this +tag |
subject | string | no | Only emails whose subject contains this text |
from | string | no | Only emails from this address |
timeout | string | number | no | How long to wait (default "30s"). Keep it under your MCP client's request timeout, often 60 seconds |
since | number | no | Only emails received after this timestamp in ms |
includeHtml | boolean | no | Include 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
tag | string | no | Deliver to {slug}+{tag}@mailhooks.cc |
render_email
A captured email in the shape an inbound mail service posts it, to test the handler you wrote for that service against real mail (In a mail provider's shape). Returns { format, method, headers, body }; with targetUrl (your local handler), posts it there and returns the status and the start of the answer.
| Parameter | Type | Required | Description |
|---|---|---|---|
requestId | string | yes | The captured email |
format | "postmark" | "sendgrid" | "mailgun" | "cloudmailin" | "json" | yes | Whose shape; json is webhooks.cc's own email.received |
mailgunSigningKey | string | no | For mailgun: the key your handler verifies with |
targetUrl | string | no | Post it here, for example http://localhost:3000/inbound |
Forwarding
Forwarding sends what an endpoint captures to up to 10 destinations (servers, Slack or Discord channels, tools such as Zapier or n8n), each with its own kinds, conditions, format, timing and signing secret, queued, retried and logged. Only the endpoint's owner can manage it.
A typical agent session: add_destination, preview_destination to see the exact request it would send, test_forwarding with the destination's id to send one, then list_deliveries to watch it.
list_destinations
List the endpoint's destinations with every setting (header values masked) and, by default, each one's last 24 hours.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
summary | boolean | no | Add each destination's last 24 hours (default true) |
add_destination
Add a destination; it is on at once unless enabled: false, and gets a signing secret of its own. Returns the destination with its id.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
url | string | yes | https URL on a public host name, or a Slack or Discord webhook |
name | string | null | no | A name for the list and the log |
enabled | boolean | no | Send to it (default true) |
http, email | boolean | no | Which kinds it takes (default both) |
filter | { logic?, conditions } | null | no | Send only matching captures; see Send only some captures |
format | string | no | auto (chat for Slack and Discord URLs), as_received, json, template, chat, or for emails a mail provider's shape: postmark, sendgrid, mailgun, cloudmailin |
mailgunSigningKey | string | null | no | With mailgun: your Mailgun signing key, so signature verifies; write-only |
bodyTemplate | JSON | no | With template: the body, its strings holding {{ placeholders }} (Your own JSON) |
messageTemplate | string | null | no | With chat: your own message text; null sends the standard message |
headers | { name, value | null }[] | no | Your own headers (at most 10, not for chat) |
appendPath | boolean | no | Add the captured path to the URL for relayed requests (default true) |
retrySeconds | 0 | 3600 | 86400 | no | How long failed deliveries are retried (default a day) |
keepOrder | boolean | no | One delivery at a time, in capture order |
sentField | string | null | no | JSON body field with the sender's timestamp, for timing |
throttleSeconds | number | no | At most one delivery every so many seconds, 0 to 3,600; 1 makes a heads-up channel |
delaySeconds | number | no | Wait this long after the capture before sending, 0 to 3,600 |
A filter condition takes field, op and value like a response rule condition, plus kind, email (name: subject, from, to, text or tag), email_field (name: one of the endpoint's named fields), spam_score, email_auth (name: spf, dkim or dmarc) and signature (verified, failed or missing).
update_destination
Change a destination; only the fields passed change. Takes slug, destinationId and any field of add_destination, url included. Switching it off or taking a kind away fails the deliveries still waiting for it.
remove_destination
Remove a destination. Deliveries still waiting for it are marked failed; its log stays.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
destinationId | string | yes | The destination's id |
preview_destination
A dry run: whether the destination's filter lets a captured request through (filterPasses), and the exact request it would send (delivery: method, URL, headers, body, with placeholders filled in and unknownPlaceholders listed). Nothing is sent. Pass destinationId, destination (unsaved fields, on top of the saved ones or with a url on their own), or both.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
destinationId | string | no | A saved destination |
destination | object | no | Fields of add_destination to try |
requestId | string | no | A captured request (default: the newest of a kind it takes, or a sample) |
configure_forwarding
Change the endpoint's primary destination, the one its forwardUrl stands for; only the arguments passed change. Saving the first URL creates it with its signing secret, so the agent can send a test delivery before turning it on. Returns the primary destination's settings, with header values masked. For filters, templates, throttling, delays or more than one destination, use add_destination and update_destination.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
url | string | null | no | https URL on a public host name, or null to remove it (when off) |
enabled | boolean | no | Turn it on (needs a URL) or off |
http | boolean | no | Forward HTTP requests |
email | boolean | no | Forward emails |
format | "auto" | "as_received" | "json" | "chat" | no | How deliveries go out; auto picks chat for Slack and Discord URLs |
headers | { name, value | null }[] | no | Your own headers (at most 10); replaces the list, null keeps a stored value |
appendPath | boolean | no | Add the path after the slug to the URL for relayed requests (default true) |
retrySeconds | 0 | 3600 | 86400 | no | How long failed deliveries are retried (default a day) |
keepOrder | boolean | no | One delivery at a time, in capture order |
sentField | string | null | no | JSON body field with the sender's timestamp, such as publishedAt, for timing |
get_forwarding_secret
Read the whsec_ secret a destination signs its deliveries 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
destinationId | string | no | A destination (default: the primary destination) |
rotate | boolean | no | Replace the secret (default false) |
test_forwarding
Send the newest captured request of a kind (or a sample, if none has arrived, or requestId) to a destination 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 whether the destination is on or off and whatever its filter says; nothing is retried or logged.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Endpoint slug |
destinationId | string | no | A destination (default: the primary destination) |
kind | "http" | "email" | no | Which kind (default: HTTP when the destination takes it) |
requestId | string | no | With destinationId: a captured request to send |
list_deliveries
With endpointSlug, return the endpoint's delivery log with its counts: { summary, deliveries, nextCursor }. Each row names its destination, and carries 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
endpointSlug | string | no | The endpoint's delivery log |
requestId | string | no | Every delivery of this request, with each try |
limit | number | no | With endpointSlug: 1 to 100 (default 20) |
status | "all" | "pending" | "failed" | "skipped" | no | With endpointSlug: filter (default all); skipped is filtered out |
destinationId | string | no | With endpointSlug: only this destination |
before | string | no | With endpointSlug: nextCursor, for older rows |
redeliver
Forward again with the current settings: one request or email (requestId, to every destination that takes it, or with destinationId to that one whatever its filter says), or every request whose latest delivery failed (endpointSlug, optionally only destinationId, oldest first, up to 1,000 at a time per destination). Pass exactly one of requestId and endpointSlug.
| Parameter | Type | Required | Description |
|---|---|---|---|
requestId | string | no | The request or email to send again |
endpointSlug | string | no | Send every failed delivery of this endpoint |
destinationId | string | no | Only this destination |
Request analysis
replay_request
Replay a captured request to a target URL. Sends the original method, headers, and body.
| Parameter | Type | Required | Description |
|---|---|---|---|
requestId | string | yes | ID of the captured request |
targetUrl | string | yes | URL to send the replayed request to |
compare_requests
Diff two captured requests. Returns structured differences in method, headers, and body.
| Parameter | Type | Required | Description |
|---|---|---|---|
leftRequestId | string | yes | First request ID |
rightRequestId | string | yes | Second request ID |
ignoreHeaders | string[] | no | Header names to exclude from comparison |
generate_payload_schema
Generate TypeScript interfaces, Zod schemas, Pydantic models, or JSON Schema from the bodies of captured requests. It reads the latest requests (or exactly the ones you name), keeps those that match the filters, and learns one schema from all of their JSON or form bodies: a field missing from some samples is optional, a field that is sometimes null is nullable, and identical nested objects become one type. Filter to one event for the tightest types; the result warns when the samples mix events.
| Parameter | Type | Required | Description |
|---|---|---|---|
endpointSlug | string | yes | Endpoint slug |
format | string | no | typescript (default), zod, pydantic, or json-schema |
name | string | no | Root type name (default: from the detected event, such as InvoicePaidEvent, else WebhookPayload) |
event | string | no | Only requests whose detected provider event matches, such as invoice.paid or push |
method | string | no | Only requests with this HTTP method |
path | string | no | Only requests with this path |
requestIds | string[] | no | Use exactly these requests (1 to 50) instead of the latest ones |
limit | number | no | How many of the latest requests to read before filtering, 1 to 100 (default 20) |
Returns format, name, samples (requests used), skipped (emails and bodies that are neither JSON nor form data), the detected events, and code. The same generator is generateRequestSchema() in @webhooks-cc/sdk, and the dashboard shows it as the Schema view of a request body.
extract_from_request
Extract specific JSON fields from a captured request body using dot-notation paths.
| Parameter | Type | Required | Description |
|---|---|---|---|
requestId | string | yes | Request ID |
jsonPaths | string[] | yes | Dot-notation paths to extract (e.g., ["data.object.id", "type"]) |
verify_signature
Verify the webhook signature on a captured request. Supports two modes:
- Stored result (no provider/secret): returns the pre-computed server-side verification result when signing is configured on the endpoint
- Client-side (with provider + secret for HMAC providers, or provider + publicKey for Discord): performs verification on demand
| Parameter | Type | Required | Description |
|---|---|---|---|
requestId | string | yes | Request ID |
provider | string | no | Provider 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 |
secret | string | no | Signing secret (required for client-side HMAC-based verification) |
publicKey | string | no | Public key (required for Discord Ed25519 verification) |
url | string | no | Request URL (required for Twilio, Square, and HubSpot signature verification) |
method | string | no | HTTP 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
teamId | string | yes | Team 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Slug of an endpoint you own |
teamId | string | yes | Team 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | no | Filter 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, and without a saved connection to a human's account (see the agent credential file), registers these eleven tools instead of the ones above. The eight 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.
| Tool | In the sandbox |
|---|---|
create_endpoint | Creates 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_endpoints | This agent's sandbox endpoints; empty before the first create_endpoint. team is refused. |
get_endpoint | One sandbox endpoint, with its limits and usage |
delete_endpoint | Frees a slot; the 100-request budget is not refunded |
list_requests | Captured requests, newest first (HTTP only) |
get_request | One captured request |
wait_for_request | Waits for a capture |
generate_payload_schema | Types from the sandbox's captured requests, as above |
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 made in this session, its endpoints move into the account with what they captured; with one from an earlier session, or none, the agent registers for that human directly (endpoints in the answer says which). Calling it again gives a new code.
| Parameter | Type | Required | Description |
|---|---|---|---|
email | string | yes | The 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 is saved in the agent credential file, so later sessions start with the full tools; when the human disconnects the agent under Account, Connected agents, the sandbox tools come back.
| Parameter | Type | Required | Description |
|---|---|---|---|
timeoutSeconds | number | no | How 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.