Skip to content

[factory] Sender conformance checks for MCP Events webhooks — pr-open - #62

Open
NickolasBenakis wants to merge 2 commits into
factory/mcp-events-2from
factory/mcp-events-3
Open

NickolasBenakis wants to merge 2 commits into
factory/mcp-events-2from
factory/mcp-events-3

Conversation

@NickolasBenakis

Copy link
Copy Markdown
Owner

Sender-side conformance and failure checks for MCP Events webhook delivery, in conformance/mcp-events-sender/. Stacked on #61. Not part of the npm package.

check.mjs runs a receiver that misbehaves on purpose (5xx, 410, 413, redirects, no challenge echo, downtime) plus a small JSON-RPC client. It checks any MCP server's webhook mode: 36 checks, each marked MUST, SHOULD or INFO with the SEP section it comes from. Triggering events is a command you pass, so it works with any server language. Receiver-side checks already exist in evdock; this covers the sending side.

example-server.mjs has a hookgres/mcp-events mode and a naive in-memory mode with the usual mistakes, so the checks themselves are tested.

Verification

  • DATABASE_URL=... ./run-example.sh: 36 passed.
  • ./run-example.sh --broken: 10 MUST and 1 SHOULD failed, each for the planted defect: no input or auth checks, no verification, webhook-id derived from eventId, 410/413 retried, redirects followed, no dual signing, wrong unsubscribe error.
  • pnpm lint passes.

Decision Log

  • Callback URLs must be https, so the receiver uses a self-signed certificate (check.mjs tls) that the server trusts through NODE_EXTRA_CA_CERTS or the equivalent. --insecure-http exists for servers in a test mode, and skips the https check.
  • An allowlist and "no verification" look the same from outside, so a missing handshake is only a failure with --expect-handshake.
  • The restart check is INFO: the SEP allows emit-only types to lose events across restarts.
  • Review fixes: the trigger runs asynchronously, so servers that deliver inside the trigger call aren't stalled; a short eventId appearing inside a random webhook-id isn't counted as "derived".

Follow-ups

  • Not checked yet: DNS rebinding, private-address blocking, timeouts, suspension, cursors and replay, gap/terminated.
  • It may belong in its own repository, or with the working group, rather than here.

🤖 Generated with Claude Code

NickolasBenakis and others added 2 commits November 13, 2026 23:26
A fault-injecting receiver and MCP client that check a server's
SEP-3415 webhook delivery: signatures, headers, retries, 410/413,
redirects, endpoint verification, rotation, unsubscribe and restarts.
Includes an example server with a hookgres mode and a naive mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d is MUST

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Nov 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
hookgres Ready Ready Preview Nov 13, 2026 9:29pm UTC

@NickolasBenakis NickolasBenakis changed the title [factory] Sender conformance checks for MCP Events webhooks — in-review [factory] Sender conformance checks for MCP Events webhooks — pr-open Nov 13, 2026
@NickolasBenakis
NickolasBenakis marked this pull request as ready for review November 13, 2026 21:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant