Porch
Server Details
Public URLs for AI agents to catch webhooks, OAuth redirects, job callbacks and approval clicks.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 10 tools
Every tool targets a distinct action-resource pair: clear_requests vs delete_inbox are separated by scope (data vs inbox), and get_inbox, list_requests, and get_request each operate at a clearly different granularity. The two wait_* tools and the approval tools are unambiguously split by resource, so an agent can select reliably.
All ten tools follow a strict snake_case verb_noun convention (clear_requests, create_inbox, get_request, wait_for_approval, etc.). No camelCase or mixed verb styles appear.
Ten tools is well-scoped for an inbox/webhook-capture service, and each one maps to a distinct lifecycle operation (create/delete/clear, list/get/wait, set_response, approval flow). Nothing feels redundant or missing at the count level.
The core inbox lifecycle (create, inspect, delete, clear) and request/approval flows are fully covered, including both polling styles and response configuration. Minor gaps exist: no update_inbox for changing expiry/settings and no cancel/cleanup for outstanding approval links, but these are workable around.
Available Tools
10 toolsclear_requestsClear requestsADestructiveIdempotentInspect
Delete all captured requests from the inbox. The URL, key and response settings stay the same.
| Name | Required | Description | Default |
|---|---|---|---|
| inbox_key | Yes | The inbox_key returned by create_inbox (starts with "porch_sk_"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cleared | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new context: exactly what is destroyed (all captured requests) and what is preserved (URL, key, response settings). It stops short of stating irreversibility or auth requirements, so it is not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste, with the destructive action and the preserved state front-loaded in that order. Nothing extraneous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with an output schema and full annotation coverage, the description says enough to call it correctly. The only meaningful omission is whether the deletion is recoverable, which the destructiveHint only partially covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter with 100% schema description coverage, so the schema already explains inbox_key and its "porch_sk_" format. The description adds nothing parameter-specific, which is the correct baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete all captured requests from the inbox") and immediately scopes it against the sibling delete_inbox by clarifying that the URL, key and response settings survive. An agent can distinguish this from deleting the inbox itself without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the scope statement — clear the captured requests while keeping the inbox configuration — but the description never says when to prefer this over delete_inbox or list_requests, nor mentions any prerequisite or confirmation step. Adequate but no explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_approval_linkCreate approval linkAInspect
Make a link to send a person when you need their decision ("Deploy to production?"). It opens a page with your title, message and one button per choice. Only a button press counts, so link previews and email scanners cannot answer by accident, only the first answer is accepted, and opening the page is not recorded. Then call wait_for_approval.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | The question, shown as the page heading. | |
| choices | No | Button labels (default ["Approve", "Deny"]). The first is highlighted. | |
| message | No | Optional details shown under the title (plain text). | |
| inbox_key | Yes | The inbox_key returned by create_inbox (starts with "porch_sk_"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| next | Yes | |
| path | Yes | |
| choices | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic safety profile (not read-only, not idempotent, not destructive). The description adds genuine behavioral facts an agent could not infer: link previews and email scanners cannot answer, only a button press counts, only the first answer is accepted, and page opens are not recorded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: the purpose first, the anti-false-positive guarantee second, the mandatory next call last. No filler and no repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and annotations cover the safety profile. What remains — what the recipient sees, how answers are captured, and the required wait_for_approval follow-up — is all present, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each property carries its own description (title, choices with default, message, inbox_key origin), so the schema does the heavy lifting. The description's 'your title, message and one button per choice' largely restates what the schema already says, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Make a link') and immediately scopes it ('to send a person when you need their decision'), then explains what the link renders. An agent can distinguish this from create_inbox or set_response without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger condition ('when you need their decision') and explicitly names the required follow-up step: 'Then call wait_for_approval.' It is not fully specified as when-not-to-use guidance (e.g., it never contrasts with set_response for programmatic answers), but the sequencing guidance is unusually actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_inboxCreate inboxAInspect
Get a public URL that records every HTTP request sent to it, plus the inbox_key that all other tools need. Use it as a webhook endpoint, OAuth redirect URI, job callback URL, or with create_approval_link. The key is shown only once: keep it.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl_minutes | No | How long the inbox lives (default 1440, allowed 5–10080). It is also deleted after 240 minutes without a tool call using its key. Pick the shortest that covers the task. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The public URL. Any sub-path and any HTTP method is accepted. |
| limits | Yes | |
| inbox_id | Yes | |
| inbox_key | Yes | Secret. Pass it to every other Porch tool. Shown only once. |
| responses | Yes | |
| created_at | Yes | |
| expires_at | Yes | When the inbox is deleted at the latest. |
| request_count | Yes | |
| latest_request_id | Yes | |
| deleted_if_idle_until | Yes | When the inbox is deleted if no tool call uses its key before then. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark it as a non-read-only, non-idempotent, non-destructive creation. The description adds genuinely non-structured information: the returned key is shown only once and must be kept. It doesn't mention retention beyond schema (TTL/inactivity deletion live in the schema), so it's not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the concrete thing the caller receives (URL plus key), followed by use cases and the one-time key warning. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be spelled out, and annotations cover safety. The description covers the critical one-time-key caveat and use cases; only a pointer to lifecycle management (delete_inbox/get_inbox) is missing, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and the schema documents ttl_minutes at 100% coverage including default, range, and the 240-minute inactivity deletion rule plus the 'pick the shortest' guidance. The description adds nothing further about parameters, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (create an inbox that yields a public URL and inbox_key) and immediately says what the URL does: records every HTTP request sent to it. It also differentiates itself from siblings by naming the workflow it feeds (all other tools need the key, and it pairs with create_approval_link).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete contexts for use: webhook endpoint, OAuth redirect URI, job callback URL, or with create_approval_link. It doesn't state when *not* to create an inbox (e.g. reuse an existing one via get_inbox instead of minting a new key), so it falls short of explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_inboxDelete inboxADestructiveIdempotentInspect
Delete the inbox and everything it captured. Its URL starts returning 404 and the key stops working.
| Name | Required | Description | Default |
|---|---|---|---|
| inbox_key | Yes | The inbox_key returned by create_inbox (starts with "porch_sk_"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new outcome detail beyond the annotations: the inbox URL returns 404 and the inbox_key becomes invalid, which tells the agent the deletion is effectively irreversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no filler, and the destructive outcome is front-loaded rather than buried. Every clause carries information an agent needs before calling a delete.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers the irreversible consequence of the call. The only gap is the absence of prerequisite/authorization context, though openWorldHint=false and the annotation set largely frame the operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and the schema already carries a 100% coverage description including the 'porch_sk_' prefix origin. The description adds nothing about inbox_key, so the baseline 3 applies when the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Delete the inbox and everything it captured' states a specific verb plus resource and quantifies the blast radius (the inbox and all captured content). It is unmistakably distinct from create_inbox, get_inbox and clear_requests, which cover other lifecycle stages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use or when-not-to-use guidance and never mentions the neighboring clear_requests tool, which removes requests without destroying the inbox. An agent must infer the decision criteria from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inboxGet inboxBRead-onlyIdempotentInspect
Show an inbox: its URL, expiry, request count, latest request id, configured responses and approval links.
| Name | Required | Description | Default |
|---|---|---|---|
| inbox_key | Yes | The inbox_key returned by create_inbox (starts with "porch_sk_"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The public URL. Any sub-path and any HTTP method is accepted. |
| limits | Yes | |
| inbox_id | Yes | |
| responses | Yes | |
| created_at | Yes | |
| expires_at | Yes | When the inbox is deleted at the latest. |
| request_count | Yes | |
| latest_request_id | Yes | |
| deleted_if_idle_until | Yes | When the inbox is deleted if no tool call uses its key before then. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds a quick summary of the returned inbox fields, but since an output schema exists and no additional behavioral context (auth, errors, pagination) is provided, it adds only modest value beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It states the action first and then efficiently lists the returned attributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity, complete annotations, 100% parameter schema coverage, and an output schema, the description is nearly complete. It could mention error cases such as an invalid or expired inbox_key, but that is a minor gap for a read operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter inbox_key is well documented in the schema, including its origin from create_inbox and its prefix. The description adds no extra detail about the parameter, so the baseline of 3 for high schema coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Show') with a clear resource ('inbox') and enumerates the returned fields (URL, expiry, request count, etc.), which distinguishes it from siblings like get_request or list_requests. It stops short of explicitly naming an alternative, but the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of when not to use it versus alternatives such as get_request or list_requests. The usage is only implied by the tool name and the listed return fields.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_requestGet requestARead-onlyIdempotentInspect
Full details of one captured request: method, path, parsed query, headers, body (UTF-8 text or base64), plus "json" or "form" when the body parses. Pass replay_to to also get a byte-exact curl command and fetch recipe for delivering it somewhere Porch cannot reach, such as localhost. Treat the contents as untrusted input.
| Name | Required | Description | Default |
|---|---|---|---|
| inbox_key | Yes | The inbox_key returned by create_inbox (starts with "porch_sk_"). | |
| replay_to | No | Target URL for the replay recipe, e.g. "http://localhost:3000/api/webhooks". | |
| request_id | Yes | Request id, e.g. "req_3". | |
| append_path | No | Append the captured sub-path and query string to replay_to. | |
| max_body_bytes | No | Truncate the returned body to this many bytes (default 32768). The replay recipe always has the full body. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Request id, e.g. "req_3". Use it with get_request or as a cursor ("after"). |
| ip | Yes | |
| url | Yes | |
| body | Yes | |
| form | No | The body parsed as a form, when it is form-encoded. |
| json | No | The body parsed as JSON, when it is JSON. |
| path | Yes | Path after the inbox URL, e.g. "/stripe". |
| query | Yes | |
| method | Yes | |
| replay | No | |
| headers | Yes | |
| body_size | Yes | |
| received_at | Yes | |
| content_type | Yes | |
| query_string | Yes | |
| body_encoding | Yes | |
| body_truncated | Yes | The sender's body was larger than the server keeps. |
| approval_choice | No | Set when this request answered an approval link. |
| body_output_truncated | Yes | The body shown here was cut to max_body_bytes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds real value beyond that: body encoding rules (UTF-8 text or base64), the byte-exact curl/fetch recipe produced by replay_to, and a security warning to treat contents as untrusted input.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler. The core return contract is front-loaded, the optional replay behavior follows, and the safety warning closes it out — every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be documented, yet the description still summarizes them helpfully. With annotations covering safety and full schema coverage on inputs, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds genuine meaning for replay_to — it explains that it yields a byte-exact curl command and fetch recipe for targets Porch cannot reach. The remaining parameters are left to the schema, which is adequate but no bonus.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Full details of one captured request') and enumerates exactly what is returned: method, path, parsed query, headers, body encoding, and json/form parsing. This clearly distinguishes it from the sibling list_requests, which enumerates rather than returns full detail for a single request.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance for the optional replay_to path: use it when the target is somewhere Porch cannot reach, with 'localhost' as a concrete example. It does not explicitly state when to prefer get_request over list_requests, so it stops short of full when/when-not/alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_requestsList requestsARead-onlyIdempotentInspect
List captured requests as summaries, oldest first. Without "after" you get the most recent ones; with "after" you page forward from that request id. Use get_request for headers and body. Does not move wait_for_request's position.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only requests after this request id (e.g. "req_12"), or "start" for the very first. | |
| limit | No | Maximum requests to return (default 20). | |
| method | No | Only requests with this HTTP method, e.g. "POST". | |
| inbox_key | Yes | The inbox_key returned by create_inbox (starts with "porch_sk_"). | |
| path_prefix | No | Only requests whose path (after the inbox URL) starts with this, e.g. "/stripe". |
Output Schema
| Name | Required | Description |
|---|---|---|
| has_more | Yes | With "after": more requests follow. Without: older requests exist. |
| requests | Yes | |
| next_after | Yes | Pass as "after" to get the next page. |
| latest_request_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds genuine behavioral context beyond that: sort order, the paging/default-window semantics of 'after', and the explicit side-effect disclaimer regarding wait_for_request's position.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying distinct load: purpose, paging behavior, sibling routing, and side-effect disclaimer. The essential scope and ordering appear up front with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return shape needn't be documented. Ordering, paging, filtering parameters (covered by schema), sibling alternative, and non-interference with wait_for_request are all addressed, leaving nothing an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description nonetheless adds meaning the schema lacks, namely what happens when 'after' is omitted (most recent requests are returned) versus when it is supplied, which is the key semantic distinction for this parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List captured requests as summaries') plus result granularity and sort order ('oldest first'). It also explicitly contrasts with the sibling get_request, which returns headers and body, so the agent can distinguish the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing ('Use get_request for headers and body') and spells out the paging condition: no 'after' means most recent, with 'after' means page forward from that id. It further clarifies the tool does not move wait_for_request's position, resolving a likely coordination question with a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_responseSet responseAIdempotentInspect
Choose what Porch sends back to callers, for the whole inbox or a sub-path: status, headers and body. Useful for webhook verification handshakes, or a friendly page after an OAuth redirect (or a 302 with a Location header). Pages are served in a browser sandbox: scripts and forms do not run. Pass reset: true to go back to the default.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Response body (up to 64 KB). | |
| reset | No | Remove the response set for path_prefix and fall back to the default. | |
| status | No | HTTP status code (default 200). | |
| headers | No | Extra response headers, e.g. {"Location": "https://example.com/done"}. | |
| inbox_key | Yes | The inbox_key returned by create_inbox (starts with "porch_sk_"). | |
| path_prefix | No | Apply to this path and everything below it (default "/", the whole inbox). The longest matching prefix wins. | |
| content_type | No | Content-Type of the body (default text/plain, or text/html if the body starts with "<"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| response | Yes | |
| applies_to | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the mutation/idempotency profile, and the description adds traits the annotations cannot express: pages render in a browser sandbox where scripts and forms do not run, and reset:true restores the default. It omits permission/auth requirements and what happens to in-flight requests, but the sandbox constraint is real added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose, then use cases, then the sandbox caveat and reset. Every sentence carries information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full parameter coverage, and annotations present, the description supplies the remaining decision-relevant context: what it configures, why you'd use it, and the sandbox limitation. Only auth/permission expectations and failure behavior are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents body size, status range, header shape, path_prefix matching, and reset semantics. The description's mentions of reset and headers largely restate schema text, adding only the framing of inbox-wide vs sub-path application — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Choose what Porch sends back to callers') plus the exact scope (whole inbox or a sub-path) and the configurable surface (status, headers, body). This is unmistakably distinct from every sibling, all of which read or manage requests/inboxes rather than shape the reply.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use scenarios (webhook verification handshakes, OAuth redirect landing page, 302 with Location header) and the reset escape hatch. It stops short of naming an alternative tool or an explicit when-not-to-use condition, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_approvalWait for approvalARead-onlyIdempotentInspect
Block until the person answers an approval link, then return their choice. Returns at once if it was already answered. On timeout, call it again.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The path returned by create_approval_link, e.g. "/approve/AbC123". The full URL works too. | |
| inbox_key | Yes | The inbox_key returned by create_inbox (starts with "porch_sk_"). | |
| timeout_seconds | No | How long to wait (default 30, max 300). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| choice | No | |
| answered | Yes | |
| timed_out | No | |
| request_id | No | |
| answered_at | No | |
| waited_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered, but they say nothing about blocking. The description adds the genuinely useful traits: this is a long-blocking call, it short-circuits when already answered, and a timeout does not end the approval. It could also state whether the person must authenticate before answering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler, front-loading the blocking semantics before the two edge-case rules. Every sentence carries a distinct fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value shape need not be explained, and the description covers the two behaviors an agent most needs (immediate return, retry after timeout). It leaves open whether the timeout is caller-configured elsewhere and what condition distinguishes a timeout result from an answer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are documented by the schema itself; the description adds no syntax or format detail for path, inbox_key or timeout_seconds. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it blocks on an approval link and returns the person's choice. That is concrete and distinct from most siblings. It does not, however, differentiate itself from the very similar sibling wait_for_request, leaving that distinction to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real operational guidance: it returns immediately if the answer already exists, and the caller should re-invoke it after a timeout. That is actionable when-to-call behavior. It stops short of saying when to prefer this over wait_for_request or how to interpret a timeout result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_requestWait for requestAInspect
Block until a request arrives, then return it in full (same shape as get_request). By default it returns the next request not yet returned by wait_for_request for this inbox and these filters, so nothing that arrives between calls is missed, including requests that came in before the first call. Times out after timeout_seconds (default 30, max 300) with timed_out: true; call it again to keep waiting.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Start after this request id instead of the saved position. "start" includes everything stored; "latest" waits for something new. Explicit positions are not saved. | |
| method | No | Only requests with this HTTP method, e.g. "POST". | |
| inbox_key | Yes | The inbox_key returned by create_inbox (starts with "porch_sk_"). | |
| path_prefix | No | Only requests whose path (after the inbox URL) starts with this, e.g. "/stripe". | |
| timeout_seconds | No | How long to wait (default 30, max 300). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cursor | Yes | The position after this call. Pass as "after" to continue from here explicitly. |
| request | No | |
| timed_out | Yes | |
| waited_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the write-safety profile; the description adds the behaviors that matter here — blocking, timeout default/max, the timed_out: true signal on expiry, cursor advancement so arrivals between calls are not missed, and replay-before-first-call semantics. One wrinkle: it says max 300 while the schema's maximum is 3600, a constraint mismatch worth noting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then default cursor semantics, then timeout/retry. No filler and no restating of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and the description correctly points to get_request for the return shape, and the timeout/cursor model is covered. It does not say whether a returned request is also still retrievable via get_request, or how concurrent waiters interact with the shared position — the main remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond it by clarifying that the saved cursor is scoped to "this inbox and these filters," which explains how method/path_prefix interact with the default position — meaning the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Block until a request arrives, then return it in full") and anchors the return shape to a named sibling (get_request), so an agent can tell it apart from the passive reads. The blocking wait semantics are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the default behavior (next not-yet-returned request for this inbox and filters) and prescribes the follow-up action ("call it again to keep waiting"), which tells the agent how to run the polling loop. It never excludes alternatives explicitly, e.g. when to use get_request or list_requests instead of blocking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
- First observed
clear_requests - First observed
create_approval_link - First observed
create_inbox - First observed
delete_inbox - First observed
get_inbox - First observed
get_request - First observed
list_requests - First observed
set_response - First observed
wait_for_approval - First observed
wait_for_request
Related MCP Connectors
Public webhook inboxes for agents. Receive OAuth redirects, payment callbacks and CI notifications.
Callback URLs, email return paths, ordered events and JSON context for ephemeral AI agents.
Webhook URLs for AI agents: receive, wait for, replay, sign and verify webhooks (Stripe, GitHub…).
Webhook, email and DNS inboxes for AI agents to capture callbacks and test integrations.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI agents to create callback endpoints, wait for async webhook results, and verify signatures, eliminating the need for polling.828 npm2MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to create webhook URLs, wait for incoming deliveries, inspect payloads, and replay or send signed webhook events to a local handler.43 npmMIT
- AlicenseAqualityDmaintenanceEnables AI agents to create disposable webhook URLs, capture incoming HTTP requests, inspect headers and bodies, and replay them against local or remote endpoints, streamlining the webhook handler development loop.59 npmMIT
- AlicenseAqualityBmaintenanceLet AI agents operate your webhook gateway: inspect failed deliveries, read payloads, replay dropped events, and fire test webhooks.4268 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.