Skip to content

Releases: zebbern/webhook-mcp-server

3.0.0

Choose a tag to compare

@zebbern zebbern released this 03 Sep 23:00

Full coverage of the documented webhook.site API. With WEBHOOK_SITE_API_KEY set you get what your plan pays for; without it everything still works on anonymous URLs.

Added

  • list_webhooks, configure_webhook (all token settings: listen, request_limit, actions, clone_from, group_id, alias, expiry), get_request (latest or by id, raw), update_request (notes, dynamic responses), download_request_file
  • manage_custom_actions (list / create / update / delete / test / execute), manage_schedules (incl. run-now and logs), manage_global_variables, manage_groups, manage_templates, manage_databases (incl. SQL query), manage_users
  • export_webhook_data pages through the requests list (the API caps a page at 100) and can return the account's CSV export
  • wait_for_request / wait_for_email listen on ws.webhook.site (socket.io) and fall back to polling; results carry source
  • Emails expose sender, checks (spam, virus, SPF, DKIM, DMARC), email_truncated and attachments; list results carry pagination
  • MCP tool annotations (readOnlyHint, destructiveHint, idempotentHint) on every tool
  • WEBHOOK_SITE_DEFAULT_EXPIRY for operators who want new URLs to auto-expire
  • live_auth test tier that runs the real sign-up flow (create URL, send a verification-style email through a Custom Action, wait_for_email, follow_email_link) when WEBHOOK_SITE_API_KEY is set
  • FOLLOW_EMAIL_LINK_ALLOW_HOSTS: operator-configured hosts, *.suffixes, IPs or networks that follow_email_link may open although they are local or private (for testing your own sign-up flow on localhost or an intranet)
  • follow_email_link honours HTTPS_PROXY / HTTP_PROXY / NO_PROXY; proxied targets are checked before the request since the proxy makes the connection
  • follow_email_link reports a redirect refused after a completed public hop as blocked_redirect, with that hop's status, instead of failing the whole call
  • manage_custom_actions(action="script_reference"): every WebhookScript function with its signature and summary, generated from the docs and checked name-by-name against the live engine (two documented names do not exist there), plus language notes (var() is required, strict typing, regex literals)
  • Action-type reference corrections found in the frontend bundle and confirmed live: set_variable modes math and random_number, conditions operators regex/nex/null/nnull (the singular condition rejects them), text_map operator codes, database type whdb with db_id, the editor's no-queue types
  • Custom actions carry a name; updates keep it (the API drops it on a bare PUT). Schedules accept require_cert_expiry (days before the HTTPS certificate expires)
  • Every webhook_token accepts an alias, a pasted https://webhook.site/... URL, the subdomain form, the inbox address or the DNSHook name; aliases resolve through GET /token/{alias} (works live although the docs say otherwise)
  • configure_webhook on an aliased token returns alias_cache_note: webhook.site serves the previous settings on the alias URL for about two minutes after a change (measured), the UUID URL updates at once
  • since / next_since on get_webhook_requests and search_requests: a sorting cursor that returns only what arrived after the previous call, without paging or de-duplicating
  • configure_webhook(alias="") removes an alias; get_webhook_info returns force_status_url (https://webhook.site/{token}/{status} answers with that status); search_requests documents exclusion (-method:GET), _exists_:, note: and geo fields

Changed

  • The HTTP client expires idle keep-alive connections after 4 s and retries idempotent calls once after a dropped connection (webhook.site closes idle connections after a few seconds)

  • Documentation consolidated under docs/: generated tool reference and README tables, verified webhook.site notes, testing and releasing guides; the stale publishing guide and manual test scripts are gone

  • Email addresses use the current {token}@emailhook.site domain (the old email.webhook.site form still delivers)

  • request_limit is no longer capped client-side at 10000; the API enforces the plan's ceiling (up to 100000 on Enterprise)

  • Tool merges (no capability removed): create_webhook_with_config + update_webhook -> configure_webhook; get_webhook_url + get_webhook_dns -> fields of get_webhook_info; get_latest_request -> get_request; send_to_webhook + send_multiple_requests -> send_requests; generate_ssrf_payload + generate_xss_callback + generate_canary_token -> generate_oob_payloads

  • Tokens created with an API key are permanent by default (pass expiry or set WEBHOOK_SITE_DEFAULT_EXPIRY to change that)

  • The HTTP client now raises WebhookApiError on failed DELETEs like every other verb, and every API error carries webhook.site's own validation message

  • configure_webhook on an existing token no longer wipes the other settings: PUT /token/{id} replaces them, so a 2.x update_webhook(cors=true) silently reset the canned status, body and timeout. The current settings are merged in first

  • Verified against the live API rather than the docs: notes and Set Response live on /request/{id} (singular); updates of actions, schedules, templates, global variables, databases and users send the full record because the API replaces it (a value-only variable update would have wiped its name); run-now answers with a redirect; check_for_callbacks matches the identifier anywhere in the captured request, not only in the body

  • scripts/live_tool_check.py drives the real server over stdio and exercises all 28 tools against the live API

  • respond_to_next_request: hold the next request and answer it with a chosen status, headers and body, the mechanism whcli forward uses (token listen set by PUT, socket listener, Set Response on the event). Verified live: the waiting caller received the reply in 0.2 s. listen is silently ignored by POST /token, so configure_webhook now applies it with a follow-up PUT

  • Found by mapping the web app rather than the docs: manage_queues (Queue Profiles at /queues, with queue_id on custom actions), the description field on configure_webhook, and the live GET /variables names merged into the variables reference. Error log, providers, domains, API keys, notifications, roles and the form builder need a browser session and are not exposed

  • docs/TOOLS.md, generated from the server's own catalogue (scripts/gen_tool_docs.py); CI fails when it or the README tool tables drift

  • Real-socket tests for follow_email_link against a local web server and a local HTTP proxy (allowlist, HTTP_PROXY, NO_PROXY), no mocks involved

  • server_status diagnostics tool (key, account, plan, socket, env, problems in plain words)

  • Rate limits: a 429 with a short Retry-After is waited out and retried once (WEBHOOK_MCP_RATE_LIMIT_MAX_WAIT, default 15 s); longer waits are reported with the exact wait instead of hanging. A socket dropped mid-wait switches the wait tools to fast polling

  • Recorded-truth tests: scripts/live_tool_check.py --record captures every real HTTP exchange and tool result; tests/test_replay_recordings.py replays them through the real service code offline and expects the recorded results, so offline CI asserts on what webhook.site actually returned

  • Built-in Custom Action reference: manage_custom_actions(action="types") lists 63 action types (two of them, mock and validate_json, exist live but are missing from the API docs) with parameters, live-verified status and a working example; action="variables" lists the $request.*$ variables checked live. Required parameters are validated before the API is called, including three the docs call optional but the API insists on. Regenerate with scripts/gen_action_types.py and re-verify with scripts/verify_action_types.py

  • Catalog token budget raised to 10000 for the 31-tool catalog

  • New dependency: python-socketio[asyncio_client]

Fixed

  • follow_email_link now connects to the address it vetted (no DNS rebinding), also blocks cloud metadata and NAT64 / IPv4-mapped private addresses, resolves hosts without blocking the event loop, treats a 3xx without Location as the final page, rejects javascript: and other non-http redirects cleanly, and reports the ranked auth_links it chose from. When an environment proxy applies, the target is checked with the resolver before the request, because the proxy makes the connection and pinning cannot apply
  • follow_email_link picks the email that contains url=, or the newest email with a verify / confirm / magic link, instead of the newest email with any login link
  • Link extraction ignores the raw quoted-printable message when decoded text or HTML exists, decodes & in hrefs (but leaves &region=-style query strings alone), handles IPv6-literal URLs, ranks verify / confirm links and "Verify your email" anchor text ahead of login links, and never returns unsubscribe or asset links as auth_links
  • verification_codes understands "code is 512930", "code: 123 456", "G-847291 is your code" and "847291 is your code", ignores zip / promo / sort codes and order numbers, and no longer lists CSS colours ahead of the real OTP; markup stripping is linear on hostile input

v2.2.2

Choose a tag to compare

@zebbern zebbern released this 16 Aug 00:22

Summary

  • follow_email_link opens a verify / magic / reset URL already captured in the inbox (public http(s) only).
  • wait_for_email and extract_links_from_request return verification_codes (OTP).
  • List/wait tools omit HTML and truncate bodies; use export_webhook_data for the full dump.
  • Tool catalog must stay under 5000 tokens in CI.
  • Default MCP install configs no longer mention an API key.

Install: uvx webhook-mcp-server==2.2.2

v2.2.1

Choose a tag to compare

@zebbern zebbern released this 15 Aug 23:45

Summary

  • Tool descriptions now tell models they can sign up on a website via the temp inbox (create_webhook → wait_for_email → extract verify / magic-link / reset URLs).
  • Install examples pin uvx webhook-mcp-server==2.2.1 so clients do not keep broken 2.1.3.

PyPI

This release triggers publish. If the job fails with invalid-publisher, add a trusted publisher at https://pypi.org/manage/project/webhook-mcp-server/settings/publishing/ (owner zebbern, repo webhook-mcp-server, workflow publish.yml, environment blank) and re-run the failed workflow.

v2.2.0 - Support MCP 2.0

Choose a tag to compare

@zebbern zebbern released this 15 Aug 23:24

Changed

  • Migrated to MCP Python SDK 2.0 MCPServer with typed tools
  • Reuse one HTTP client and read WEBHOOK_SITE_API_KEY from the environment
  • wait_for_request / wait_for_email wait for new events by default (return_existing=true for the old behavior)
  • SSRF output split into callback_payloads and local_bypass_examples

Fixed

  • Server failed to start on MCP SDK 2.0
  • ToolResult.to_json() crashed when data was None
  • Token UUID validation skipped on several tools

Added

  • Offline unit tests and CI
  • Official server.json for the MCP Registry
  • Cursor MCP config and authorized-use notes

v2.1.2

Choose a tag to compare

@zebbern zebbern released this 26 Jan 16:11

Removed

  • Removed clone_webhook tool due to webhook.site API compatibility issues (24 → 23 tools)

Changed

  • Updated README and badges to reflect 23 tools

Full Changelog: v2.1.1...v2.1.2

v2.1.1

Choose a tag to compare

@zebbern zebbern released this 26 Jan 16:05

Fixed clone_webhook tool - was calling dict method incorrectly

v2.1.0

Choose a tag to compare

@zebbern zebbern released this 26 Jan 15:59

3 new tools for batch operations and webhook management. Now 24 tools total!

v2.0.7

Choose a tag to compare

@zebbern zebbern released this 26 Jan 15:48

Complete README rewrite with professional MCP-focused structure. All 21 tools documented, natural language examples, JSON response samples.

v2.0.6

Choose a tag to compare

@zebbern zebbern released this 26 Jan 15:36

What's Changed

Cleanup

  • Removed ~1,075 lines of dead code, redundant files, and unused functions
  • Deleted 5 redundant test/script files
  • Removed unused classes (\WebhookInfo, \WebhookRequest)
  • Cleaned up unused imports across all modules

Code Quality Improvements

  • Added DRY helper methods (_build_webhook_urls(), _validate_token_exists())
  • Replaced magic numbers with named constants
  • Added proper type hints to handler methods

Documentation

  • Added LICENSE file (MIT)
  • Added CHANGELOG.md with full version history
  • Enhanced \pyproject.toml\ with proper metadata, keywords, and classifiers

Links

Full Changelog: v2.0.5...v2.0.6

v2.0.5 - Console Script Wrapper

Choose a tag to compare

@zebbern zebbern released this 26 Jan 14:52

Added synchronous entry point wrapper for console script compatibility