Skip to main content
Glama

๐ŸšŒ MockPost

Your app thinks it's talking to Stripe, Telegram, Twilio and Gmailโ€ฆ but it's MockPost.

demo

MockPost is a local, multi-channel message emulator for end-to-end testing. Point your app's outbound credentials at MockPost and it captures every email, Telegram message, WhatsApp message, SMS, push notification, Slack/Discord webhook, Stripe event and OAuth session โ€” while simulating realistic inbound events back to your app. All local, all deterministic, zero real credentials.

  • Web panel โ€” a unified timeline of every message across all channels, with per-channel detail, per-app filtering and a "Copy as Markdown" button.

  • MCP server โ€” an agent (Claude Code, OpenCode, Cursor, any MCP client) inspects the timeline, reads OTP codes and fires simulated events, all in one call.

  • Zero config faking โ€” your app keeps its real SDKs and its real-looking credentials; MockPost identifies each app by those credentials, so it never knows it's being faked.

Why? Real services mean accidental sends, third-party credentials, and agents that can't inspect what your app actually sent. MockPost makes message delivery observable.

Screenshots

Timeline Telegram channel Apps


Related MCP server: hookray-mcp

Quick start

PyPI (once published)

pipx install mockpost        # or: uv tool install mockpost
mockpost                     # starts the server on :8090
# MCP server, for any harness:
pipx install mockpost && mockpost-mcp   # stdio MCP server
docker run -p 8090:8090 -p 1025:1025 -v mockpost-data:/app/data ghcr.io/reiarseni/mockpost
# panel:      http://localhost:8090
# SMTP:       localhost:1025 (no auth)

From source

git clone https://github.com/reiarseni/mockpost
cd mockpost
uv venv && uv sync
uv run mockpost

60-second smoke test:

# send an email to your own machine
python -c "import smtplib; from email.mime.text import MIMEText; m=MIMEText('Your code is 123456'); m['Subject']='Verify'; m['From']='app@test.com'; m['To']='you@test.com'; smtplib.SMTP('localhost',1025).send_message(m)"

Then open http://localhost:8090 โ€” the email is on the timeline, and get_latest_otp will find the code 123456.


What your app should point where

Channel

Point your app to

Typical env var

Email (SMTP)

localhost:1025 โ€” AUTH PLAIN/LOGIN advertised, any credential accepted

SMTP_HOST=localhost, SMTP_PORT=1025

Telegram

http://localhost:8090/telegram (bot token goes in the URL: /bot<TOKEN>/...) โ€” JSON, form-urlencoded or multipart, GET or POST

TELEGRAM_API_BASE_URL

WhatsApp

http://localhost:8090/whatsapp/v21.0 (any Graph version works)

WHATSAPP_GRAPH_BASE_URL

Web Push

POST /webpush/subscribe returns a browser-shaped subscription; send the encrypted push to its endpoint as pywebpush/web-push do

VAPID_PUBLIC_KEY from /config

SMS (Twilio)

http://localhost:8090/twilio/2010-04-01/Accounts/AC... (any SID works)

TWILIO_BASE_URL

FCM

http://localhost:8090/fcm/v1/projects/{id}/messages:send

FCM_ENDPOINT

APNs

http://localhost:8090/apns/3/device/{token}

APNS_ENDPOINT

Slack / Discord

http://localhost:8090/slack/webhook/{id} / .../discord/webhook/{id}

SLACK_WEBHOOK_URL

Stripe

API http://localhost:8090/stripe/v1, webhook secret whsec_... from /config

STRIPE_API_BASE, STRIPE_WEBHOOK_SECRET

OAuth (Google/GitHub/Facebook/X)

authorize/token/userinfo under http://localhost:8090/oauth/... (any client_id/secret works)

OAuth URLs

GitHub webhooks

create hook http://localhost:8090/github/repos/{owner}/{repo}/hooks, simulate .../github/simulate

X-GitHub-Event + X-Hub-Signature-256 (HMAC-SHA256, your secret)

Facebook webhooks

verify http://localhost:8090/facebook/webhook?hub.mode=subscribe&hub.verify_token=..., simulate .../facebook/simulate

hub.* challenge + X-Hub-Signature-256 (HMAC-SHA256, app secret)

X (Twitter) webhooks

register http://localhost:8090/x/webhook, CRC .../x/webhook/crc, simulate .../x/simulate

CRC response_token + X-Twitter-Webhooks-Signature (base64 HMAC-SHA256)

Google OAuth extras

tokeninfo + revoke under http://localhost:8090/oauth/google/...

real Google OAuth endpoints (no webhooks by design)

FTP / FTPS / SFTP

localhost:2121 (FTP), :2122 (FTPS explicit), :2123 (FTPS implicit), :2222 (SFTP) โ€” log in with a registered app's name as the username, any password

MOCKPOST_FTP_PORT, MOCKPOST_FTPS_PORT, MOCKPOST_FTPS_IMPLICIT_PORT, MOCKPOST_SFTP_PORT

The /config page shows exact values plus copy-paste snippets per channel.

Inbound webhooks (back to your app): register your app's webhook in the panel (/webhooks) or via MCP register_webhook. Simulated inbound messages, status changes and signed Stripe events are POSTed to your app's URL โ€” and every delivery (including the app's response body, even when it was down) is recorded in the timeline.


MCP integration

MockPost exposes an MCP server over stdio. Any harness that speaks MCP gets tools to inspect the timeline, read OTPs, and fire simulated events โ€” so your agent can verify end-to-end behavior autonomously.

Prerequisite: the MockPost HTTP service must be running (default http://localhost:8090). The MCP server is a client of its internal API, so every tool call needs it up.

The MCP server ships with the repo and runs with python -m mcp_server.server (requires the Python deps from requirements.txt; MOCKPOST_URL defaults to http://localhost:8090).

Claude Code

Add to your project's .mcp.json (project-scoped) or ~/.claude.json / claude_desktop_config.json (user-scoped):

{
  "mcpServers": {
    "mockpost": {
      "command": "python",
      "args": ["-m", "mcp_server.server"],
      "env": { "MOCKPOST_URL": "http://localhost:8090" }
    }
  }
}

OpenCode

OpenCode supports MCP servers through its config (opencode.json / opencode.jsonc). Add the server under the mcp section:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mockpost": {
      "type": "local",
      "command": ["python", "-m", "mcp_server.server"],
      "environment": { "MOCKPOST_URL": "http://localhost:8090" },
      "enabled": true
    }
  }
}

Some OpenCode versions use "type": "stdio" instead of "type": "local" โ€” use whichever your installed version accepts.

Any MCP harness (Cursor, Windsurf, VS Code, Continue, custom clients)

The universal contract is the same: run the server with command + args, pass env vars, done.

  • VS Code (GitHub Copilot / MCP): mcp add mockpost -e "python" "-m" "mcp_server.server" or configure in .vscode/mcp.json / user settings under mcp.servers.

  • Cursor: Settings โ†’ MCP โ†’ Add server โ†’ type command, command python -m mcp_server.server.

  • Raw JSON (any stdio MCP client):

{
  "mcpServers": {
    "mockpost": {
      "command": "python",
      "args": ["-m", "mcp_server.server"],
      "env": { "MOCKPOST_URL": "http://localhost:8090" }
    }
  }
}

On Windows, wrap the command: "command": "cmd", "args": ["/c", "python", "-m", "mcp_server.server"].

What the agent can do

Tool

Purpose

get_timeline_markdown()

Call this first. Full picture of a test run across all channels, in Markdown.

list_sent_messages() / get_message_detail()

Inspect captured messages (full MIME/JSON payload).

simulate_incoming_message()

Simulate a user messaging your app (Telegram/WhatsApp) โ€” delivered to your webhook.

simulate_delivery_webhook()

Fire delivered/read/failed status changes.

simulate_stripe_event()

Send a signed Stripe event (Stripe-Signature) to your webhook.

simulate_github_event() / simulate_facebook_event() / simulate_x_event()

Fire signed social webhooks (X-Hub-Signature-256 / X-Twitter-Webhooks-Signature).

verify_facebook_webhook()

Returns the hub.* verification URL used by Meta.

get_latest_otp() / generate_totp_secret() / get_totp_code()

Read OTP codes / TOTP for 2FA flows.

set_oauth_fake_profile() / get_oauth_session()

Drive fake OAuth logins and inspect the resulting session.

register_webhook() / trigger_webhook() / list_webhook_deliveries()

Manage and verify webhooks, including what the app returned (or that it was down).

create_push_subscription() / list_push_subscriptions() / expire_push_subscription()

Hand your app a real Web Push subscription, then kill it to test the 410 cleanup path.

simulate_push_token_unregistered()

Make an FCM or APNs token answer as uninstalled (404 / 410).

set_app() / set_test_id()

Scope everything to one app / one test run.

clear_channel() / clear_all()

Clean up between runs.

Typical agent flow:

1. set_app("my-app")                          # scope to your app
2. (your test runs and sends emails/messages)
3. get_timeline_markdown()                    # what did my app actually send?
4. get_latest_otp("user@test.com")            # the login code, parsed for you
5. simulate_incoming_message("whatsapp", ...) # now test the reply path
6. get_timeline_markdown()                    # verify the round trip

Per-app isolation (many apps testing at once)

Each app is identified by its fake credentials โ€” it sends no extra headers, it never knows MockPost isn't the real service. Register the app once (panel /apps or MCP register_app):

Fake credential

Channel it identifies

Telegram bot token

telegram

Twilio Account SID

sms

Stripe sk_test_...

stripe

WhatsApp phone_id

whatsapp

FCM project_id

fcm

SMTP port (MOCKPOST_APPS='app-a:1025,...')

mail

Login username (FTP/FTPS/SFTP)

ftp / sftp

Consequences:

  • Captured messages are tagged with their app (panel filters by app).

  • A webhook bound to an app only receives that app's simulated events.

  • Unregistered credentials fall into the global queue.


Environment variables (all optional)

Variable

Default

MOCKPOST_HTTP_PORT

8090

MOCKPOST_SMTP_PORT

1025

MOCKPOST_HOST

127.0.0.1 (localhost only โ€” no auth by design)

MOCKPOST_SMTP_HOST

127.0.0.1 (localhost only)

MOCKPOST_FTP_PORT

2121

MOCKPOST_FTPS_PORT

2122 (explicit AUTH TLS)

MOCKPOST_FTPS_IMPLICIT_PORT

2123

MOCKPOST_SFTP_PORT

2222

MOCKPOST_FTP_PASSIVE_PORTS

30000-30009 โ€” map this range through Docker/NAT for passive FTP transfers

MOCKPOST_FTP_DATA_DIR / MOCKPOST_SFTP_DATA_DIR

./data/ftp / ./data/sftp

MOCKPOST_ALLOWED_WEBHOOK_HOSTS

(empty โ€” all http(s) except metadata/link-local)

MOCKPOST_APPS

app-a:1025,app-b:1026 (per-app SMTP)

MOCKPOST_DB_PATH

./data/mockpost.db

MOCKPOST_URL

http://localhost:8090

MOCKPOST_STRIPE_WEBHOOK_SECRET

whsec_<random>

MOCKPOST_VAPID_CONTACT

mailto:mockpost@test.local

MOCKPOST_OAUTH_JWT_KEY

<random>

MOCKPOST_STRICT_AUTH

0 โ€” set to 1 and every channel enforces its real authentication, answering the 401/403/535 the live API would

MOCKPOST_SMTP_USERNAME / MOCKPOST_SMTP_PASSWORD

(empty โ€” any credential is accepted)


Emulated channels

Email (SMTP with AUTH, MailHog-style) ยท Telegram Bot API (13 methods, any body format) ยท WhatsApp Cloud API (any Graph version, messages + statuses) ยท Web Push (push service with real VAPID validation and payload decryption) ยท Twilio SMS (Messages.json + StatusCallback) ยท FCM ยท APNs ยท Slack ยท Discord ยท Stripe (checkout/payment_intents + signed Stripe-Signature events) ยท OTP (SMS/email/TOTP) ยท Fake OAuth2/OIDC for Google/GitHub/Facebook/X (JWT with local key) ยท Social webhooks (GitHub, Facebook, X) with per-provider signatures ยท FTP/FTPS/SFTP (per-app filesystem-backed roots, username-as-app-name login).

Protocol fidelity

The goal is that an app points its real SDK at MockPost and notices nothing: no adapters, no client changes. That means matching more than the happy path.

  • Transports and body formats. Telegram takes JSON, form-urlencoded, multipart or query parameters on GET and POST, like the live API; Slack and Discord also read the form-encoded payload field; OAuth token requests take form or JSON.

  • Status codes and bodies. Discord answers 204 with no body unless ?wait=true; APNs answers 200 with an empty body and the id in the apns-id header; Slack answers the literal ok.

  • Error envelopes. Telegram {ok, error_code, description}, Graph {error: {message, type, code, fbtrace_id}}, Google FCM {error: {code, message, status, details}}, Stripe {error: {message, type, code}}, Twilio {code, message, status}, OAuth {error, error_description}.

  • Identifier shapes. wamid.โ€ฆ, SM+32 hex, cs_test_โ€ฆ, pi_test_โ€ฆ with its client_secret, projects/{id}/messages/โ€ฆ.

  • Failure paths worth testing. A dead Web Push subscription answers 410, an uninstalled FCM token 404 UNREGISTERED, an APNs one 410 Unregistered, and an oversized APNs payload 413 โ€” the signals a backend uses to prune its own tables.

Set MOCKPOST_STRICT_AUTH=1 to also enforce authentication everywhere and get the real 401/403/535 when a client forgets its credentials.


License

MIT โ€” see LICENSE.

Available Tools

31 tools
clear_allA

Delete all captured messages (or only those of a test_id/app).

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
test_idNo

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. 'Delete' indicates destructive behavior, but there is no statement about permanence, irreversibility, or side effects. The description adds little beyond the tool's purpose and does not disclose behavioral traits such as whether deletion is permanent or how multiple filters combine.

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?

A single sentence with no filler; the core action and optional scoping are front-loaded. Every word earns its place.

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?

For a tool with two optional params and no output schema, the description is short but mostly adequate. It does not clarify param combination semantics or warn about irreversible bulk deletion, which are relevant for an agent invoking a destructive operation. Overall, it is minimally viable.

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 schema has no descriptions (0% coverage), so the description must compensate. It does map the parameters to 'of a test_id/app', which gives them some meaning as filters. However, it fails to explain how the two parameters interact (e.g., AND or OR) or that omitting both deletes everything.

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?

States a specific verb 'Delete' and a clear resource 'all captured messages', with an explicit optional scope by test_id/app. This distinguishes it from siblings like clear_channel or delete_app, which target different resources.

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 when you want to delete captured messages, optionally filtered by test_id or app. It does not explicitly mention alternatives, conditions, or when not to use it, leaving the agent to infer the scope from the sibling list.

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

clear_channelA

Delete all captured messages of a channel (cleanup between test runs). With app, only that app's messages.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
channelYes
test_idNo

TDQS

A4.1/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden of disclosing behavior. It clearly states the destructive action and the channel scope, and it explains that providing an app limits deletion to that app's messages. The impact of the optional test_id parameter is not disclosed, which keeps this from 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.

Conciseness5/5

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

The description is only two sentences: the first gives the action and purpose, and the second clarifies app scoping. Every word earns its place, and there is no repetition of the schema.

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?

The description covers the core destructive behavior and the app scope, but it does not explain the optional test_id parameter or explicitly contrast the tool with clear_all. With no annotations and no output schea, this leaves some decision-making information missing for an agent.

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 0%, so the description must add parameter meaning. It clarifies that channel is the target channel and that app acts as a filter, but it does not explain test_id at all. This is a notable gap given the schema provides no descriptions.

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 specifies a clear verb ('Delete'), a precise resource ('all captured messages of a channel'), and an intended use case ('cleanup between test runs'). This makes it easy to distinguish from the sibling clear_all, which appears to operate at a broader scope.

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 phrase 'cleanup between test runs' gives an explicit context in which the tool should be used. It does not name alternatives or state when not to use it, but the channel-scoped cleanup purpose is clear enough to guide selection.

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

create_push_subscriptionA

Create a Web Push subscription and return it shaped exactly like the browser's PushSubscription (endpoint + keys.p256dh + keys.auth). Hand it to the app under test: MockPost keeps the private key, so when the backend sends the encrypted push with pywebpush or web-push it verifies the VAPID signature, decrypts the payload and captures the cleartext.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden, and it does well: it discloses that MockPost retains the private key, that the backend can send encrypted push via pywebpush or web-push, and that VAPID verification, decryption, and cleartext capture occur. It does not describe persistence or cleanup behavior, but for a zero-parameter mock helper this is strong disclosure.

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?

Two sentences, front-loaded with the core action and return shape, followed by the essential workflow behavior. Every clause adds value and nothing is redundant or padded.

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 no parameters, no annotations, and no output schema, the description is complete: it states exactly what is returned, how the result should be used, and what happens when the backend delivers a push. An agent has enough information to invoke it correctly and integrate it into a test flow.

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?

There are zero parameters and 100% schema coverage, so the rubric baseline is 4. The description adds no parameter-level meaning because none exists, and none is needed.

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 opens with a specific action ('Create a Web Push subscription') and precisely defines the return shape as the browser's PushSubscription with endpoint and p256dh/auth keys. This clearly distinguishes the tool from siblings that list, expire, or simulate push-related events.

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?

It gives clear usage context: 'Hand it to the app under test' and explains how the subscription is used when the backend sends an encrypted push. It does not explicitly enumerate when-not-to-use or name alternative tools, but the intended workflow is unmistakable.

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

delete_appA

Delete a registered app. Its webhooks become global.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does reveal the key non-obvious consequenceโ€”a deleted app's webhooks become globalโ€”which is exactly the kind of side effect an agent must know. It stops short of stating whether deletion is permanent/irreversible, what permissions are needed, or what a successful response looks like, so coverage is partial.

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?

Two short sentences, front-loaded with the primary action and followed by the single most important side effect. Every word earns its place; there is no fluff or repetition of schema fields.

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?

For a one-parameter tool with no output schema, the description covers the operation and its most surprising side effect, which is a reasonable baseline. The gapsโ€”irreversibility, expected response, and the fate of other app-scoped resources (test IDs, OTP secrets, simulation configs)โ€”matter more precisely because there are no annotations to backstop the agent.

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 0%, so the description must compensate for the bare app_id (title 'App Id'). It adds a real constraintโ€”the id must reference a registered appโ€”and implies the app may own webhooks, but it never says how to obtain a valid id (e.g., via list_apps). For a single self-evident parameter this is adequate but thin.

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?

States a specific verb ('Delete') and resource ('a registered app'), cleanly distinguishing it from siblings like register_app, set_app, and list_apps. The second sentence adds a meaningful scope qualifier about webhook ownership, so an agent can identify this as the removal operation without ambiguity.

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 intended useโ€”removing an appโ€”is easily inferred from the verb, and the webhook side effect signals a consequence worth weighing before calling. However, the description never explicitly contrasts this with alternatives (e.g., 'to create an app use register_app') or states prerequisites such as needing a valid registered app_id, so routing guidance is implied rather than stated.

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

expire_push_subscriptionA

Mark a Web Push subscription as gone: the next push answers 410, which is how a backend learns it must delete a dead subscription.

ParametersJSON Schema
NameRequiredDescriptionDefault
subscription_idYes

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden. It discloses the key side effect: subsequent pushes return 410, and it clarifies that the tool marks rather than deletes. However, it does not address reversibility, idempotency, error cases, or whether the subscription remains visible to list_push_subscriptions.

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 entire description is one tight sentence that front-loads the action and consequence, with the rationale attached without redundancy. Every word contributes meaning.

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 low-complexity, one-parameter mutation tool with no output schema, the description adequately covers the core purpose and observable outcome. Minor gaps remain, such as how to source subscription_id and what the direct response is, but these are not severe for this tool's simplicity.

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

Parameters2/5

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

The schema has 0% description coverage, and the description does not explain what subscription_id refers to, where it comes from, or its expected format. It only indirectly implies that the subscription is a Web Push subscription, leaving the parameter under-documented.

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, 'mark', with a clearly identified resource, 'a Web Push subscription', and explains the observable consequence ('the next push answers 410'). This makes it easy to distinguish from siblings like create_push_subscription, list_push_subscriptions, and simulate_push_token_unregistered.

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 when to use the tool: when a subscription should be treated as dead so a backend can observe a 410 and clean up. It does not explicitly name alternatives or exclusions, but the context is clear enough given the sibling tool list.

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

generate_totp_secretB

Generate and store a TOTP secret (Google Authenticator). Returns base32 secret and otpauth:// URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYes

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description bears the full behavioral disclosure burden. It does disclose an important side effect ('store') and the return values, but it does not explain repeated-call behavior, whether the identifier overwrites an existing secret, or any persistence/lookup semantics. This is adequate but minimal.

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 front-loaded sentence that names the action, the resource, and the key outputs with no filler. Every part earns its place.

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?

For a one-parameter tool, the description covers the main action and return values, especially since there is no output schema. However, it is missing the semantics of 'identifier' and the behavior around storage/overwrite. The absence of annotations makes this gap more significant than it would otherwise be.

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

Parameters2/5

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

Schema description coverage is 0% and the description does not explain the 'identifier' parameter at all. The name is somewhat self-explanatory, but the agent is left to guess whether identifier is a label, a lookup key, a username, or something else. The description should have clarified this.

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 ('Generate and store') with a specific resource ('TOTP secret') and tells the agent exactly what is returned (base32 secret and otpauth:// URL). This clearly distinguishes it from the sibling get_totp_code, which likely retrieves the current code rather than creating a secret.

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

Usage Guidelines2/5

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

The description gives no explicit guidance on when to use this tool versus alternatives like get_totp_code. It does not state that this is for initial enrollment/setup, nor does it exclude scenarios such as retrieving an existing code. Usage is only weakly implied by the action word 'Generate'.

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

get_channel_configB

Return host/port/base URL/fake tokens the app must use for that channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYes

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations provided, the description carries the full behavioral burden. It discloses the return payload and notes that tokens are fake, which is useful, and 'Return' implies read-only behavior. However, it does not address error behavior for unknown channels, whether config is scoped to the current app, or the response format.

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?

A single sentence with no wasted words, and the core payload (host/port/base URL/tokens) is front-loaded. This is appropriately sized for a one-parameter read-only tool.

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?

The description lists the return values, which partially compensates for the absent output schema. But it leaves the channel parameter format, error semantics, and app scoping unspecified, and with 30 siblings there is no routing aid. Adequate for simple use, yet with clear gaps.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the channel parameter. It only loosely ties channel to the output ('for that channel') without defining whether channel is a name, ID, or slug, or where valid values come from. The agent is left guessing the parameter's domain.

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

Purpose4/5

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

The description uses a clear verb ('Return') with a specific resource: host/port/base URL/fake tokens for a channel. This is specific enough for an agent to distinguish it from siblings like get_latest_otp, get_message_detail, and get_oauth_session, though no sibling is named explicitly.

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

Usage Guidelines2/5

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

No guidance is given for when to call this tool versus alternatives. The phrase 'the app must use' implies it is the config source of truth, but there are no prerequisites, exclusions, or hints about which sibling covers other cases. An agent must infer usage entirely from the tool name and the short description.

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

get_latest_otpC

Return the latest OTP code (SMS or email) sent to an identifier.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelNoany
test_idNo
identifierYes

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations, the description must disclose behavior itself. It states only that the latest OTP is returned; it does not mention whether retrieval is destructive, whether the code is marked as consumed, what happens if no OTP exists, or what the response contains.

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

Conciseness4/5

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

The description is a single front-loaded sentence with no filler. It is concise, though it achieves conciseness by omitting useful behavioral and parameter details.

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

Completeness2/5

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

For a tool with no output schema, no annotations, and 0% schema coverage, the description is too thin to support correct invocation. An agent cannot tell what identifier format is expected, what channel accepts, what test_id does, or what the return payload looks like.

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

Parameters2/5

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

Schema description coverage is 0%, so the description needed to explain the parameters. It indirectly explains identifier ('sent to an identifier') but says nothing about channel values or test_id, leaving two of three parameters effectively undocumented.

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

Purpose4/5

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

The description uses a specific verb ('Return') and identifies the resource as the latest OTP code sent to an identifier, adding 'SMS or email' to clarify the code type. It does not explicitly distinguish itself from the sibling get_totp_code, so it loses the top score.

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

Usage Guidelines2/5

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

The description implies retrieving the most recent SMS/email OTP for an identifier but gives no guidance on when to prefer this over get_totp_code or other OTP-related siblings, nor any exclusions. There is no explicit when-to-use or alternative routing.

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

get_message_detailA

Return a message's full payload, including raw_payload (MIME/JSON).

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYes

TDQS

A3.6/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 and does disclose the return behavior by mentioning the full payload and raw_payload format. However, it does not mention error behavior, authentication requirements, or whether any side effects occur, though the verb 'Return' implies a read-only 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 clear sentence that is front-loaded with the action and resource. It contains no filler and every word adds value.

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?

For a simple one-parameter getter, the description provides the core semantics and expected payload. However, because there is no output schema and no annotation coverage, the absence of details about returned structure, error cases, or message_id provenance leaves some gaps for an agent.

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

Parameters2/5

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

Schema coverage is 0% and the description does not explain message_id beyond the implicit 'a message's' connection. It does not specify the ID format, where to obtain the ID, or how it relates to sibling tools like list_sent_messages, leaving the single required parameter under-documented.

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 states a specific verb ('Return'), a clear resource ('a message's full payload'), and names a distinctive detail ('raw_payload (MIME/JSON)'). This distinguishes it from sibling tools like list_sent_messages, which would list messages rather than return full details.

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 this tool is used when a full message payload is needed, but it does not explicitly state when to prefer it over alternatives, nor does it mention any exclusions. There is no explicit routing guidance such as 'use list_sent_messages for summaries.'

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

get_oauth_sessionA

Inspect a simulated OAuth session: code, tokens, returned profile and expiry.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries full responsibility. It clarifies that the session is simulated and lists the returned artifacts, which is useful. But it does not disclose what happens for an unknown or expired session_id, whether any state is modified, or whether a prior setup step is required. 'Inspect' implies read-only, but details are thin.

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?

A single, front-loaded sentence with no filler. The verb comes first, followed by the object and the key contents, making it easy to scan and understand.

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 one-parameter tool with no output schema, the description does a good job of indicating what the return will contain (code, tokens, profile, expiry). It does not explain error behavior for missing sessions, but that is a minor gap given how low-complexity this tool is.

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

Parameters2/5

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

Schema description coverage is 0% and the description never explains session_id. Although the parameter name and title are somewhat self-evident, the description fails to add format, example, or context for the session identifier. With low coverage, the description needed to compensate but did not.

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 purpose with a specific verb ('Inspect') and resource ('simulated OAuth session'), and it enumerates what the session contains: code, tokens, returned profile, and expiry. This naturally distinguishes it from sibling simulation/setup tools like set_oauth_fake_profile or list_apps.

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 verb 'Inspect' implies the tool should be used when an agent wants to examine a simulated OAuth session, and there is no obvious alternative getter among the siblings. However, the description does not explicitly state preconditions, such as needing to set an OAuth fake profile first, nor does it call out alternatives or exclusions.

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

get_timeline_markdownA

FULL TIMELINE as Markdown: messages + webhook_events + stripe_events in chronological order. Call this first when verifying a test result; use get_message_detail only for a single event's detail. With app, only that app's events.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
limitNo
sinceNo
test_idNo
channelsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral transparency burden. It discloses non-obvious behavior: the output is a combined Markdown timeline across three event types, ordered chronologically, and limited to one app's events when app is provided. It does not spell out all optional-filter effects, but the read-oriented content and 'get' verb make the read-only nature reasonably clear.

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 three crisp sentences with purpose front-loaded, usage guidance second, and app scoping last. Every sentence earns its place, and there is no filler, repeated schema information, or boilerplate.

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

Completeness2/5

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 doesn't need to be in the description. However, all 5 parameters are optional with no schema descriptions and no annotations, and the description leaves limit, since, and channels ambiguous. It is excellent for purpose and routing but not complete enough for fully informed invocation across all parameter combinations.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for all 5 parameters. It clarifies the app parameter ('With app, only that app's events') and hints at test context, but limit, since, and channels receive no explanation. An agent would have to rely on parameter names and defaults to infer their semantics.

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 a specific verb and resource: it retrieves the full timeline as Markdown, listing messages, webhook_events, and stripe_events in chronological order. It also differentiates from get_message_detail by noting that the sibling covers only a single event's detail. An agent can confidently identify what this tool returns.

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

Usage Guidelines5/5

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

It explicitly instructs to call this tool first when verifying a test result and names the alternative tool with the condition for using it: get_message_detail only for a single event's detail. The app-filter sentence adds clear guidance on when the tool is scoped. This is strong routing guidance.

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

get_totp_codeA

Compute the current TOTP code (6 digits) for a previously generated secret. Window ยฑ1.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYes

TDQS

A3.5/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 discloses the output length (6 digits), the time-window behavior (ยฑ1), and the dependency on a previously generated secret. It does not mention error behavior for unknown identifiers or time-sync sensitivity, but it provides meaningful behavioral detail beyond a bare one-liner.

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?

A single sentence that leads with the action and key result, then adds the two most important qualifiers (6 digits, window ยฑ1). There is zero redundancy and every word carries meaning.

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?

For a one-parameter tool this is nearly adequate, but it leaves important gaps: what the identifier refers to, what the return value looks like (raw digits vs JSON), and how it relates to sibling get_latest_otp. No output schema exists, so the description should have covered more of these.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the bare 'identifier' parameter. It says the secret must be previously generated, but does not explain that the identifier is the one returned by generate_totp_secret, nor its format or provenance. This leaves an agent guessing what value to actually pass.

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

Purpose4/5

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

The description uses a specific verb ('Compute') with a clear resource ('current TOTP code') and adds the format (6 digits) and a prerequisite (previously generated secret). It is distinct enough from generate_totp_secret, but it does not explicitly differentiate from get_latest_otp, so it stops short of a 5.

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 phrase 'for a previously generated secret' implies the tool should be used after generate_totp_secret, but it does not explicitly say when to use this tool versus alternatives like get_latest_otp. There is clear context but no exclusions or named alternatives.

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

list_appsA

List registered apps with their fake credentials (MockPost identity).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

The description clearly frames this as a read-only enumeration and discloses that results contain fake credentials under the MockPost identity, which is useful because no annotations are present. It does not mention pagination or ordering, but the output schema covers the return shape.

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?

A single sentence with a front-loaded verb and object, plus one valuable parenthetical clarifying the identity context. No filler 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 zero-parameter list tool with an output schema, the description is largely complete and tells the agent exactly what it will fetch. It could add one sentence about when listing apps is useful relative to the register/set/delete siblings, but that gap is already captured in the usage_guidelines dimension.

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?

There are zero parameters, so the description has no need to define parameter semantics. The 100% schema coverage and empty properties confirm no inputs are required.

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?

States a concrete operationโ€”listing registered appsโ€”and clarifies the data returned (fake credentials in MockPost identity). This differentiates it from registration/deletion/set siblings and from a generic app-listing tool.

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

Usage Guidelines2/5

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

No explicit when-to-use or when-not-to-use guidance is provided, and no alternative sibling tools are mentioned. The agent must infer from the verb 'List' and sibling names that this is for enumeration rather than registration, modification, or deletion.

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

list_push_subscriptionsA

List Web Push subscriptions with their endpoint and status (active|gone).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/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 behavioral disclosure. 'List' implies a read-only operation and the stated endpoint/status fields add useful detail, but it does not mention pagination, ordering, whether all subscriptions are returned, or any access requirements.

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 with no filler. The core operation and key result fields are front-loaded, making it easy for an agent to parse quickly.

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 zero-parameter list tool with an output schema available, this description is mostly sufficient. It would be slightly stronger if it explicitly said 'all' subscriptions or noted any pagination behavior, but the simplicity of the tool keeps the gap minor.

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, so the baseline is 4. The description does not need to add parameter-level detail; it still provides relevant context about what the result contains.

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 and resource: 'List Web Push subscriptions'. It also names the key output fields (endpoint and status), which clearly differentiates it from sibling tools like create_push_subscription and expire_push_subscription.

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 context is clear: use this when you need to view web push subscriptions. It does not explicitly exclude alternatives, but the 'List' verb and the existence of mutation siblings make the intended use obvious enough.

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

list_sent_messagesA

List captured messages for a channel (or all), newest first. channel: mail|telegram|whatsapp|webpush|sms|fcm|apns|slack|discord|stripe app: registered app name to filter only its messages.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
limitNo
statusNo
channelNo
test_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/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 behavioral burden. It explicitly indicates this is a read-only list operation, states that messages are 'captured' (not actively sent), and documents both the scope ('channel or all') and the ordering ('newest first'). This goes beyond a bare verb and gives useful behavioral context.

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 extremely concise and well-structured: two short lines that state the action, scope, ordering, and the two most important filters. Every sentence contributes information without unnecessary fluff.

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?

For a five-parameter tool with no annotations, the description is reasonably complete for the core listing use but omits semantics for status/test_id/limit and does not mention alternative tools. The output schema covers return values, so the main remaining gap is optional parameter guidance and sibling differentiation.

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 description adds value for two parameters: it lists the allowed channel values and defines 'app' as a registered app name filter. However, with 0% schema description coverage, it leaves limit, status, and test_id entirely unexplained, relying on their self-explanatory titles and defaults.

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 states a specific action ('List captured messages') and a clear resource scope ('for a channel (or all)'), with an explicit ordering guarantee ('newest first'). It also distinguishes itself from sibling tools like get_message_detail by focusing on the list behavior rather than a single message.

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?

It provides clear context for when to use the tool: listing captured messages, optionally filtered by channel or app. It does not explicitly mention alternatives or exclusions, but the phrasing makes the intended use straightforward compared to the other listing and simulation tools.

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

list_webhook_deliveriesA

Webhook delivery history: what each app returned (code + body), even if it was down (response_code 0). Filterable by channel and app.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
limitNo
channelNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral disclosure burden. It usefully reveals an important edge case: deliveries to down apps are included with response_code 0. It also tells the agent what kind of data to expect (code + body). It does not mention ordering or pagination, but the output schema covers return shape.

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?

A single compact sentence that front-loads the core purpose, then adds the key edge case and filter capability. Every clause earns its place with no wasted words.

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 historical listing tool with three optional parameters and an output schema, the description is largely sufficient. It identifies the resource, the returned content, a notable edge case, and the available filters. It could be slightly more explicit about the limit parameter, but the schema supplies the default and type.

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 0%, so the description must compensate. It explains that channel and app are filters, which adds meaning to those two parameters. The third parameter, limit, is not described, though its name, type, and default in the schema make its purpose reasonably inferable.

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 names a specific resource ('webhook delivery history') and specifies exactly what it contains: the code and body returned by each app, including failures with response_code 0. This clearly distinguishes it from sibling tools like list_webhooks, which would list registered webhooks rather than delivery outcomes.

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 you need a history of what apps returned for webhook deliveries, and optionally filtered by channel and app. It does not explicitly name alternatives or exclusions, but the purpose is unambiguous enough for selection among the sibling tools.

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

list_webhooksA

List registered webhooks, optionally filtered by channel and app.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
channelNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. 'List' implies a read-only operation, which is reasonably transparent for a simple listing tool. However, it does not disclose any pagination, ordering, rate-limit, or authentication behavior beyond what the output schema may imply.

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?

A single front-loaded sentence that communicates the core action, resource, and filtering capability with no filler. Every word contributes meaning.

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 listing operation with no required parameters and an output schema provided, the description is nearly complete. It covers what the tool does and the available filters. It lacks only minor contextual details like pagination or exact filter matching behavior, but those are not critical for basic invocation.

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?

Schema description coverage is 0%, so the description must compensate. It explicitly indicates that 'channel' and 'app' are optional filters, which adds meaning beyond the raw schema by defining their role as filters rather than required inputs. It doesn't specify value formats, but the parameter names are self-explanatory.

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') with a clear resource ('registered webhooks') and indicates optional filters. It distinguishes itself from sibling tools by resource: list_webhook_deliveries is about deliveries, while register_webhook/trigger_webhook are about creating and triggering webhooks.

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

Usage Guidelines2/5

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

The description implies usage by stating it lists webhooks with optional channel/app filters, but it provides no explicit guidance on when to choose this tool over alternatives, no exclusions, and no mention of prerequisites. Sibling tools like list_webhook_deliveries could be confused with this one without additional context.

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

register_appA

Register or update an app: bind its FAKE credentials (Telegram bot token, Twilio SID, Stripe sk_test_, WhatsApp phone_id, FCM project_id) to a name. The app talks to MockPost using those credentials as if it were the real service; MockPost identifies it by them. Use the same name to update creds.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
credsNo

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and handles it well: it reveals that creds are fake, that MockPost treats them as real-service creds, and that identity is derived from them. This gives the agent a genuine mental model of registration and idempotent update semantics.

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?

Three sentences, each earning its place: action plus credential types, MockPost identity behavior, and the update rule. The credential list is front-loaded and the update guidance is a natural final sentence.

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 two-parameter tool with no output schema and no annotations, the description is largely complete: it defines what to pass, how identity works, and how to update. Minor gaps are lack of explicit mention of the optional creds/default and any return or error behavior, but these do not block correct invocation.

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?

Input schema coverage is 0%, so the description must supply parameter meaning. It explains 'name' as the binding key and lists representative values for 'creds' (bot token, Twilio SID, Stripe sk_test_, etc.). It doesn't spell out that creds is optional or defaults to null, but the parameter role is clear.

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?

Opens with 'Register or update an app', a specific verb and ressource, and immediately explains the binding of FAKE credentials to a name. It lists concrete creds types (Telegram, Twilio, Stripe, WhatsApp, FCM) which distinguishes it from vaguer sibling tools. 'Use the same name to update creds' clarifies the dual create/update nature.

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 explains that this tool is used when you need to bind fake service creds to a name, and explicitly tells callers to reuse the same name to update existing creds. It does not name alternative tools such as set_app or delete_app, but the intended usage is clear enough without needing exclusions.

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

register_webhookB

Register an app webhook (Telegram setWebhook, WhatsApp, Stripe...). If you pass an app (registered name), the webhook only receives events from that app.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
tokenNo
configNo
channelYes
target_urlYes

TDQS

B3/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 behavioral disclosure. It does add one meaningful behavior: 'If you pass an app (registered name), the webhook only receives events from that app.' However, it doesn't disclose side effects such as replacing an existing webhook, authentication requirements, or what the response contains, so transparency is partial.

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?

Two sentences, both useful: the first states the operation and channel scope, and the second adds the app-filtering condition. There is no filler or redundant restatement.

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

Completeness2/5

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

For a setup/registration tool with five parameters, no annotations, no output schema, and many related siblings, the description is too thin. Missing pieces include channel/target_url validation expectations, token/config meaning, return values, and which sibling to prefer for verification/list/trigger tasks.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the 5 parameters. It explains the effect of 'app' and implies target_url from 'webhook' and channel from the examples, but token and config are entirely unexplained. This is insufficient compensation for the low schema coverage.

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

Purpose4/5

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

The first sentence uses a clear verb and resource: 'Register an app webhook', with channel examples (Telegram setWebhook, WhatsApp, Stripe). This clearly states the operation and object. It doesn't explicitly distinguish itself from webhook-related siblings like list_webhooks or verify_facebook_webhook, so it stops short of full sibling differentiation.

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

Usage Guidelines2/5

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

The description gives no direct guidance on when to call this tool instead of alternatives such as trigger_webhook, list_webhooks, or verify_facebook_webhook. The only conditional is about passing an app, which is parameter behavior rather than tool-selection guidance. Usage is therefore only implied by the verb 'Register'.

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

set_appA

Set the active app (a name registered in MockPost): incoming event simulations and queries are filtered/delivered only to that app. Pass null/None for no app. Register apps with register_app.

ParametersJSON Schema
NameRequiredDescriptionDefault
appYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations present, the description carries the behavioral burden. It discloses the key side effect (filtering/delivery restricted to the active app), explains null/None as 'no app', and mentions the registration prerequisite. Persistence details and output are not discussed, but they are minor for a state-setting tool.

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?

Three short sentences, each earning its place: action and effect, null-clearing behavior, and registration pointer. The most important information is front-loaded and there is no filler.

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 single-parameter state setter, this is complete: it defines the parameter contract, explains the effect, tells how to clear the state, and routes the agent to the relevant sibling tool. The presence of an output schema covers return-value expectations, so no additional return information is needed.

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 schema alone says only 'app: string | null'. The description adds the essential semantics: the string must be a name registered in MockPost, null/None clears the active app, and register_app is the way to create such names. This fully compensates for the 0% schema description coverage on the only parameter.

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 names a specific verb ('Set'), the exact resource ('the active app'), and the behavioral consequence (incoming simulations and queries are filtered/delivered only to that app). It also refers to register_app, making its role distinct from the registration sibling.

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?

It clearly conveys when to use the tool: to scope event simulations and queries to a specific registered app. It explicitly points to register_app for registering apps. It does not exhaustively enumerate all when-not-to-use cases across siblings, but the context is strong.

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

set_oauth_fake_profileB

Set the profile the fake OAuth provider (google|github|facebook|x) returns on the next login.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileYes
providerYes

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden. It does disclose a useful scoping detail: the profile is returned on the next login, suggesting a one-time or targeted effect. However, it does not mention whether the setting persists, whether existing sessions are affected, or what side effects or output to expect.

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 with no wasted words. It front-loads the action, names the resource, lists the valid provider options, and specifies the timingโ€”all in one compact clause.

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?

The description is sufficient for a simple setter with two parameters in a test context, but it assumes the agent understands the fake OAuth testing workflow. It omits return-value behavior, prerequisites such as registering an app or enabling fake OAuth, and whether the profile applies only once or repeatedly.

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 0%, so the description must compensate. It partially does by naming valid provider values (google|github|facebook|x) and clarifying that 'profile' is the object returned by the fake provider. The inner shape of profile is left unspecified, though the schema's additionalProperties:true suggests arbitrary content is allowed.

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

Purpose4/5

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

The description uses a specific verb and resource: it 'Set[s] the profile' that a fake OAuth provider returns, and it enumerates the supported providers inline (google|github|facebook|x). It clearly identifies this as an OAuth test helper, though it does not explicitly contrast it with sibling simulation tools.

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

Usage Guidelines2/5

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

There is no guidance about when to use this tool versus alternatives like get_oauth_session or the simulate_* tools. The only contextual hint is 'on the next login,' which implies timing but does not state prerequisites, recommended call order, or situations where this tool should not be used.

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

set_test_idA

Set the active test_id: all subsequent calls are filtered/persisted with it. Pass null/None to go back to the global queue.

ParametersJSON Schema
NameRequiredDescriptionDefault
test_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

No annotations are present, so the description carries the burden; it reveals that setting is stateful, that values persist across subsequent calls, and that null clears the state. This is substantial behavioral disclosure for a setter, though it omits any mention of return behavior (covered by output schema) or session scope.

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?

Two short sentences with zero filler; the core action and effect come first, and the reset alternative is front-loaded in the second sentence. Every clause earns its place.

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 one-parameter state setter with an output schema, the description fully covers the state change and reset path. The only slight ambiguity is which sibling tools are subject to the filter and what exactly the 'global queue' means, but the core contract is clear.

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 schema is just string|null with no property description, and the description adds the key meaning that null/None resets to the global queue. However, it gives no guidance on what values the test_id string should take or where to obtain it, so with 0% schema coverage the compensation is partial.

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

Purpose4/5

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

States a specific verb and resource: 'Set the active test_id' with an immediate consequence. It clearly names the stateful effect, but doesn't explicitly contrast with sibling set_app or explain how selecting a test differs from selecting an app.

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?

Gives a clear usage context: subsequent calls are scoped to the active test_id, and passing null/None is the explicit reset path. It does not list alternative tools or non-use conditions, so it stops short of 5.

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

simulate_delivery_webhookA

Fire a delivery status webhook (delivered|read|failed) back to the app. Uses POST /whatsapp/simulate/status.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYes
message_idYes

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 behavioral disclosure burden. It does clearly indicate a network POST operation and the allowed status payloads. However, it does not disclose side effects, prerequisites (e.g., app or webhook configuration), or whether this is a non-production simulation, leaving some behavioral ambiguity.

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?

Two short sentences with no filler. The core action and endpoint are front-loaded, and the status values are packed efficiently into the first sentence.

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?

Given no annotations, no output schema, and minimal parameter metadata, the description covers the main call mechanics but omits response/return behavior, prerequisites such as app selection or webhook registration, and how to obtain message_id. It is adequate for simple use but not fully complete for an agent unfamiliar with the environment.

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 schema provides no descriptions or enums, so the description must compensate. It adds meaningful semantics for the status parameter by listing allowed values, and message_id is reasonably inferable as the target message. However, no format or provenance for message_id is given, so compensation is partial.

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 states a specific verb ('Fire'), a concrete resource ('delivery status webhook'), and the exact statuses it supports ('delivered|read|failed'). The endpoint makes it clear this is a WhatsApp simulation, distinguishing it from siblings like simulate_incoming_message and the other simulate_* tools.

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 by describing the action and endpoint, but it does not explicitly say when to pick this tool over trigger_webhook or simulate_incoming_message, nor does it mention exclusions or prerequisites. Usage context is inferable, not stated.

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

simulate_facebook_eventB

Fire a Facebook Graph API webhook event signed with X-Hub-Signature-256 to the app's registered Facebook webhook. app: registered app name to target; overrides set_app for this call.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
payloadNo
event_typeNopage

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral disclosure burden. It usefully reveals that the event is signed with X-Hub-Signature-256 and that 'app' overrides set_app for this call. However, it does not disclose expected outcomes, side effects, response behavior, or validation behavior for payload/event_type.

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 concise and front-loaded: the first sentence states the primary purpose, and the second adds essential parameter context. No wasted words or redundant information.

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

Completeness2/5

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

This tool has no annotations, no output schema, and zero schema description coverage, so the description must be more complete. It covers the core action but omits meaning for payload and event_type, any usage guidance, and any indication of expected results or errors.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for all three parameters. It only explains 'app' (target and override behavior). The 'payload' and 'event_type' parameters remain undefined in both the schema and the description, leaving important semantics missing.

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 a specific action ('Fire a Facebook Graph API webhook event'), the target ('the app's registered Facebook webhook'), and a key technical detail (signed with X-Hub-Signature-256). This differentiates it from sibling tools like simulate_stripe_event or trigger_webhook by naming the Facebook-specific context.

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

Usage Guidelines2/5

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

The description does not explicitly state when to use this tool versus alternatives. It implies use for Facebook webhook simulation and mentions the target app, but provides no exclusions, prerequisites, or comparisons with sibling simulation tools.

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

simulate_github_eventA

Fire a GitHub webhook event (push, issues, pull_request) signed with X-Hub-Signature-256 to the app's registered GitHub webhook. app: registered app name to target; overrides set_app for this call.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
payloadNo
event_typeNopush

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 full burden. It discloses meaningful behavior: the event is signed with X-Hub-Signature-256, and the 'app' parameter overrides set_app for this call. However, it does not explain side effects (e.g., whether a delivery record is created), what happens if no app is set, or whether a registered webhook is required.

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 long with no wasted words. The first sentence states the core action and target, and the second clarifies a critical parameter override behavior. Information is front-loaded and directly useful.

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?

For a tool with 3 optional parameters and no output schema or annotations, the description is partially sufficient but leaves gaps: full event type enumeration, payload semantics, behavior when app is not provided, and expected return/result. It provides enough to attempt a call but not enough to anticipate all outcomes.

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 0%, so the description must compensate. It explains the 'app' parameter and lists example event types, but the 'payload' parameter receives no explanation. The event_type values are only partially enumerated ('push, issues, pull_request'), leaving ambiguity about the full allowed set.

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 ('Fire a GitHub webhook event'), the specific event types supported ('push, issues, pull_request'), and the target resource ('the app's registered GitHub webhook'). This distinguishes it from sibling simulation tools like simulate_stripe_event or simulate_facebook_event by explicitly naming GitHub.

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 its use case through the GitHub-specific wording, but it does not explicitly state when to choose this tool over alternatives like trigger_webhook or simulate_delivery_webhook. It gives no exclusions or direct routing guidance, so usage context must be inferred from the tool name and sibling set.

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

simulate_incoming_messageB

Simulate an external user sending an inbound message to the app. channel: telegram (via /telegram/client/sendMessage) or whatsapp. app: registered app name to target; overrides set_app for this call.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
textYes
extraNo
senderYes
channelYes

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are present, so the description carries the full burden. It reveals the underlying telegram endpoint and the app override behavior, but does not disclose side effects, whether an actual external send/event is triggered, auth/permission needs, or response behavior.

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?

Three short lines, front-loaded purpose, and zero waste; channel and app clarifications are formatted as compact parameter notes.

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

Completeness2/5

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

For a 5- parameter tool with no annotations and no output schema, three of five parameters are uncleared and there is no return or side-effect information. It is not complete enough for an agent to invoke correctly with confidence.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It explains channel and app, but the required sender and text fields, along with extra, receive no semantic explanation beyond their names.

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?

States a specific verb and resource: simulate an external user sending an inbound message to the app. It also specifies concrete channels (telegram via an endpoint, and whatsapp), making it immediately distinct from sibling simulation and webhook tools.

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?

Gives contextual details about channel choices and app targeting, including that app overrides set_app for this call, but never states when to prefer this tool over siblings or when not to use it.

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

simulate_push_token_unregisteredA

Make a native push token look uninstalled: FCM answers 404 UNREGISTERED and APNs answers 410 Unregistered on the next send. channel: fcm | apns

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYes
channelYes

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and it does reveal the key behavior: the affected token is made to look uninstalled and the next send returns provider-specific errors. It could add detail about persistence or reversibility, but the core side effect is clearly disclosed.

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?

Two short lines with no filler. The behavioral effect is front-loaded, and the channel hint is compact and immediately useful.

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 two-parameter simulation tool, the description gives the essential context: what will happen and which channels are supported. No output schema exists, but the lack of return-value documentation is not a significant gap for a fire-and-forget simulator.

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 0%, so the description must compensate. It explains channel values (fcm | apns) and identifies token as a native push token, but it does not explain where the token comes from, its expected format, or how the channel interacts with the token.

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 states a clear, specific action: make a native push token look uninstalled, and it specifies the observable effect (FCM 404 UNREGISTERED, APNs 410 Unregistered). This distinguishes it from related sibling tools like expire_push_subscription or create_push_subscription.

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 use case is implied: simulate an uninstalled push token to test the next send's failure behavior. However, the description does not explicitly say when to use this over alternatives, nor does it mention any exclusions or prerequites like needing an existing push subscription.

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

simulate_stripe_eventA

Build and send a simulated Stripe event, signed (Stripe-Signature), to the registered webhook. app: registered app name to target; overrides set_app for this call.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
overridesNo
event_typeYes

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations present, the description carries the behavioral burden. It discloses the key side effect: building and sending the event to a webhook, and adds important detail that the event is signed with Stripe-Signature. It also clarifies that app overrides set_app for this call only, giving useful scoping behavior beyond the raw schema.

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 concise sentences with no wasted words. The main action and signing behavior are front-loaded, and the app parameter note is direct and relevant. It is appropriately sized for the tool's complexity.

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

Completeness2/5

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

The description leaves significant gaps: it does not explain what event_type values look like or are accepted, what overrides can contain, what the resulting behavior/return value is, or what happens if no app or registered webhook exists. Given no output schema and no annotations, more context is needed for an agent to invoke this tool with confidence.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It explains only the app parameter and its override behavior. The required event_type is not described, and overrides is an unconstrained object with no explanation of its purpose or allowed keys. This is insufficient for an agent to reliably construct a correct call.

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 states a specific action ('Build and send') and resource: a simulated Stripe event, signed with Stripe-Signature, sent to a registered webhook. This clearly differentiates it from sibling simulation tools like simulate_github_event or simulate_facebook_event by naming Stripe and the webhook target.

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 intended use is implied: simulate a Stripe webhook event to test the registered webhook. The app override is explained. However, there is no explicit guidance about when to prefer this tool over sibling simulators, nor any stated prerequisites such as needing a webhook registered first.

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

simulate_x_eventB

Fire an X (Twitter) Account Activity webhook event signed with X-Twitter-Webhooks-Signature to the app's registered X webhook. payload is a list of event objects, as the real API delivers. app: registered app name to target; overrides set_app for this call.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
payloadNo
event_typeNotweet_create_events

TDQS

B3.3/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 behavioral burden. It does add useful context: the event is signed with X-Twitter-Webhooks-Signature, targets the registered X webhook, and app overrides set_app for this call. However, it does not disclose side effects, whether a registered webhook is required, or what happens if no app is specified.

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 concise and front-loaded with the core action. Each sentence adds distinct information: the first describes the action and signature, the second clarifies payload and app behavior. No filler or redundant content.

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

Completeness2/5

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

Given no annotations, no output schema, and 0% schema coverage, the description is incomplete. It fails to explain the event_type parameter, any prerequisites like webhook registration, expected return/response behavior, or side effects. An agent would lack enough context to confidently invoke this tool correctly.

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?

Schema description coverage is 0%, so the description must compensate. It meaningfully explains payload ('a list of event objects, as the real API delivers') and app ('registered app name to target; overrides set_app for this call'). However, event_type is not mentioned at all, leaving one parameter unexplained.

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

Purpose4/5

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

The description clearly identifies the action (fire), the resource (X/Twitter Account Activity webhook), and the signature mechanism, making the tool's purpose specific. However, it does not explicitly differentiate itself from sibling simulation tools like simulate_delivery_webhook or trigger_webhook.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus the many sibling simulation tools, nor does it state any prerequisites or exclusions. It only describes what the tool does, not the conditions under which an agent should select it.

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

trigger_webhookA

Fire a test event to a registered webhook and return the app's response.

ParametersJSON Schema
NameRequiredDescriptionDefault
payloadNo
event_typeNotest
webhook_idYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description must carry the full safety burden. It discloses that the tool fires an event and returns the app's response, but says nothing about whether this makes an external network call, possible side effects on webhook state, or failure behavior when webhook_id is invalid.

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?

A single 14-word sentence front-loads the verb and covers action, resource, and return value. Every element earns its place with no redundancy.

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?

For a tool with three parameters, no annotations, and no output schema, this minimal description covers the core action but leaves gaps in sibling differentiation, side-effect disclosure, and valid event_type/payload expectations. The moderate complexity and crowded sibling context merit more guidance.

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 property descriptions are entirely absent (0% coverage), but the description offers only the phrase 'test event,' which mildly echoes the event_type default of 'test.' The meanings of webhook_id and payload are left entirely to their self-explanatory names.

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?

States a specific verb ('fire'), a resource ('test event to a registered webhook'), and the return value. The qualifiers 'test' and 'registered' help distinguish it from simulation siblings like simulate_delivery_webhook and registration tools like register_webhook.

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 a testing context but never states when to prefer trigger_webhook over the many simulate_* siblings or when not to use it. No exclusions or alternative tool names are mentioned.

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

verify_facebook_webhookA

Verify a Facebook webhook subscription (hub.mode/hub.verify_token/ hub.challenge) as Meta does on registration. Returns the challenge URL.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses that the tool verifies a subscription and returns the challenge URL, which is useful, but it does not mention potential side effects, authentication requirements, or any HTTP/network behavior. The core action is clear, yet the behavioral profile is incomplete.

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?

Two compact clauses convey the purpose, the protocol context, and the return value without wasted words. The key operational information is front-loaded.

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 zero-parameter tool with an output schema, the description is sufficiently complete. It explains what the tool does, when it is used (registration), and what it returns, so an agent can select and invoke it correctly without additional documentation.

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, so the baseline is 4. The description does not need to explain parameter semantics, and the empty schema already covers the parameter surface completely.

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 ('Verify'), names the exact resource ('Facebook webhook subscription'), and mentions the handshake fields (hub.mode/hub.verify_token/hub.challenge) plus the return value. This clearly distinguishes it from sibling registration and simulation tools.

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 phrase 'as Meta does on registration' gives clear usage context: this is the verification step in the Facebook webhook registration flow. It does not explicitly list alternatives or exclusions, but the context is strong enough for an agent to infer when to invoke it.

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

TDQS

A3.5/5.0
Disambiguation4/5

Most tools have a distinct resource+action purpose, so an agent can usually select the right one. A few pairs overlap or look similarโ€”list_webhooks vs list_webhook_deliveries, list_sent_messages vs get_timeline_markdown, and clear_channel vs clear_allโ€”but the descriptions clarify the boundaries.

Naming Consistency5/5

All tool names use snake_case with a verb-first pattern such as list_, get_, set_, register_, simulate_, and clear_. Minor multiword names like simulate_push_token_unregistered remain readable and do not break the overall convention.

Tool Count2/5

31 tools is above the 25-tool threshold where the surface starts to feel heavy. The broad multi-channel domain justifies some size, but many simulate_* and channel-specific tools could be grouped or split into focused sub-servers to reduce cognitive load.

Completeness4/5

The tool set covers the core lifecycle well: app registration, webhooks, captured messages, OTP/TOTP, push subscriptions, OAuth sessions, simulation, and cleanup. Notable gaps exist, such as no delete/unregister webhook and limited inbound simulation channels beyond Telegram/WhatsApp, but typical verification workflows are still 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

  • A
    license
    A
    quality
    D
    maintenance
    Programmatic email deliverability testing for AI agents. Create inbox placement tests across Gmail, Outlook, Yahoo, Mail.ru, Yandex โ€” get per-provider placement (Inbox/Spam/Promotions), SPF/DKIM/DMARC auth, Rspamd & SpamAssassin verdicts, DNS health (MX, PTR, DNSBL), and live SSE results.
    5
    57
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    5
    15
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to create disposable email inboxes and automatically extract OTPs, magic links, and verification codes from incoming emails.
    24
    MIT

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/reiarseni/mockpost'

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