Skip to main content
Glama
void-pulse

Webhook Capture MCP

by void-pulse

webhook-capture-mcp

Let your AI assistant see your webhooks. A self-hosted MCP server that captures incoming webhook/HTTP requests and lets Claude, Cursor, or VS Code inspect, wait for, and replay them β€” so you can debug "why isn't my webhook working?" by having the AI read the actual payload.

You're wiring up a Stripe event, a GitHub webhook, an n8n/Make callback. Something fires, but you can't see what it sent. Instead of reaching for webhook.site and copy-pasting into chat, point the webhook here and ask your assistant: "what did that request contain?"

What it does

  • 🎣 Captures every incoming request (method, path, query, headers, raw + parsed JSON body)

  • πŸ” Inspects any captured request in full detail on demand

  • ⏳ Waits for the next request β€” "I'll wait, trigger your webhook now"

  • ♻️ Replays a captured request to any URL (e.g. your local dev server)

  • 🏠 Self-hosted, zero infrastructure β€” runs on your machine via npx, stores nothing in the cloud

Related MCP server: hookray-mcp

Install

Add it to your MCP host. It runs via npx β€” no separate install step.

Claude Desktop / Claude Code (claude_desktop_config.json or .mcp.json):

{
  "mcpServers": {
    "webhook-capture": {
      "command": "npx",
      "args": ["-y", "webhook-capture-mcp"],
      "env": { "WEBHOOK_CAPTURE_PORT": "4444" }
    }
  }
}

Cursor (~/.cursor/mcp.json) and VS Code (.vscode/mcp.json, Copilot agent mode) use the same shape. Restart the host, and you'll see the webhook-capture tools.

Use it

  1. Ask your assistant to run capture_status β€” it prints the local capture URL (http://localhost:4444) and how to expose it.

  2. Point a webhook at it.

    • Local sender (your own app, curl): hit http://localhost:4444/anything directly.

    • External sender (Stripe, GitHub…): run a tunnel on your machine and use its public URL:

      ngrok http 4444
      # or:  cloudflared tunnel --url http://localhost:4444

      Put the printed https://… URL in your provider's webhook settings.

  3. Ask: "wait for the next webhook and tell me what's in it" β†’ the assistant calls wait_for_request, you trigger the event, and it reads back the full payload.

  4. Ask: "replay that to my local server at http://localhost:3000/webhook" β†’ replay_request.

Tools

Tool

Description

capture_status

Show the capture URL, count, and how to expose it via a tunnel

list_requests

List captured requests (newest first); filter by method / path

get_request

Full detail of one request by id

wait_for_request

Block until the next request arrives (or timeout)

replay_request

Re-send a captured request to a target URL, return the response

clear_requests

Empty the store

Configuration

Env var

Default

Description

WEBHOOK_CAPTURE_PORT

4444

Port the capture listener binds to

WEBHOOK_CAPTURE_HOST

127.0.0.1

Bind address. Loopback by default (tunnels still reach it). Set to 0.0.0.0 for direct LAN senders.

Notes & limits (v0.1)

  • In-memory only β€” keeps the last 100 requests; restarting clears them. (Persistence is planned.)

  • No auth on the capture endpoint. It binds to loopback by default. If you expose it via a tunnel, treat the tunnel URL as sensitive and shut it down when done.

  • Bodies are capped at 5 MB.

Run from source

git clone https://github.com/void-pulse/webhook-capture-mcp
cd webhook-capture-mcp
npm install && npm run build
node dist/index.js   # speaks MCP over stdio

License

MIT Β© Curtis Holmes

Available Tools

6 tools
capture_statusA

Show the local webhook capture URL, how many requests have been captured, and how to expose it to the internet.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It indicates a read-only 'Show' operation, but does not explicitly state side effects, permissions, or whether it makes network calls. For a status tool, this is acceptable but not deeply transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the verb 'Show' and lists the key outputs concisely. Every word earns its place, with no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 0-parameter status tool with no output schema, the description is complete enough: it specifies the three things the user will learn (URL, request count, exposure instructions). It does not describe a return format, but that is a minor gap for such a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema is empty with 100% coverage. The baseline for 0-param tools is 4, and the description adds no parameter details because none are needed. It appropriately focuses on what the tool returns rather than inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Show the local webhook capture URL, how many requests have been captured, and how to expose it to the internet.' The verb 'Show' is specific, and the resource (capture status) is well-defined, distinguishing it from sibling tools that focus on individual requests.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to check the capture URL and request count, but it does not explicitly mention when to use it versus alternatives like list_requests or wait_for_request. There is no explicit 'when to use' or 'when not to use' guidance, though the purpose is clear enough for a status check.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_requestsA

Delete all captured requests from the store.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the full transparency burden. It explicitly states the destructive action of deleting all captured requests, which is the key behavioral trait. While it does not mention irreversibility or side effects, 'delete' sufficiently conveys the fundamental nature of the operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence with no extraneous words. It front-loads the verb 'Delete' and immediately specifies the target, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and no output schema, the description provides sufficient information to understand the operation. It could optionally mention the aftermath (e.g., no return value), but the core behavior is fully specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema fully describes the empty property set. The description adds nothing about parameters, which is appropriate since none exist. The baseline score of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (Delete) and the resource (all captured requests from the store), distinguishing it from sibling tools like list_requests and get_request that operate on individual requests. The verb 'Delete' plus the specific resource makes the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: when the agent needs to remove all captured requests. It does not explicitly mention alternatives or exclusions, but the distinct action and the sibling tools make the appropriate usage clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_requestA

Get the full detail (method, path, query, headers, body) of one captured request by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe request id from list_requests, e.g. "3"

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It explicitly states what the tool returns (method, path, query, headers, body) and that it targets a single captured request. The 'Get' verb implies a read-only operation, and the description adds detail about the response content beyond what the name alone suggests.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is front-loaded with the action and object, providing all essential information with zero redundancy. It effectively lists the returned fields without extra fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter, no output schema, and no annotations, the description is entirely sufficient. It clearly defines what the tool does, what data it returns, and the input required. There are no significant gaps given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes the 'id' parameter, including format and example ('The request id from list_requests, e.g. "3"'). The description itself does not add additional meaning beyond mentioning 'by id,' but since schema coverage is 100%, the needed semantics are already present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Get' with a precise resource: 'full detail (method, path, query, headers, body) of one captured request by id.' This clearly differentiates from siblings like list_requests (which lists requests) and replay_request (which likely alters state).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage after obtaining an id from list_requests, as the parameter description states 'The request id from list_requests.' It clearly identifies the tool for retrieving full details of a single request, though it does not explicitly mention when not to use it. The context of sibling tool names reinforces the appropriate use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_requestsA

List captured requests (newest first). Optional filters by method, path substring, and count.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default all)
methodNoFilter by HTTP method, e.g. POST
path_includesNoOnly requests whose path contains this string

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of disclosing behavior. It adds the ordering behavior ('newest first') and mentions optional filtering, but it does not state whether listing modifies or clears captured requests, nor does it describe the return payload format. For a read-only list operation this is acceptable but not fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the verb and resource, includes ordering info, and lists filters without redundancy. Every word earns its place; no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description should ideally clarify what the tool returns (e.g., full requests, summaries, or identifiers). It does not mention the return format or how it relates to sibling tools like get_request or replay_request. For a simple tool this is a notable gap, though the parameter schema and tool name provide some context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% since each parameter has a clear description. The description's mention of 'method, path substring, and count' adds little beyond the schema, as it only paraphrases the existing parameter documentation. Baseline 3 is appropriate because the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and clearly identifies the resource ('captured requests') plus a key ordering detail ('newest first'). It distinguishes itself from sibling tools like get_request (single request), wait_for_request (waiting), and clear_requests (deletion).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing requests and mentions optional filters, but it does not explicitly state when to use this tool versus alternatives such as get_request or wait_for_request, nor does it exclude any cases. The guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

replay_requestA

Re-send a previously captured request (same method, headers, and body) to a target URL, and return the response.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe captured request id to replay
target_urlYesWhere to send it, e.g. http://localhost:3000/webhook

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description carries the full disclosure burden. It explicitly states that it re-sends 'same method, headers, and body' and returns the response, which covers the core behavior. It does not mention side effects or auth requirements, but the behavior is sufficiently transparent for a simple replay operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that is front-loaded with the action and resource. It contains no unnecessary words and is easy to parse, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with only two required parameters and no output schema, the description provides adequate context by explaining what happens (replay) and what is returned (response). It does not mention edge cases or exclusions, but they are not critical for this straightforward operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides clear descriptions for both parameters (id and target_url) with 100% coverage. The tool description adds context by explaining that the request is replayed as-is, but it does not significantly enhance parameter meaning beyond the schema, warranting the baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Re-send a previously captured request... to a target URL'. It uses a specific verb ('re-send') and identifies the resource (previously captured request), distinguishing it from siblings like list_requests or clear_requests.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (when you need to resend a previously captured request) but does not explicitly mention alternatives or exclusions. There is no 'use this instead of X' guidance, though the purpose is clear enough to infer appropriate use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_requestA

Block until the NEXT webhook arrives (or timeout). Use this to say 'I'll wait, trigger your webhook now' and then inspect what comes in.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeout_secondsNoHow long to wait, max 120s (default 30)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the blocking behavior, timeout, and the intended follow-up action (inspect what comes in), which covers the essential traits. It doesn't detail timeout failure modes but is adequate for a simple wait operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core action, and contains no filler. Every clause earns its place: it states what it does, how to use it, and what to do after.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one optional parameter and no output schema, the description fully covers the tool's purpose, usage, and expected follow-up. It is complete for its complexity and context, and the sibling tool names provide additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single parameter 'timeout_seconds', which includes a clear description. The tool description adds no additional parameter semantics beyond the schema, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Block until the NEXT webhook arrives (or timeout).' It uses a specific verb ('block') and resource ('NEXT webhook'), and distinguishes itself from sibling tools like list_requests or get_request by focusing on waiting for new incoming data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit usage scenario: 'Use this to say "I'll wait, trigger your webhook now" and then inspect what comes in.' This gives clear context for when to use the tool, though it does not explicitly mention when not to use it or name alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4.2/5.0
Disambiguation5/5

Each tool targets a distinct aspect of webhook capture: status, listing, detail retrieval, waiting for new requests, replaying, and clearing. No two tools have overlapping purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (capture_status, list_requests, get_request, wait_for_request, replay_request, clear_requests), making the set predictable and easy to navigate.

Tool Count5/5

Six tools is a well-scoped count for a webhook capture server, covering essential operations without unnecessary bloat or gaps.

Completeness4/5

The set provides a complete lifecycle for captured requests: list, get, wait, replay, and clear. A minor gap is the lack of individual request deletion, but clear_requests covers bulk cleanup and the core workflow is fully supported.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/void-pulse/webhook-capture-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server