Skip to main content
Glama
Pletopay MCP Server

Pletopay MCP Server

Official
by pletopay

Pletopay MCP server

@pletopay/mcp is the official Model Context Protocol server for the Pletopay API. It lets AI agents (Claude Desktop, Claude Code, Cursor, VS Code and any other MCP client) work with a Pletopay account: payments, virtual accounts, customers, transfers, refunds, settlements, checkout, payment links, invoices, subscriptions, reports, webhooks and the sandbox.

  • One tool per API operation (83), generated from the published API contract, grouped into toolsets.

  • Safe by default in live mode: tools that send money or change where it goes are hidden from live keys until you enable them; transfers and refunds take a required idempotency_key, so a retried call never pays twice; --read-only exposes lookups only.

  • Docs and reference built in: search_docs / get_doc over the Pletopay guides (offline), resources for webhook event types, error codes and object schemas, and prompts for common workflows.

  • Runs locally over stdio (npx -y @pletopay/mcp) or as a stateless Streamable HTTP server where every request brings its own key.

Full guide: docs.pletopay.com/mcp.

Quick start

Start with your test key (sk_test_…, Dashboard → Settings → Developers → API keys).

Claude Code

claude mcp add pletopay --env PLETOPAY_SECRET_KEY=sk_test_… -- npx -y @pletopay/mcp

Claude Desktop, Cursor and other clients (claude_desktop_config.json, .cursor/mcp.json, …)

{
  "mcpServers": {
    "pletopay": {
      "command": "npx",
      "args": ["-y", "@pletopay/mcp"],
      "env": { "PLETOPAY_SECRET_KEY": "sk_test_…" }
    }
  }
}

Requires Node.js 24 or newer. Pass the key in the environment rather than with --api-key: command-line arguments are visible to other users of the machine.

Related MCP server: paystack-mcp-server

Options

Flag

Environment

HTTP header

Default

--api-key <key>

PLETOPAY_SECRET_KEY

Authorization: Bearer sk_… (required)

–

--toolsets <list>

PLETOPAY_MCP_TOOLSETS

X-PletoPay-MCP-Toolsets

all

--read-only

PLETOPAY_MCP_READ_ONLY=true

X-PletoPay-MCP-Read-Only: true

off

--enable-money-movement

PLETOPAY_MCP_ENABLE_MONEY_MOVEMENT=true

X-PletoPay-MCP-Money-Movement: enabled

off for live keys

--no-docs

–

–

docs tools, guide resources and prompts on

--api-url <url>

PLETOPAY_API_URL

(server setting)

https://api.pletopay.com

Toolsets: customers, payments, virtual_accounts, subaccounts, transfers, settlements, refunds, checkout, payment_links, invoices, risk, subscriptions, reports, webhooks, balance, sandbox, docs.

Run npx -y @pletopay/mcp --help for the full list.

Money movement

Pletopay secret keys have full access within their mode, so the server adds its own guardrails:

Test key

Live key

Live key + --enable-money-movement

Reads (lists, lookups, balance, reports)

✓

✓

✓

Writes (customers, payments, virtual accounts, invoices, webhooks, …)

✓

✓

✓

Money (create_transfer, create_refund, create_subaccount, update_subaccount, create_split_rule, update_split_rule)

✓

–

✓

Sandbox (simulate_transfer, list_sandbox_test_values)

✓

–

–

--read-only removes every write and money tool whatever else is set. Hidden tools are not listed, and calling one by name returns the reason instead of calling the API. Tools carry MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) so clients can ask for approval before a change.

Tools, resources and prompts

  • Tools: one per API operation, named after its operationId in snake_case (list_payments, get_payment_by_reference, create_virtual_account, simulate_transfer, create_transfer, …), with the operation's fields as arguments. List tools take limit, starting_after and filters such as created: { gte, lte }; results include meta.has_more and meta.next_cursor. Results are the API's data plus the request_id; errors carry type, code, param and request_id. Plus search_docs and get_doc.

  • Resources: pletopay://webhooks/events, pletopay://errors, pletopay://schemas/{name}, pletopay://docs/{slug} and pletopay://openapi/public.v1.yaml (large).

  • Prompts: reconcile_collections, investigate_payment, investigate_failed_transfer, set_up_webhooks.

Remote (Streamable HTTP)

npx -y @pletopay/mcp --transport http --port 3010

POST /mcp is stateless: each request authenticates with its own Authorization: Bearer sk_… and gets a fresh server bound to that key; nothing is stored. GET /healthz reports health. Headers can narrow the toolsets and force read-only (never undo a server's --read-only) and can enable money movement.

Hardening: Host allowlist against DNS rebinding (MCP_ALLOWED_HOSTS, required when binding to a non-loopback address), browser Origin allowlist (MCP_ALLOWED_ORIGINS, default none), a per-IP rate limit before authentication (MCP_RATE_LIMIT_PER_MINUTE, default 300; set MCP_TRUST_PROXY_HOPS behind a proxy), a 1 MB body limit, and a structured access log that never contains keys or bodies. Each request id is sent to the API as X-Correlation-Id. Put it behind TLS.

The caller's address is not forwarded: if a merchant uses an IP allowlist, API calls through a hosted server come from that server's address.

Docker

docker build -t pletopay-mcp .
docker run -p 3010:3010 -e MCP_ALLOWED_HOSTS=mcp.example.com -e MCP_TRUST_PROXY_HOPS=1 pletopay-mcp

Never give the container a PLETOPAY_SECRET_KEY. deploy/do-app.example.yaml is an App Platform spec for a pre-built image.

Library use

import { createPletopayMcpServer, createHttpApp } from '@pletopay/mcp';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

const server = createPletopayMcpServer({ secretKey: process.env.PLETOPAY_SECRET_KEY!, readOnly: true });
await server.connect(new StdioServerTransport());

createHttpApp(options) returns the Express app used by --transport http, to mount in your own server.

Development

See CONTRIBUTING.md. pnpm verify runs lint, formatting, types, the spec/docs/generated-code drift checks, the brand check, unit tests and package checks; pnpm test:live runs the live suite against a local API in test mode.

License

MIT

Available Tools

85 tools
cancel_subscriptionCancel a subscription (now, or at the end of the current period)B
Destructive

Cancel a subscription (now, or at the end of the current period).

Cancel a subscription now, or at the end of the current period with at_period_end: true. Canceling an already canceled subscription returns 409 subscription_canceled.

NameRequiredDescriptionDefault
idYesThe subscription id (`sbs_…`).
reasonNo
at_period_endNoCancel when the current period ends instead of now

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered structurally. The description adds genuinely new behavior — the two cancellation timings and the `409 subscription_canceled` outcome for repeated calls — but says nothing about reversibility, reactivation, proration, or what the call returns.

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

Conciseness3/5

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

The opening sentence is a verbatim duplicate of the title, which is pure waste, and the parenthetical restates the same idea a third time. The remaining content is compact and front-loads the mode choice correctly, but the redundancy costs it.

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 destructive mutation tool with no output schema, an agent would benefit from knowing what a successful cancellation returns (canceled object, effective date, whether the subscription becomes read-only). The description covers the two timing modes and the error case but leaves that return/effect picture incomplete.

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 67%, and the description reinforces the meaning of `at_period_end: true` beyond the schema's one-line note. However, the `reason` parameter is undocumented in both the schema and the description, so the description does not fully compensate for the coverage gap.

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 names a specific verb and resource ('Cancel a subscription') and immediately distinguishes the two modes of cancellation. It is clearly separable from siblings like get_subscription, list_subscriptions, and create_subscription, though that separation comes from the verb itself rather than any explicit 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 Guidelines3/5

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

It gives real conditional guidance: use `at_period_end: true` to cancel at the end of the period versus immediately by default, and it documents the 409 error for re-canceling. It does not mention alternatives (e.g., plan changes via update_subscription) or when not to cancel, so usage context is implied rather than complete.

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

close_virtual_accountClose a dedicated virtual accountA
Destructive

Close a dedicated virtual account.

Close a dedicated virtual account so it stops receiving money for you. Dynamic accounts can’t be closed this way (400 invalid_operation): they close with their payment. Closing an already closed account returns it unchanged.

NameRequiredDescriptionDefault
idYesThe virtual account id (`va_…`).
reasonYes
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false, so the description adds real value on top: the downstream effect (account stops receiving money), the guard error for dynamic accounts, and the no-op behavior for already-closed accounts returning unchanged. It doesn't say whether closure is reversible or what the response body contains, which keeps it below 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.

Conciseness4/5

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

Short and front-loaded, with the error case and the idempotent no-op placed where an agent will read them. The first sentence merely restates the title before the useful sentence that follows, a small 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 destructive, no-output-schema mutation, it covers the effect, the failure mode, and the already-closed case, which is most of what an agent needs. It omits any return-value indication and why `reason` is required, leaving a slight gap.

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 67%; `id` and `idempotency_key` are documented in the schema, but `reason` has no description anywhere. The description adds no meaning about any parameter, so it neither compensates for the gap nor adds beyond the schema — baseline 3.

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

Purpose5/5

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

States a specific verb and resource ("Close a dedicated virtual account") and immediately defines the effect: it stops receiving money. The qualifier "dedicated" separates it from dynamic accounts and from the create/list/get virtual account siblings.

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 when-not rule: dynamic accounts can't be closed this way and are closed by their payment, with the exact error surfaced (`400 invalid_operation`). It lacks an explicit named alternative tool for the dynamic case, but the routing condition is unambiguous.

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

create_checkout_sessionCreate a hosted checkout sessionA

Create a hosted checkout session.

Create a checkout session, then either redirect your customer to its url (hosted checkout) or hand its token to your front end and open it in the Pletopay popup with the browser SDK and your publishable key. Pletopay’s page shows the bank-transfer details (the payment is created when the customer opens it), waits for the transfer and sends the customer to success_url (hosted) or calls your onSuccess callback (popup). The session expires after expires_in seconds (default 1 hour, at most 3 hours: one-time bank accounts are limited to 3 hours) and completes when its payment succeeds (checkout.session.completed). reference is optional; when given it must be unique per mode (409 duplicate_reference), and the session can then be retrieved with GET /api/v1/checkout/sessions/reference/{reference}. Neither the redirect nor the callback is proof of payment: confirm with the webhook or by retrieving the session.

NameRequiredDescriptionDefault
splitNoSplit rule applied to the payment (spl_…)
amountYesAmount in kobo
currencyYes
customerNoExisting customer (cus_…)
metadataNo
referenceNoYour reference for this session, unique per mode (409 duplicate_reference if reused)
cancel_urlNoWhere the customer goes if they cancel
expires_inNoSeconds until the session expires (default 3600, at most 10800: one-time accounts last up to 3 hours)
descriptionNoShown to the customer
success_urlNoWhere the customer is sent after paying
customer_emailNo
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare it is a non-read-only, non-destructive, non-idempotent, closed-world call. The description adds substantial behavior: the payment is created only when the customer opens the page, the session expires after `expires_in` (default 1h, max 3h, 3h cap for one-time bank accounts), completes on `checkout.session.completed`, and returns 409 duplicate_reference on reused references. It notably warns that redirect/callback is not proof of payment and must be confirmed via webhook or session retrieval — a genuinely useful caveat not implied by the annotations. It does not mention the idempotency_key retry semantics.

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?

Front-loaded with the action, then the two integration paths, then lifecycle, then the confirmation caveat — a sensible ordering. It is dense and slightly redundant (the first line restates the title, and the opening is then repeated as 'Create a checkout session'), and a few sentences pack multiple clauses that could be split for scanability.

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?

With no output schema, the description carries the return-value burden and does so by naming the `url` and `token` response fields and explaining what each is for. Combined with expiry rules, the completion event, the duplicate_reference error, and the payment-confirmation caveat, an agent has everything needed to create a session and tell the user how to finish the 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?

Schema coverage is 75%, so most parameters are already documented. The description adds non-obvious semantics beyond the schema: why `expires_in` is capped (one-time bank accounts last up to 3 hours), the per-mode uniqueness constraint on `reference` and how to retrieve the session by it, and the fact that `amount` is the amount that will actually be charged at session open time. It says nothing about `split`, `metadata`, or `customer`, leaving those to the schema.

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+resource (create a checkout session) and immediately distinguishes it from adjacent resources by describing the two consumption modes (redirect to `url` vs `token` in the Pletopay popup). This separates it from siblings like create_payment and create_payment_link without requiring the schema to be opened.

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 concrete integration guidance: use `url` for hosted redirect, or hand `token` to the front end with the browser SDK and publishable key. Also states when to supply `reference` (uniqueness per mode, retrievable via a specific endpoint). It does not explicitly say when to prefer this over create_payment_link or create_payment, so it stops short of full alternative routing.

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

create_customerCreate a customerA

Create a customer.

Create a customer so you can issue dedicated virtual accounts, invoices and subscriptions to them, and see their payments together. Every field is optional. An email must be unique among your customers in this mode (409 customer_exists).

NameRequiredDescriptionDefault
nameNo
emailNo
phoneNo
metadataNo
external_idNoYour own identifier for this customer
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

A3.9/5.0
Behavior4/5

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

Beyond the generic mutation and safety annotations, it discloses that every field may be omitted and that a duplicate email produces the concrete `409 customer_exists` failure. It does not explain other side effects or success behavior, but the uniqueness rule is actionable operational context.

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 definition is short and front-loads the operation, rationale, optionality, and conflict behavior without unnecessary detail. Repeating 'Create a customer' at the start of both paragraphs is mildly redundant.

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 relatively simple six-field creation operation, the purpose, optionality, duplicate-email behavior, and schema-level idempotency guidance are sufficient for a correct basic invocation. Remaining gaps include the unexplained phrase 'in this mode' and the absence of an explicit existing-customer workflow.

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 meaningful semantics for email through its mode-scoped uniqueness constraint and states the global optionality of all fields. With only 33% schema description coverage, it does not fully compensate for undocumented fields such as name, phone, and metadata.

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 operation as creating a customer and explains the record's role in issuing virtual accounts, invoices, and subscriptions while grouping payments. It does not explicitly distinguish the operation from siblings such as update_customer or list_customers.

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 downstream uses provide clear context for when a customer record is useful. However, there is no explicit when-not guidance or instruction to find and reuse an existing customer rather than create another one.

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

create_invoiceCreate a draft invoiceA

Create a draft invoice.

Create a draft invoice for a customer with line items and optional taxes (basis points, 750 = 7.5%). Totals are computed for you. A draft can be edited; finalize it to make it payable.

NameRequiredDescriptionDefault
memoNo
itemsYes
splitNoSplit rule (spl_…)
taxesNo
customerYesCustomer (cus_…)
due_dateYes
metadataNo
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

A3.7/5.0
Behavior3/5

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

Beyond the annotations it usefully discloses two behaviors: totals are server-computed and the result is an editable draft rather than a payable invoice. However, it says nothing about retry behavior, even though idempotentHint=false while the schema exposes an idempotency_key — an agent could reasonably worry about duplicate invoices and gets no guidance here.

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?

Four short sentences, front-loaded with the action and followed by the mechanics and lifecycle. The only waste is the first line repeating the title verbatim before the more informative second 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?

For a nested-object mutation tool with no output schema, the description covers the core concept but omits what comes back (draft/invoice id), the currency assumption behind unit_amount, and handling of the split rule. Adequate to start a call, not sufficient to call confidently.

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 only 38%, so the description needs to carry weight, yet it only restates the taxes basis-point convention (already documented on the 'bps' property) and otherwise lists 'customer, line items, optional taxes'. It adds nothing on due_date, split, metadata, idempotency_key, or the kobo unit of unit_amount.

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 ('Create a draft invoice') and adds the qualifying scope 'draft' versus the later finalized/payable state. Combined with the customer + line items framing, an agent can distinguish it from finalize_invoice, update_invoice and the other invoice siblings without opening the schema.

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 sentence 'A draft can be edited; finalize it to make it payable.' gives clear lifecycle context and implicitly routes the agent to finalize_invoice as the follow-up step. It stops short of explicit when-not-to-use guidance (e.g. use update_invoice to modify an existing draft, not this tool).

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

create_paymentCreate a bank-transfer paymentA

Create a bank-transfer payment.

Create a bank-transfer payment. Pletopay opens a dynamic (single-use) virtual account for it and returns the account in bank_transfer: show the account number, bank and amount to your customer.

With amount_rule: exact (the default) transfers of any other amount are rejected. With any, whatever arrives is accepted and amount may be omitted.

The account expires with the payment: expires_in (seconds) or expires_at, between 5 minutes and 3 hours (the limit for one-time accounts; 400 expiry_out_of_range carries details.min_seconds / max_seconds); the default is your organization’s setting (30 minutes unless changed).

The payment becomes succeeded only when the credit is confirmed. Never treat a redirect or client-side callback as proof of payment: listen for payment.succeeded or retrieve the payment.

reference must be unique among your payments in this mode (409 duplicate_reference). Send an Idempotency-Key so a retried request can’t create a second payment.

NameRequiredDescriptionDefault
splitNoSplit rule id (spl_…) to share the net amount with subaccounts
amountNoAmount in minor units (kobo). ₦50,000.00 = 5000000. Required when amount_rule is exact.
expandNoEmbed related objects instead of their ids. `customer` embeds the customer.
currencyYes
customerNo
metadataNo
referenceYesYour unique reference for this payment (e.g. order id)
expires_atNoAbsolute expiry, alternative to expires_in: 5 minutes to 3 hours from now
expires_inNoSeconds until the payment (and its account) expires: 300 to 10800 (one-time accounts last up to 3 hours)
amount_ruleNoexact: transfers of any other amount are rejected. any: accept whatever is sent.exact
descriptionNo
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

A4.2/5.0
Behavior5/5

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

The description carries substantial behavior beyond the annotations: it discloses the side effect (a dynamic virtual account is provisioned and expires with the payment), specific error contracts (`400 expiry_out_of_range` with `details.min_seconds`/`max_seconds`, `409 duplicate_reference`), and the success condition tied to a webhook event. This does not conflict with `idempotentHint: false` — the annotation correctly says a repeat call would create a second payment, and the description explains the caller-supplied key that prevents it.

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?

Paragraphs are front-loaded and each carries a distinct operational fact (account handoff, amount rule, expiry, success semantics, uniqueness/idempotency), so there is little filler. The one flaw is the opening sentence duplicated almost verbatim ("Create a bank-transfer payment.\n\nCreate a bank-transfer payment."), which wastes the highest-attention position.

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 12-parameter creation tool with nested objects and no output schema, the description covers the full lifecycle an agent needs: what is created, what to show the customer, how long it lives, how success is proven, and the two failure modes it will most likely hit. Left unaddressed are the response envelope beyond the `bank_transfer` account and the untouched parameters (`split`, `expand`, `metadata`, `customer`).

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?

With 67% schema coverage, the description meaningfully extends the schema on the parameters that matter: it states the default for `amount_rule`, that `amount` becomes optional under `any`, the hard range and default for expiry, and the uniqueness constraint on `reference`. It does repeat some schema text verbatim (the 300–10800 expiry seconds) and says nothing about `split`, `expand`, `metadata`, `customer`, or `description`, leaving a quarter of the surface to the schema alone.

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 gives a specific verb and resource ("Create a bank-transfer payment") and immediately explains the mechanism — Pletopay opens a single-use virtual account returned under `bank_transfer` — which separates it functionally from payout tools like create_transfer and from create_checkout_session. It never names a sibling, so an agent must still infer the boundary between accepting a bank transfer and accepting a card checkout.

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 sets clear conditions for the key decisions: `amount_rule: exact` versus `any` (and that `amount` may then be omitted), the 5-minute-to-3-hour expiry window and its default, and when to send an Idempotency-Key. It also warns how NOT to confirm payment — don't trust a redirect or client-side callback, listen for `payment.succeeded` or retrieve the payment. The gap is that it never tells the agent when to pick this over create_checkout_session or create_payment_link.

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

create_planCreate a planB

Create a plan.

Create a plan: an amount billed every interval_count × interval (for example every 3 months). Subscribe customers to it with POST /api/v1/subscriptions.

NameRequiredDescriptionDefault
nameYes
amountYesAmount per period in kobo
intervalYes
metadataNo
descriptionNo
interval_countNoBill every N intervals (e.g. 3 months)
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=false, so the mutation profile is covered. The description adds conceptual context about recurring billing but says nothing about prerequisites, whether a plan can be modified afterward (update_plan exists), or what the response contains. Note the schema offers an idempotency_key even though idempotentHint=false, which is a nuance the description does not clarify.

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

Conciseness3/5

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

Short overall, but the first sentence 'Create a plan.' is pure repetition of the title and the second sentence restarts with the same phrase. The substantive content (billing period formula, subscription hand-off) is good, but one sentence is wasted.

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 7-parameter mutation with no output schema, the description covers the core concept and the natural next step adequately; return shape is unspecified but the plan object model is at least implied. Slightly incomplete on idempotency behavior and post-creation editability, but nothing critical is missing for a correct call.

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 43%, so the description should compensate. It does add real meaning for the compound `interval_count` × `interval` billing period, the trickiest parameter pairing, but it leaves name, description, metadata and idempotency_key unaddressed (amount's kobo unit is covered only by the schema).

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 plus the domain meaning: 'an amount billed every `interval_count` × `interval` (for example every 3 months)'. That clarifies what a plan actually is, and it names the downstream consumer (create_subscription via POST /api/v1/subscriptions), so an agent can separate it from subscription creation. The only weakness is the redundant restatement of 'Create a plan' twice.

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?

It gives a follow-up path ('Subscribe customers to it with POST /api/v1/subscriptions'), which implies the tool is a prerequisite for subscriptions, but there is no explicit when-to-use/when-not guidance versus siblings like create_subscription or update_plan. Usage is inferable rather than stated.

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

create_refundRefund a payment (fully or partially)A
DestructiveIdempotent

Refund a payment (fully or partially).

Refund a payment, fully or partially, by bank transfer from your available balance. Idempotency-Key is required.

Without amount, the whole refundable amount is refunded. Only succeeded or partially_refunded payments can be refunded (409 payment_not_refundable).

Destination. When the sender’s full account details are known, the refund always goes back to that account: omit destination (a different one returns 400 refund_destination_mismatch). When the sender isn’t known, pass destination (400 refund_destination_required otherwise); it is verified by name enquiry. In live mode a custom destination also needs outbound transfers enabled (403 transfers_disabled).

The payment becomes partially_refunded or refunded only once the refund has actually been paid out (refund.succeeded). Without a reference, one is derived from the Idempotency-Key, so a retried request can’t create a second refund.

In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user.

Choose an idempotency_key and reuse it if you retry this call, so it can never happen twice.

NameRequiredDescriptionDefault
amountNoAmount in kobo; defaults to the full refundable amount (partial refunds allowed)
reasonYes
paymentYesThe original payment (pay_…)
metadataNo
referenceNoYour unique refund reference
destinationNoWhere to send the money. Defaults to the original sender when their full account details are known.
idempotency_keyYesRequired. A unique key you choose for this request (for example a UUID). If you retry, send the SAME key: the API returns the original result instead of acting twice.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, it discloses that this sends real money in live mode, cannot be undone, affects payment status only after payout, and requires confirming amount and destination with the user. It also explains idempotency behavior and the resulting error conditions in useful detail.

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 content is front-loaded and organized around key concerns such as destination and idempotency. However, the opening repeats the title and then restates the same sentence, which is unnecessary.

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 destructive, live-money mutation with seven parameters and no output schema, the description covers refundability, destination rules, idempotency, payout timing, and confirmation requirements. Nothing essential for correct invocation appears to be missing.

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 description adds substantial meaning beyond the schema for `amount`, `destination`, `reference`, and `idempotency_key`, including defaults and relevant error cases. It does not explain `reason` or `metadata`, so it is strong but not exhaustive.

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 and resource: refund a payment, fully or partially. It clearly distinguishes this mutation from read-oriented siblings such as get_refund and list_refunds.

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 when-to-use conditions, including that only `succeeded` or `partially_refunded` payments can be refunded, and explains when to omit or pass `destination`. It does not explicitly name sibling alternatives, so it falls just short of the top score.

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

create_reportGenerate a CSV reportA

Generate a CSV report.

Generate a CSV report for a period of up to 366 days (period_end is exclusive). Reports run in the background: poll the report or listen for report.ready, then download it. Amounts in the CSV are exact decimal naira and times are UTC. The file is available until the report’s expires_at. At most two reports generate at once per mode (429 reports_in_progress).

NameRequiredDescriptionDefault
typeYes
period_endYesExclusive; at most 366 days after period_start
period_startYes

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: background execution model, the report.ready event, file retention tied to expires_at, exact decimal naira amounts, UTC timestamps, and a concurrency cap with the concrete error code 429 reports_in_progress. These are exactly the operational facts an agent cannot infer from the schema or the readOnly/idempotent hints.

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?

Four tight sentences, front-loaded with the purpose, then constraints, then operational notes. Nothing is repeated and every sentence carries information the caller needs.

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?

With no output schema, the description carries the return-handling burden and does so well: it explains that a report is produced asynchronously, must be polled or awaited via an event, then downloaded before expiry. The one gap is that it never says what the create call itself returns (a report id/object), which the agent needs to poll or fetch.

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 only 33%, so the description has to compensate; it does explain the 366-day cap and that period_end is exclusive, though the schema already repeats the exclusivity note. The type enum (payments, transfers, refunds, settlements, balance_statement, customers, invoices, subscriptions) is never discussed, so an agent gets no guidance on which report type to pick.

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 (generate) and resource (CSV report) and immediately frames the async lifecycle: 'poll the report or listen for report.ready, then download it.' That phrasing implicitly separates this from the sibling read/download tools (get_report, download_report, list_reports), so an agent can place it in the workflow without opening a schema.

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 clear context for when this is the right call (period-bounded report generation) and how to proceed afterward (poll or listen for report.ready, then download). It never explicitly names the alternative tools or states when NOT to use it, e.g. a single payment lookup should use get_payment rather than a report.

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

create_split_ruleCreate a split ruleA
Destructive

Create a split rule.

Create a split rule that shares each payment’s net amount (after fees) with one or more subaccounts. The rest stays in your balance.

percentage shares are basis points (2500 = 25%); flat shares are kobo, capped at the net amount. Pass the rule id as split when you create a payment, checkout session, payment link, invoice or subscription. The split is frozen on each payment when it is created.

In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user.

NameRequiredDescriptionDefault
nameYes
typeYes
metadataNo
allocationsYes
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description goes well beyond them by explaining that live mode moves real money, that the action cannot be undone, and that the split is frozen onto each payment at creation time. That freezing rule is non-obvious behavioral context an agent could not infer from the schema or annotations.

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 safety warning is front-loaded in the final sentence and every sentence carries information. Minor waste: the opening line "Create a split rule" duplicates the title, and the second sentence restarts with the same phrase rather than continuing the thought.

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 destructive, nested-parameter mutation tool with no output schema, the description covers the economics, the units, the downstream wiring, and the safety requirement. It stops short of saying what the call returns (the new rule id, presumably) or what constraints apply to `name`, which matters given there's no output schema to fall back on.

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?

With schema description coverage at only 20%, the description carries real weight and delivers the important part: that `percentage` shares are basis points (2500 = 25%), that `flat` shares are in kobo, and that flat shares are capped at the net amount. It does not explain `name` or `metadata`, and it never mentions `idempotency_key`, so the less obvious parameters are left to the schema.

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 ("Create a split rule") and immediately defines the resource's semantics: it shares each payment's net amount after fees with subaccounts while the remainder stays in the creator's balance. The create verb also separates it cleanly from the list/get/update split-rule siblings in the tool list.

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 concrete downstream usage: pass the rule id as `split` when creating a payment, checkout session, payment link, invoice or subscription, and it warns to confirm amount and destination with the user before calling in live mode. What's missing is explicit guidance on when to use `update_split_rule` instead of creating a new rule, or whether multiple rules may coexist.

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

create_subaccountCreate a subaccount (a seller/vendor on your platform) with a verified payout accountA
Destructive

Create a subaccount (a seller/vendor on your platform) with a verified payout account.

Create a subaccount: a seller, vendor or branch on your platform with its own balance and payout account. The payout account is verified by name enquiry (400 account_not_resolved if it can’t be resolved). Payments share their net amount with subaccounts through split rules.

In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user.

NameRequiredDescriptionDefault
nameYes
emailNo
metadataNo
bank_codeYesPayout bank code
account_numberYesPayout account (verified by name enquiry)
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

A3.5/5.0
Behavior4/5

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

Beyond the annotations, the description discloses the verification behavior of the payout account and the concrete failure mode '400 account_not_resolved', which an agent cannot infer from the schema. It also reinforces the destructive/live-mode stakes ('sends real money or changes where money is paid, and it cannot be undone'), consistent with destructiveHint=true. Minor imprecision: creating a subaccount registers a payout destination rather than itself moving money, and idempotency behavior is left entirely to the schema.

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

Conciseness3/5

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

The first sentence repeats the title verbatim and the second sentence restates the same definition ('a seller, vendor or branch...'), so the opening is redundant. The remaining content (verification failure, live-mode irreversibility, confirmation step) is useful and reasonably front-loaded, but the wasted restatement and the irrelevant amount reference cost it.

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 destructive, money-adjacent mutation with no output schema and only 50% parameter coverage, the description covers the key risk and one error code but omits what is returned (e.g. subaccount identifier and verification status) and whether a resolve_account call should precede it. Its completeness is adequate but leaves real gaps an agent would need to fill.

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?

With 50% schema description coverage, the description partially compensates by explaining that the payout account is verified by name enquiry, which gives meaning to account_number and bank_code. But 'name', 'email' and 'metadata' get no semantic treatment, and the 'amount (in kobo)' phrase references no parameter at all, adding noise rather than meaning.

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 gives a specific verb and resource ('create a subaccount') and defines the resource conceptually as 'a seller, vendor or branch on your platform with its own balance and payout account'. It also relates subaccounts to split rules, which hints at how it differs from create_customer and the split-rule tools. It stops short of explicitly naming a sibling to prefer instead, so a 4 rather than 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?

It gives genuine pre-call guidance ('confirm the exact amount (in kobo) and the destination with the user') and implies when to use it (when you need a seller with its own balance and payout account). However, the 'confirm the exact amount (in kobo)' instruction does not correspond to any parameter of this tool and reads as guidance copied from a transfer/payment tool, which could mislead an agent. No explicit when-not-to-use or alternative routing is provided despite several nearby siblings (resolve_account, create_customer, create_split_rule).

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

create_subscriptionSubscribe a customer to a planA

Subscribe a customer to a plan.

Subscribe a customer to a plan. The first period’s invoice is issued at start_date (default now) and each later one at the end of the period, due after days_until_due days.

Nothing is ever debited automatically; Nigerian bank transfers are push payments. With collection_method: invoice the customer pays each period through its hosted invoice page. With dedicated_account, the customer also gets a dedicated virtual account and an exact transfer into it pays the open invoice.

A customer can have one live subscription per plan (409 subscription_exists).

NameRequiredDescriptionDefault
planYesPlan (plan_…)
splitNoSplit rule (spl_…) applied to each payment
customerYesCustomer (cus_…)
metadataNo
start_dateNoDefaults to now; the first invoice is issued at this time
days_until_dueNo
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.
collection_methodYesinvoice: each period is paid through its hosted invoice page. dedicated_account: an exact transfer into the customer's dedicated account also pays it. Nothing is ever debited automatically.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare the non-read-only, non-destructive, non-open-world profile, and the description adds genuinely new behavior: nothing is debited automatically, invoices are issued at `start_date` then at each period end, and a dedicated virtual account is provisioned for the `dedicated_account` path. The 409 subscription_exists conflict is a useful disclosed failure mode. It does not describe the returned subscription object or confirmation timing.

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

Conciseness3/5

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

The lead sentence 'Subscribe a customer to a plan.' is duplicated immediately, which is pure waste. The `collection_method` explanation largely restates the enum description in the schema. The remaining content is well-structured and front-loads the important scoping facts.

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 an 8-parameter mutation with no output schema and nested `metadata`, the description covers the things an agent cannot infer: the billing schedule, the no-auto-debit payment model, and the duplicate-subscription error. Only the shape of the success response and the `split`/`metadata` semantics are left unaddressed.

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?

With 75% schema coverage the schema already documents most parameters, including the `collection_method` enum values almost verbatim as the description. The description does add real meaning about how `start_date` and `days_until_due` interact across periods, but it says nothing about `split`, `metadata`, or `idempotency_key`.

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 definition states a specific verb and resource ('Subscribe a customer to a plan') and immediately scopes it with billing-cycle mechanics. The distinction from siblings like cancel_subscription or get_subscription is obvious from the verb, though the description never names an alternative explicitly.

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 operational context: the subscription is never auto-debited (push payments), and it explains when to pick `invoice` versus `dedicated_account`. It also surfaces the blocking condition (one live subscription per plan, 409). It stops short of naming sibling alternatives such as create_invoice or create_checkout_session for one-off charges.

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

create_transferSend money from your available balanceA
DestructiveIdempotent

Send money from your available balance.

Send money from your available balance to any Nigerian bank account. Idempotency-Key is required: if the request times out, retry with the same key and you will get the original transfer, never a second one.

Resolve the account first with POST /api/v1/transfers/name-enquiry. The amount plus fees (total_debit) is reserved from your available balance immediately (400 insufficient_funds otherwise). The minimum transfer is ₦10.00 (400 amount_below_minimum) and narration is limited to 50 characters.

A transfer whose outcome isn’t known yet stays processing; it is never reported failed until it is confirmed. Listen for transfer.succeeded / transfer.failed. A failed transfer releases the reserved funds.

Money-out can be refused by your risk limits (403 risk_limit_exceeded), an operator hold (403 funds_on_hold), live-mode verification (403 compliance_verification_required) or transfers not being enabled for your account (403 transfers_disabled).

In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user.

Choose an idempotency_key and reuse it if you retry this call, so it can never happen twice.

NameRequiredDescriptionDefault
amountYesAmount in kobo
currencyYes
metadataNo
narrationYesShown on the recipient's statement (at most 50 characters)
referenceYes
beneficiaryYes
idempotency_keyYesRequired. A unique key you choose for this request (for example a UUID). If you retry, send the SAME key: the API returns the original result instead of acting twice.

TDQS

A4.2/5.0
Behavior5/5

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

Far beyond the annotations, it discloses idempotency-Key retry semantics, immediate reservation of amount plus fees with an insufficient_funds error, the ₦10 minimum and 50-character narration cap, the never-failed-until-confirmed status model with transfer.succeeded/transfer.failed events, and the full set of 403 refusal reasons. This is exactly the operational context an agent needs before an irreversible money movement.

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?

Front-loaded with the action and the idempotency requirement, then layered with reservation, status, and error details in scannable paragraphs. The final sentence restates idempotency_key guidance already given twice, which is slight redundancy against an otherwise dense, purposeful text.

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 destructive, open-world mutation with seven parameters and no output schema, the description covers funds flow, failure semantics, event notifications, and error codes well. It never describes the shape of the returned transfer object (fields besides status), which is the main remaining ambiguity given the absent output schema.

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 coverage is only 43%, but the description compensates for the critical fields: it clarifies amount is in kobo with a minimum, ties narration to its 50-character limit, and explains idempotency_key semantics. It leaves reference and metadata behavior to the schema, which is acceptable since those are self-explanatory.

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?

It states a concrete action and resource: sending money from available balance to any Nigerian bank account, with scope (funds held in balance) that separates it from read siblings like list_transfers. It does not explicitly distinguish itself from the other money-movement sibling, create_payment, so the agent must infer which of the two write tools to reach for.

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 clear preconditions: resolve the account first via name-enquiry, confirm exact amount in kobo and destination with the user, and note live mode sends real money. It never names an alternative tool (e.g. that simulate_transfer exists for sandbox) or states when not to use this, but the context for correct invocation is strong.

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

create_virtual_accountCreate a virtual accountA

Create a virtual account.

Create a virtual account (a real NUBAN that routes into your balance).

Dedicated (type: dedicated, needs customer_id): a permanent account for one customer. Every transfer into it creates a succeeded payment with source: dedicated_virtual_account, whatever the amount. Close it when you no longer want to receive money through it.

Dynamic (type: dynamic, needs amount and reference): a single-use account for one exact amount. This is the same as creating a payment with POST /api/v1/payments; the response is the account, and the payment id is in payment.

NameRequiredDescriptionDefault
typeYesdedicated: permanent account for a customer. dynamic: single-use account bound to one payment.
amountNoDynamic only: amount in kobo
currencyNoDynamic only
metadataNo
referenceNoDynamic only: your unique payment reference
expires_atNoDynamic only
customer_idNoCustomer id (cus_…). Required for dedicated accounts.
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false), and the description adds real substance: dedicated accounts generate a `succeeded` payment with `source: dedicated_virtual_account` on every inbound transfer, and dynamic accounts are consumed by a single payment. It also surfaces the idempotency_key retry semantics ("retrying with the same key returns the original result"), which usefully nuances the idempotentHint=false annotation rather than contradicting it. It stops short of describing failure modes, limits, or whether created accounts can be deleted vs only closed.

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?

Front-loaded and well structured, with bolded mode labels that make scanning easy. The only waste is the opening "Create a virtual account." fragment, which restates the title and is immediately repeated by the full first sentence.

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?

With 8 parameters, a nested metadata object, conditional requirements, and no output schema, the description supplies exactly what is otherwise missing: mode-specific required fields and, for the dynamic case, what the return value contains (the account plus the payment id in `payment`). The only unchecked box is that return shape for dedicated accounts is left implicit.

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 coverage is already high (88%), so the baseline is 3, but the description adds genuinely new constraints: it states `customer_id` is needed for dedicated and `amount` + `reference` are needed for dynamic, which the schema does not mark as conditionally required (only `type` is in the required list). That conditional-required mapping is the most valuable thing it could add, so it earns above baseline.

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?

"Create a virtual account (a real NUBAN that routes into your balance)" states a specific verb and resource and defines the domain term inline. It then splits the tool into its two supported modes (dedicated vs dynamic) and even names the equivalent sibling endpoint (`POST /api/v1/payments`) for the dynamic case, so an agent can distinguish it from create_payment and create_customer.

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?

Clear selection guidance between the two types: dedicated is a permanent per-customer account, dynamic is a single-use account for one exact amount, and dynamic is functionally equivalent to create_payment. It also implies the closing path ("Close it when you no longer want to receive money"), pointing at close_virtual_account. No explicit exclusions or prerequisites (auth/scope, sandbox behavior) are stated, keeping it below a 5.

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

create_webhook_endpointRegister a webhook endpoint. The signing secret is returned only in this response.A

Register a webhook endpoint. The signing secret is returned only in this response.

Register a publicly reachable endpoint to receive events (https is required for live mode; private network addresses are refused). Subscribe to specific enabled_events or * for all. The signing secret (whsec_…) is returned only in this response: store it to verify X-PletoPay-Signature. You can have up to 16 endpoints per mode (400 webhook_endpoint_limit_reached).

NameRequiredDescriptionDefault
urlYes
descriptionNo
enabled_eventsYes
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

A4.5/5.0
Behavior5/5

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

The description adds substantial behavior beyond the annotations: public reachability is required, HTTPS is mandatory in live mode, private network addresses are refused, and the signing secret appears only in the creation response. It also explains how the secret is used, discloses the 16-endpoint-per-mode limit, and supplies the exact quota error.

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 important operational constraints are front-loaded and expressed compactly. Repeating the title's opening and then restating the one-time-secret warning introduces noticeable redundancy, preventing a perfect conciseness score.

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?

Despite the absence of an output schema, the description discloses the most important response behavior: the `whsec_…` secret is available only once and must be stored for signature verification. Combined with the schema, it covers required inputs, event selection, idempotent retries, endpoint validation, limits, and a relevant failure mode, which is sufficient for correct invocation and result handling.

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

Parameters5/5

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

With only 25% schema description coverage, the description compensates well by explaining the reachability and protocol constraints on `url` and the wildcard behavior of `enabled_events`. Together with the schema's event enum and idempotency-key documentation, this gives the agent enough meaning to populate all consequential parameters correctly.

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 states the verb and resource: registering a publicly reachable webhook endpoint to receive subscribed events. It does not explicitly contrast creation with siblings such as update_webhook_endpoint, test_webhook_endpoint, or rotate_webhook_secret, so sibling differentiation remains implicit.

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 usage context: create an endpoint to receive either selected events or all events using `*`. However, it gives no explicit when-not guidance or alternatives, such as updating an existing endpoint or rotating the secret of one already created.

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

delete_webhook_endpointDelete a webhook endpoint (deliveries stop; history is kept)B
DestructiveIdempotent

Delete a webhook endpoint (deliveries stop; history is kept).

Delete a webhook endpoint. Deliveries to it stop; its delivery history is kept.

NameRequiredDescriptionDefault
idYesThe webhook endpoint id (`we_…`).

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered structurally. The description adds real value beyond that by stating two consequences the annotations cannot express: deliveries stop and delivery history is retained rather than purged.

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

Conciseness2/5

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

The content is short but entirely duplicated: the title repeats the sentence and the description then restates it twice. The same clause ("deliveries stop; history is kept") appears three times across title and body, wasting the agent's attention.

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 destructive tool with rich annotations and no output schema, the coverage is nearly adequate — the side effects are stated. It stops short of noting what happens on an unknown or already-deleted id, which matters for an idempotent delete.

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

Parameters3/5

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

Schema description coverage is 100% and the single `id` parameter is documented in the schema with the `we_…` prefix hint. The description adds no meaning about the identifier beyond what the schema already provides, so the baseline applies.

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 names a specific verb and resource ("Delete a webhook endpoint"), so an agent can identify the operation immediately. It doesn't differentiate from nearby siblings like update_webhook_endpoint or list_endpoint_deliveries, but the delete semantics are unambiguous.

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

Usage Guidelines2/5

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

There is no guidance on when to delete versus update or leave an endpoint inactive, and no mention of prerequisites such as confirming the endpoint id. The only usage-adjacent statement is the consequence that deliveries stop.

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

download_reportDownload a finished report (CSV)A
Read-onlyIdempotent

Download a finished report (CSV).

Download a finished report as CSV. The X-Content-SHA256 response header carries the file’s hash (it matches the report’s sha256). A report still generating returns 409 report_not_ready; an expired file returns 409 report_expired.

NameRequiredDescriptionDefault
idYesThe report id (`rpt_…`).

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive behavior, so the bar is lower, and the description still adds real operational detail: the X-Content-SHA256 response header for integrity verification and the two concrete failure modes with status codes (409 report_not_ready, 409 report_expired). It does not say what the body looks like on failure or how long before expiry, but the added context is well beyond the annotations.

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

Conciseness3/5

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

The content is front-loaded and short, but the first line duplicates the title verbatim and the second sentence restates it a third time ('Download a finished report as CSV'). The error-state and header information is valuable; the repeated framing is not.

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 single-parameter read tool with no output schema, the description covers the essential behavior an agent needs: the returned payload is CSV, the hash is available in a header for verification, and both blocking conditions return 409. Only minor gaps remain, such as whether the hash header is mandatory or how long an expired report retained.

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

Parameters3/5

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

Schema coverage is 100%, so the single `id` parameter is already documented as `rpt_…`; the description adds nothing about the identifier's meaning beyond implying it must reference a completed report. Baseline 3 is appropriate when the schema carries the parameter documentation.

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 gives a specific verb and resource ('Download a finished report as CSV'), which clearly separates the file-fetch action from metadata siblings like get_report and list_reports. It stops short of naming those siblings explicitly, so the differentiation is inferable rather than stated.

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 word 'finished' plus the two 409 cases implies the precondition (report must be completed before download) and tells the agent what happens otherwise. There is no explicit routing guidance such as 'use get_report for metadata, this tool for bytes', leaving the agent to infer the boundary with get_report and create_report.

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

expire_checkout_sessionExpire an open checkout sessionA
Destructive

Expire an open checkout session.

Expire an open checkout session so the customer can no longer pay through it. A session that is already complete or expired returns 409.

NameRequiredDescriptionDefault
idYesThe checkout session id (`cs_…`).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false. The description adds real value beyond them: the business effect (customer can no longer pay) and the error semantics (409 when the session is already complete or expired), which tells the agent how to handle a repeat call or a stale id. It does not say what is returned on success, but annotations carry the safety profile.

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?

Two short sentences, front-loaded with the action and immediately followed by the effect and the 409 edge case. The opening sentence merely restates the title and tool name, which is the only wasted line.

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 single-parameter mutation tool with no output schema, the description covers effect, precondition and error case, and annotations cover the safety profile. The remaining gap is the success response shape, which is minor but non-trivial for an agent needing to confirm the expire succeeded.

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

Parameters3/5

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

Schema description coverage is 100% and the only parameter 'id' is documented in-schema as the checkout session id with the `cs_…` prefix. The description adds no further meaning about the id, so the schema does all the work and baseline 3 applies.

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

Purpose5/5

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

The description states a specific verb ('Expire') and resource ('an open checkout session'), which cleanly separates it from the many read/create checkout-session siblings such as get_checkout_session, list_checkout_sessions and create_checkout_session. No other sibling performs this operation, so an agent can route to it without opening the schema.

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 the operative context — 'so the customer can no longer pay through it' — and an implicit precondition that the session must still be open, since already-complete or expired sessions return 409. It does not explicitly contrast with alternatives (e.g. leaving a session to naturally expire), so it stops short of full when/when-not guidance.

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

finalize_invoiceFinalize an invoiceA

Finalize an invoice.

Finalize a draft invoice: it gets its number, the amounts are frozen, and hosted_invoice_url becomes a payable page to send to your customer. A zero total or a past due date can’t be finalized.

NameRequiredDescriptionDefault
idYesThe invoice id (`inv_…`).

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-destructive, non-idempotent mutation. The description goes beyond them by naming what actually changes (number assigned, amounts frozen, payable URL exposed) and by disclosing two failure conditions: zero total or a past due date. It stops short of saying what happens on a repeated call or what permissions are needed, so a 4 rather than 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.

Conciseness4/5

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

Two short paragraphs with the operative effects front-loaded and the blocking conditions placed last where they are easy to scan. The opening sentence restates the title verbatim and earns nothing, which is the main deduction.

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 mutation with full annotation coverage, the definition supplies what an agent needs: the required state (draft), the observable effects, and the two conditions that cause failure. The absence of any note on the response shape is a minor gap, since there is no output schema to fall back on.

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

Parameters3/5

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

Schema coverage is 100% and the single `id` parameter is fully documented as the `inv_…` identifier, so the schema carries the load. The description adds only the implicit constraint that the referenced invoice must be a draft; it gives no further detail on the id's form or accepted sources. Baseline 3 is appropriate.

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 ("Finalize a draft invoice") and enumerates the concrete effects: it gets its number, amounts freeze, and `hosted_invoice_url` becomes a payable page. That is far more specific than the title. It does not explicitly distinguish itself from nearby siblings like void_invoice or mark_invoice_uncollectible, which is the only thing keeping it off 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 description implies usage via preconditions -- the invoice must be a draft, have a non-zero total, and not be past due -- which tells an agent when the call will succeed. However, it never states when to choose this over update_invoice, void_invoice, or mark_invoice_uncollectible, so the alternative-selection guidance is left to inference.

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

get_balanceRetrieve your balancesB
Read-onlyIdempotent

Retrieve your balances.

Your balances in this mode, computed from the double-entry ledger:

  • available: can be sent as transfers, refunds or settlements.

  • pending: received but not yet available.

  • held: on hold.

  • unapplied: received money under review.

  • settling: reserved by an open settlement.

  • total: the sum of the above. settled_total: the lifetime amount paid out by completed settlements.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is fully covered structurally. The description adds meaningful context by disclosing that values come from a double-entry ledger and defining each balance category, but it says nothing about freshness, caching, currency, or snapshot timing for a read tool whose whole value is numeric accuracy.

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?

Front-loaded with the core statement followed by a compact, scannable definition list for each balance field. The opening line largely repeats the tool title, which is a small redundancy, but the rest is dense and earns its space.

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?

With no output schema, the field-by-field definitions are exactly the compensation needed, and the returned shape is now inferable. Remaining gaps are minor: it does not say whether balances are per-currency or aggregated, or how the 'total' interacts with 'settled_total' across currencies.

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?

Zero parameters, so the baseline is 4 and there is nothing further to document. The schema is closed with additionalProperties=false, which the description does not need to restate.

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 ('Retrieve your balances') and scopes it to 'this mode', implying account-level rather than subaccount balances. It never names the nearby sibling get_subaccount_balance, so an agent must infer the distinction rather than being told it.

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 explicit when-to-use or when-not-to-use guidance and no alternative routing to get_subaccount_balance or get_settlement. The phrase 'in this mode' is the only contextual hint and is never explained.

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

get_checkout_sessionRetrieve a checkout sessionC
Read-onlyIdempotent

Retrieve a checkout session.

Retrieve a checkout session by id (cs_…).

NameRequiredDescriptionDefault
idYesThe checkout session id (`cs_…`).

TDQS

C2.5/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered elsewhere. The description adds nothing beyond that: no note on error behavior for expired or unknown sessions, no auth or scope requirements, no pagination or expansion concerns.

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

Conciseness2/5

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

The body is a near-verbatim restatement of the title followed by a second sentence that repeats the first with the id detail appended. Two sentences that say the same thing waste space rather than front-loading useful information.

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 read tool with full schema coverage and rich annotations, this is minimally sufficient to call correctly. It falls short of complete because the sibling disambiguation an agent needs at selection time is absent.

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

Parameters3/5

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

Schema coverage is 100% and the single 'id' parameter is documented in the schema with the same `cs_…` format. The description merely repeats that format, so it adds no meaning beyond the structured field; baseline 3 applies.

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

Purpose3/5

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

The description names a specific verb and resource ('Retrieve a checkout session') and the 'cs_…' prefix hints that lookup is by session id. However, it does not differentiate itself from the sibling get_checkout_session_by_reference, which is exactly the alternative an agent must choose between.

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 when-to-use or when-not-to-use guidance, and no prerequisites such as whether the session must be unexpired. The id-vs-reference distinction with get_checkout_session_by_reference is left entirely implicit.

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

get_checkout_session_by_referenceRetrieve a checkout session by your referenceA
Read-onlyIdempotent

Retrieve a checkout session by your reference.

Retrieve a checkout session by the reference you gave when creating it (unique per mode). An unknown reference returns 404 resource_missing.

NameRequiredDescriptionDefault
referenceYesThe `reference` you gave the payment.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description still adds real behavioral value by disclosing the failure mode for an unknown reference ('404 resource_missing') and the 'unique per mode' scoping of references — information an agent cannot get from the annotations.

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?

Very short and front-loaded, with the 404 behavior placed immediately after the core statement. The opening sentence duplicates the title and the second sentence restates 'retrieve a checkout session by the reference', so a small amount of the text is redundant rather than additive.

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 single-parameter, read-only lookup with rich annotations and no output schema, the description covers what the tool does, the key semantics, and the not-found behavior. It is nearly sufficient; only the sibling alternative for ID-based lookup is absent.

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 coverage is 100% so the parameter's type and meaning are already documented. The description goes beyond that by clarifying the reference is the one supplied at creation and is unique per mode, which matters for constructing a valid lookup key across test/live modes.

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 ('Retrieve a checkout session') and qualifies it by lookup key ('by the reference you gave'), which separates it from the ID-based 'get_checkout_session' sibling. It stops short of naming that sibling explicitly, so the differentiation is inferable rather than stated.

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?

Usage is only implied: the agent must already hold the reference it supplied at creation time. There is no explicit when-to-use/when-not-to-use guidance and no pointer to 'get_checkout_session' for agents that only have the session ID, which is the most likely wrong-tool confusion among the siblings.

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

get_customerRetrieve a customerC
Read-onlyIdempotent

Retrieve a customer.

Retrieve a customer by id (cus_…).

NameRequiredDescriptionDefault
idYesThe customer id (`cus_…`).

TDQS

C2.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false, so the safety profile is fully covered. The description adds nothing beyond them — no note on error behavior for unknown ids, no mention of what is returned or whether the call is a hard lookup failure.

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

Conciseness3/5

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

It is short and front-loaded, but the two sentences say the same thing twice, so the second sentence does not earn its place. There is no wasted prose beyond that redundancy, but also no structure that helps the agent.

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 single-parameter read tool with rich annotations and a fully described schema, the definition is minimally adequate — the agent can call it correctly. It is not complete as a selector, since nothing in it helps an agent choose it over list_customers or get_customer-related siblings.

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

Parameters3/5

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

Schema description coverage is 100%, so the single `id` parameter is fully documented in the schema. The description only echoes the same `cus_…` format hint, adding no meaning beyond the structured fields; per the coverage rule this is baseline 3.

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

Purpose2/5

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

The description restates the title almost verbatim ('Retrieve a customer' / 'Retrieve a customer by id'), and the id format `cus_…` is already in the schema. The only added signal is 'by id', which weakly distinguishes it from list_customers, but the definition is effectively tautological.

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 on when to use this versus list_customers, get_customer-adjacent tools, or update_customer. The agent must infer the distinction from the tool name alone; there is no explicit when/when-not 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_docRead a Pletopay guideA
Read-onlyIdempotent

Returns one Pletopay guide as markdown, by its slug (from search_docs, or one of the listed slugs).

NameRequiredDescriptionDefault
slugYesThe guide, e.g. "transfers".

TDQS

A4/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, and closed-world behavior, so the safety profile is covered. The description adds genuinely new behavioral context by disclosing the return format ('as markdown'), which the annotations and schema do not convey.

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?

One sentence with zero filler, front-loading the return format and then the key, with the slug provenance in parentheses. Nothing is redundant or misplaced.

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?

With no output schema, the description correctly supplies the return format (markdown), and the enum makes failure modes moot. For a single-parameter read tool this is essentially complete, with only marginal room for more detail.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter is an enum with an example, so the schema already documents it fully. The description adds only that slugs can come from search_docs, which is minor incremental meaning above the schema baseline.

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 ('Returns one Pletopay guide as markdown') and identifies the lookup key ('by its slug'). It also points at the sibling search_docs as the source of slugs, which helps distinguish the read-one pattern from search, though it stops short of an explicit contrast statement.

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?

Clear implied usage: call this when you already have a slug, and obtain slugs either from search_docs or from the enumerated list. There is no explicit when-not guidance (e.g. 'do not use for listing'), but the routing to search_docs covers the main alternative.

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

get_eventRetrieve an eventC
Read-onlyIdempotent

Retrieve an event.

Retrieve an event by id (evt_…).

NameRequiredDescriptionDefault
idYesThe event id (`evt_…`).

TDQS

C2.9/5.0
Behavior2/5

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

The annotations already declare this as a safe, idempotent, read-only, closed-world operation. The description adds no meaningful behavioral context such as error behavior, permissions, or what retrieval returns; it only restates the id format already present in the schema.

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

Conciseness3/5

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

The description is short and front-loaded, but the second sentence largely repeats the first and duplicates information already in the schema. It is concise but somewhat redundant.

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 lookup, the definition is sufficient to invoke the tool correctly. However, with no output schema, it provides no context about the returned event data or failure cases.

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

Parameters3/5

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

Schema description coverage is 100%, so the id parameter is already documented. The description repeats the `evt_…` format but adds no further semantics beyond the schema.

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 states a specific verb and resource: retrieve an event by id. It is clear what the tool does, but it does not explicitly distinguish it from siblings such as list_events or replay_event.

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?

It implies use when an event id is available, but gives no explicit when-to-use guidance, prerequisites, or comparison with alternatives like list_events.

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

get_invoiceRetrieve an invoiceC
Read-onlyIdempotent

Retrieve an invoice.

Retrieve an invoice by id (inv_…).

NameRequiredDescriptionDefault
idYesThe invoice id (`inv_…`).

TDQS

C2.3/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds nothing beyond that — no statement about what is returned, what happens with a voided or nonexistent invoice, or any auth/rate considerations.

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

Conciseness3/5

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

The text is short and front-loaded, but it is effectively the same sentence twice, so the second sentence does not earn its place. Brevity here reflects under-specification rather than disciplined concision.

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 is a simple single-parameter read tool with rich annotations, but there is no output schema, so the description should at minimum sketch what a retrieved invoice contains. It also omits not-found behavior, leaving an agent with only the id format to go on.

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?

There is a single parameter with 100% schema description coverage, so the schema carries the semantics and the baseline is 3. The description's mention of the `inv_…` prefix duplicates the schema text rather than adding new meaning.

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

Purpose2/5

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

The description restates the title and name almost verbatim: 'Retrieve an invoice' followed by 'Retrieve an invoice by id.' It does not differentiate this from siblings such as list_invoices, update_invoice, or finalize_invoice, nor does it say what an invoice retrieval returns or what scope it covers.

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 when-to-use guidance, no mention of when to prefer list_invoices versus a single fetch, and no indication of prerequisites or failure conditions (e.g., unknown id). The only implied usage is that an id is required, which the schema already enforces.

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

get_paymentRetrieve (verify) a paymentA
Read-onlyIdempotent

Retrieve (verify) a payment.

Retrieve a payment by id (pay_…). This is the authoritative way to verify a payment server-side before you deliver value: check status is succeeded and amount_received is what you expect.

NameRequiredDescriptionDefault
idYesThe payment id (`pay_…`).
expandNoEmbed related objects instead of their ids. `customer` embeds the customer.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuine value beyond them by telling the agent this is the authoritative check and which returned fields to validate, though it says nothing about errors or not-found behavior.

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?

Two short, front-loaded sentences that are easy to scan. Minor waste: the first line repeats the title verbatim before the more useful second 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?

With no output schema, the description usefully names the return fields to validate (status, amount_received), which is the key missing piece for this tool. It omits any mention of the expand parameter's behavior, leaving a small gap.

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

Parameters3/5

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

Schema coverage is 100%, and the description only restates the id format already documented in the schema. The optional 'expand' parameter and its effect are not mentioned at all, so the description adds no meaning beyond the structured field.

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 states a specific verb and resource ('Retrieve a payment by id') and adds a purpose ('authoritative way to verify a payment server-side'). It does not, however, distinguish itself from the obvious sibling get_payment_by_reference, which an agent could easily confuse it with.

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 context for when to use it: server-side verification before delivering value, with concrete success criteria (status 'succeeded', amount_received matches expectation). It stops short of stating exclusions or pointing at get_payment_by_reference for reference-based lookups.

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

get_payment_by_referenceRetrieve (verify) a payment by your referenceA
Read-onlyIdempotent

Retrieve (verify) a payment by your reference.

Retrieve a payment by the reference you gave it. Useful when you stored your order id but not the Pletopay payment id.

NameRequiredDescriptionDefault
expandNoEmbed related objects instead of their ids. `customer` embeds the customer.
referenceYesThe `reference` you gave the payment.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds only the 'verify' framing, saying nothing about what happens when no payment matches the reference or whether the call errors versus returns empty — the main behavioral gap an agent would care about.

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?

Two short sentences with the lookup key front-loaded, but the opening restates the tool title near-verbatim and then repeats 'Retrieve a payment by the reference' again in the next sentence. Tightening to a single sentence would lose nothing.

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 two-parameter read-only lookup with no output schema, the description leaves the return value and the not-found behavior undescribed; an agent cannot tell whether a miss raises an error or returns null. What is present is accurate but thinner than the tool's surface warrants.

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

Parameters3/5

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

Schema description coverage is 100%, so both `reference` and `expand` are documented in the schema itself. The description repeats that the reference is one 'you gave it' but adds no format, length, or uniqueness constraints, and never mentions `expand` — which is acceptable under full schema coverage, hence the baseline 3.

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 names a specific verb and resource (retrieve a payment) plus the lookup key (your `reference`), and the second sentence implicitly contrasts with the by-id sibling by noting you may have stored an order id but not the Pletopay payment id. It never names `get_payment` explicitly, so the differentiation must be inferred from the sibling list rather than read directly.

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 clause 'useful when you stored your order id but not the Pletopay payment id' gives a concrete situation that selects this tool over the by-id alternative. It stops short of an explicit 'do not use when you have the payment id' instruction, so the routing cue is clear but not fully spelled out.

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

get_planRetrieve a planC
Read-onlyIdempotent

Retrieve a plan.

Retrieve a plan by id (plan_…).

NameRequiredDescriptionDefault
idYesThe plan id (`plan_…`).

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds nothing beyond that — no note on behavior for an unknown or malformed id, no indication of what a plan record comprises, and no environment/livemode caveats.

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

Conciseness3/5

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

It is short and front-loaded, but the second sentence is essentially a restatement of the first with the word "id" added. The duplication consumes half the text without advancing understanding.

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 single-parameter read tool with full schema coverage and rich annotations, the minimal description is close to sufficient. However, with no output schema, the agent gets no indication of what a retrieved plan contains (amount, interval, currency, active status), leaving a real gap.

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

Parameters3/5

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

Schema description coverage is 100% and the sole parameter already documents the `plan_…` id format. The description repeats the same prefix hint without adding meaning such as whether ids are reusable across livemode/test or what happens on a non-plan id.

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 states a specific verb and resource ("Retrieve a plan") and narrows it to a lookup by id, which is clearly distinct from create_plan, list_plans, and update_plan by name alone. It stops short of explicitly contrasting itself with list_plans or get_subscription, so it is clear but not fully sibling-differentiated.

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 on when to use this versus list_plans (to enumerate) or get_subscription (to resolve a subscription's plan). The only implied condition is that a plan id is known, which is restated from the schema rather than offered as usage guidance.

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

get_refundRetrieve a refundC
Read-onlyIdempotent

Retrieve a refund.

Retrieve a refund by id (re_…).

NameRequiredDescriptionDefault
idYesThe refund id (`re_…`).

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is fully covered. The description adds nothing beyond them — no note on behavior for an unknown or malformed id, and no indication of what a refund record contains. The only extra detail, the `re_…` id prefix, is already in the schema.

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

Conciseness3/5

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

Very short and front-loaded, but the first sentence is a verbatim duplicate of the title and the second sentence repeats the verb and resource again. Roughly half the text is redundant restatement rather than added information.

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 single-parameter read tool with full annotations, complete schema coverage, and no output schema, the definition is minimally sufficient to call correctly. It falls short of explaining the lookup-key distinction from its two closest siblings, which is the main open question an agent would have.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter is fully documented, so the baseline is 3. The description's mention of the `re_…` format merely restates the schema description and adds no new meaning such as a valid/invalid example or a partial-id capability.

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+resource ("Retrieve a refund") and qualifies the lookup as by id, which implicitly separates it from get_refund_by_reference and list_refunds among the siblings. It doesn't explicitly name those alternatives, but the lookup key is unambiguous.

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 on when to use this versus list_refunds (browse/unknown id) or get_refund_by_reference (lookup by external reference). The agent must infer the routing from the id argument alone.

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

get_refund_by_referenceRetrieve a refund by its referenceA
Read-onlyIdempotent

Retrieve a refund by its reference.

Retrieve a refund by its reference (unique per mode). A refund created without one is given a generated reference, returned in its reference field. An unknown reference returns 404 resource_missing.

NameRequiredDescriptionDefault
referenceYesThe `reference` you gave the payment.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive behavior, so the bar is lower; the description still adds value by stating that unknown references return `404 resource_missing` and that refunds created without a reference receive a generated one, which is exactly the kind of response-semantics detail annotations cannot carry.

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 lead sentence is front-loaded and the follow-up sentences each add a distinct fact (uniqueness, auto-generation, 404). The first sentence largely restates the title, a minor redundancy, but nothing else is wasted.

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 lookup with no output schema, the description covers what is looked up, what an unknown reference yields, and how references originate. The only missing piece is how this differs from `get_refund`, which would make the routing decision unambiguous.

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 coverage is 100% and the single parameter is documented, so the baseline is 3. The description goes beyond the schema by explaining that references are unique per mode and are auto-generated when omitted, which clarifies what a valid reference actually is.

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 gives a specific verb and resource ('Retrieve a refund by its `reference`'), which is more precise than the bare tool name. It does not, however, explicitly contrast with the sibling `get_refund`, so an agent must infer that one looks up by ID and this one by reference.

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?

Usage is only implied: the reference-based lookup is the natural choice when you hold a reference, and the 'unique per mode' note hints at scoping. There is no explicit when-to-use versus `get_refund`, no prerequisites, and no statement about mode requirements.

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

get_reportRetrieve a reportC
Read-onlyIdempotent

Retrieve a report.

Retrieve a report by id (rpt_…).

NameRequiredDescriptionDefault
idYesThe report id (`rpt_…`).

TDQS

C2.6/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds nothing beyond that, omitting what happens on an unknown id, whether the report must be finalized before retrieval, or any auth scoping.

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

Conciseness3/5

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

Very short and front-loaded, but the opening sentence is fully redundant with the second. The id-format detail could have been spent instead on disambiguating this tool from its closest sibling.

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 read tool with full schema coverage and a complete annotation set, the description is minimally sufficient to invoke correctly. It is not sufficient to choose correctly among the several other report- and statement-reading siblings.

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

Parameters3/5

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

Schema description coverage is 100% and the single id parameter is already documented with its `rpt_…` format. The description repeats that format without adding constraints such as case sensitivity or cross-account validity, so it neither helps nor hurts.

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

Purpose3/5

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

States a specific verb and resource (retrieve a report by id) but the second sentence merely restates the first with the id prefix added. It gives no differentiation from plausible siblings such as download_report, get_statement, or list_reports, so an agent cannot tell from the text alone which retrieval tool fits.

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 when-to-use guidance, no mention of prerequisites, and no named alternative. The description never explains why an agent would call get_report rather than download_report or list_reports, leaving selection entirely to inference from tool names.

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

get_risk_limitsYour effective risk limits (kobo; 0 = no limit)B
Read-onlyIdempotent

Your effective risk limits (kobo; 0 = no limit).

Your effective risk limits in this mode, in kobo (0 = no limit). Transfers and refunds over a limit are refused with 403 risk_limit_exceeded; received payments over high_value_payment are flagged, never refused.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond them: exceeding a limit causes transfers and refunds to be refused with `403 risk_limit_exceeded`, while received payments over `high_value_payment` are only flagged. That consequence detail materially helps an agent interpret results.

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

Conciseness3/5

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

The first sentence is a verbatim restatement of the title, and the second sentence repeats the unit and the '0 = no limit' rule already given. Only the final clause about 403 refusals and flagged high-value payments earns its place, so roughly half the text is 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?

With no output schema and no parameters, the description does not explain which named limits the response contains (transfer, refund, high_value_payment thresholds, etc.) or their structure. It covers the enforcement semantics well but leaves the return shape underspecified for a tool whose entire value is the returned values.

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 input schema has zero parameters, so there is nothing for the description to clarify; the baseline for a 0-param tool applies. The 'in this mode' phrasing usefully signals that results are scoped to the current API mode (e.g., sandbox vs live) without any argument being supplied.

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 states the resource ('Your effective risk limits in this mode, in kobo') and its unit, so an agent knows this is a read of applied limits rather than configured policies. It does not distinguish itself from sibling tools such as list_risk_events or set_customer_risk_status, leaving the agent to infer that this one returns current thresholds.

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 explicit when-to-use guidance, no mention of when not to use it, and no pointer to the alternative risk tools in the sibling list. The agent must infer that this is the read counterpart to set_customer_risk_status from the name alone.

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

get_settlementRetrieve a settlementA
Read-onlyIdempotent

Retrieve a settlement.

Retrieve a settlement by id (stl_…), including its fees and the payout transfer’s status.

NameRequiredDescriptionDefault
idYesThe settlement id (`stl_…`).

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description usefully adds that the response includes fee data and the payout transfer's status, which is real value given no output schema, but it says nothing about behavior for an unknown or malformed id.

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?

Two short, front-loaded sentences with no filler, though the opening 'Retrieve a settlement.' duplicates the title and the first clause of the following sentence, which is mild 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 one-parameter read tool with no output schema, the description covers what it returns (fees, payout transfer status), which compensates for the missing output schema. Only error/not-found behavior and pagination-free confirmation are absent, both minor here.

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

Parameters3/5

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

Schema coverage is 100% and the single param already documents the 'stl_…' format, so the description merely repeats it. Baseline 3 is appropriate since the schema carries the parameter semantics.

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 ('Retrieve a settlement by id') and adds the id prefix format and the payload contents (fees, payout transfer status). It does not name a sibling such as list_settlements or list_settlement_items as the way to obtain an id, so the boundary is only implied.

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?

Usage is implied by the 'by id (stl_…)' requirement – the agent infers it needs a settlement id already in hand – but there is no explicit when-to-use versus list_settlements/list_settlement_items, and no stated fallback when the id is unknown.

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

get_split_ruleRetrieve a split ruleB
Read-onlyIdempotent

Retrieve a split rule.

Retrieve a split rule by id (spl_…).

NameRequiredDescriptionDefault
idYesThe split rule id (`spl_…`).

TDQS

B3.1/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds nothing beyond them — no not-found/error behavior, no mention of what a returned rule contains, no rate-limit or permission context.

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

Conciseness3/5

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

It is short, but the first sentence duplicates the title and tool name verbatim while the second carries all the information. Roughly half the text is redundant, though nothing is verbose or poorly ordered.

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 getter with complete annotations and full schema coverage, the essentials are present. However, no output schema exists, so the description is the only place a return-shape hint could live, and it offers none.

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

Parameters3/5

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

Schema description coverage is 100% and the single `id` parameter is already documented as 'The split rule id (`spl_…`)'. The description only echoes that same prefix hint, adding no meaning beyond the schema, so the baseline of 3 applies.

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 second sentence states a specific verb and resource with the lookup key: 'Retrieve a split rule by id (`spl_…`)'. An agent can tell this is a single-object fetch, but nothing distinguishes it from siblings like list_split_rules or update_split_rule, and the opening sentence merely restates the title.

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?

There is no explicit when-to-use or when-not-to-use guidance and no named alternative. The phrase 'by id' weakly implies the prerequisite (you must already hold a `spl_…` id), which is only implied usage rather than stated routing guidance.

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

get_statementBalance statement: opening, credits, debits, closing per balanceB
Read-onlyIdempotent

Balance statement: opening, credits, debits, closing per balance.

Opening balance, credits, debits and closing balance for each of your balances over a period, computed from the ledger.

NameRequiredDescriptionDefault
period_endYesEnd of the period (exclusive, ISO 8601).
period_startYesStart of the period (inclusive, ISO 8601).

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare this as a read-only, idempotent, non-destructive, closed-world operation. The description adds only that figures are computed from the ledger and cover each balance over a period; it does not add auth, rate-limit, pagination, or output-shape detail beyond what annotations and schema provide.

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

Conciseness3/5

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

The definition is short and front-loaded, but the first sentence is essentially the title and the second repeats opening/credits/debits/closing while adding period and ledger context. It is redundant rather than efficiently informative.

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 read-only statement tool, the description identifies the returned components and the ledger basis, and the schema fully defines the two period parameters. It is adequate for invocation, though it would be stronger with a note on how it differs from get_balance.

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

Parameters3/5

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

Schema coverage is 100% and both period_start and period_end have inclusive/exclusive ISO 8601 descriptions. The description only says "over a period" and adds no format or boundary semantics beyond the schema, so this is a baseline 3.

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 states a specific resource (balance statement) and its components (opening, credits, debits, closing), scoped per balance over a period and computed from the ledger. It does not explicitly name or contrast sibling tools such as get_balance or list_transactions, so it earns a 4 rather than 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 Guidelines2/5

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

There is no explicit when-to-use guidance, no when-not-to-use guidance, and no named alternative. The period parameters imply a reporting use case, but the description leaves the choice versus get_balance or list_transactions to inference.

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

get_subaccountRetrieve a subaccountC
Read-onlyIdempotent

Retrieve a subaccount.

Retrieve a subaccount by id (sub_…).

NameRequiredDescriptionDefault
idYesThe subaccount id (`sub_…`).

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds nothing beyond that — no note on what is returned, what happens with an unknown or malformed id, or whether inactive subaccounts are retrievable.

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

Conciseness3/5

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

Very short, but the first sentence is a verbatim restatement of the title and the second largely duplicates the parameter schema. Roughly half the text is redundant rather than additive.

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 single-parameter read tool with rich annotations this is close to sufficient, but with no output schema the description could at least hint at what a subaccount object contains. It is minimally adequate rather than complete.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter's schema description already states the `sub_…` format, which the description merely repeats. Baseline 3 applies since the schema carries the parameter meaning.

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 second sentence gives a specific verb and resource ("Retrieve a subaccount by id") plus the id format, which is enough to identify the operation. It does not distinguish this from near-siblings such as get_subaccount_balance or get_virtual_account, 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 Guidelines2/5

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

There is no guidance on when to use this versus list_subaccounts, get_subaccount_balance, or get_virtual_account, and no prerequisites or error conditions mentioned. The agent must infer usage from the name alone.

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

get_subaccount_balanceA subaccount's balances (from the ledger)B
Read-onlyIdempotent

A subaccount's balances (from the ledger).

A subaccount’s pending, available and settling balances, read from the ledger.

NameRequiredDescriptionDefault
idYesThe subaccount id (`sub_…`).

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety and repeatability are covered. The description adds value beyond them by disclosing the content of the read — pending, available and settling balances sourced from the ledger — which matters because there is no output schema to reveal 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.

Conciseness3/5

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

It is short and front-loaded, but the first sentence is a near-verbatim restatement of the title, and 'from the ledger' appears twice in two sentences. Roughly half the text is redundant repetition rather than new information.

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 read tool with no output schema, the definition covers what is read and from where, which is the minimum an agent needs. It still omits the distinction from the sibling get_balance and any note on balance freshness or currency, leaving a gap on the main selection decision.

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

Parameters3/5

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

Schema description coverage is 100% and the single `id` parameter is documented as the subaccount id with the `sub_…` prefix pattern. The description adds no further parameter meaning such as where to obtain the id or whether a non-subaccount id errors, so the schema does all the work.

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 (read) and resource (a subaccount's pending, available and settling balances) and notes the ledger as the source, so the agent can tell it returns balance figures for one subaccount. It does not name or distinguish itself from the sibling get_balance, which is likely the account-level counterpart, so the differentiation is left implicit.

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 explicit when-to-use guidance: nothing says to call this for a `sub_…` id versus get_balance for the top-level account, nor any prerequisite (e.g., the subaccount must exist or be active). Usage is only inferable from the resource name and the required `id` parameter.

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

get_subscriptionRetrieve a subscriptionC
Read-onlyIdempotent

Retrieve a subscription.

Retrieve a subscription by id (sbs_…).

NameRequiredDescriptionDefault
idYesThe subscription id (`sbs_…`).

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered without the description. The description adds nothing beyond that — no error/not-found behavior, no note on whether the subscription is returned live or cached, no auth expectations.

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

Conciseness3/5

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

It is short, but the second sentence repeats the first almost verbatim, so the only new information is the `sbs_…` prefix, which is already in the schema. Two sentences where one would have done.

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 single-parameter read-only getter with full annotation coverage, complete schema documentation, and no output schema, very little is required of the description. It would be improved by noting not-found behavior, but nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the single `id` parameter is documented with the same `sbs_…` format hint. The description repeats rather than extends the schema, so the baseline of 3 is correct.

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

Purpose3/5

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

It says 'Retrieve a subscription by id' — a verb plus resource, and the `sbs_…` prefix signals the id namespace. However, it largely restates the name and title, and gives no way to distinguish it from siblings such as list_subscriptions or get_subaccount beyond the obvious read-one-vs-list-many distinction the name already implies.

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 when-to-use guidance at all: no statement of when a single-subscription fetch is appropriate versus list_subscriptions or get_customer, no prerequisites, and no mention of what to do when the id is unknown.

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

get_transferRetrieve a transferC
Read-onlyIdempotent

Retrieve a transfer.

Retrieve a transfer by id (trf_…).

NameRequiredDescriptionDefault
idYesThe transfer id (`trf_…`).

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds nothing beyond that — no mention of not-found behavior, error semantics, or what a retrieved transfer contains. It is pure restatement.

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

Conciseness3/5

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

Very short and front-loaded, but the first line duplicates the title verbatim and earns nothing; only the id-format clause carries information, and even that is redundant. Brevity here comes from under-specification rather than discipline.

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 single-parameter read tool with rich annotations and full schema coverage, the bar is low and the definition is barely adequate. It omits any hint about failure modes or the relationship to the reference-based sibling, which is the one genuinely useful thing it could have said.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter documents the `trf_…` format itself. The description repeats that same prefix, adding no syntax, validation, or identifier-source detail beyond the schema. Baseline 3 applies.

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

Purpose3/5

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

States a specific verb and resource ('Retrieve a transfer') and notes it works by id, which implicitly separates it from get_transfer_by_reference. However, the first sentence only restates the title, and no sibling is named, so the differentiation is inferred rather than stated.

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 'by id (`trf_…`)' phrasing implies the condition for choosing this over get_transfer_by_reference, but the alternative is never named and no when-not guidance is given. Usage is left to inference.

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

get_transfer_by_referenceRetrieve a transfer by your referenceA
Read-onlyIdempotent

Retrieve a transfer by your reference.

Retrieve a transfer by the reference you gave when sending it. References are unique per mode, so this is a safe way to check a transfer after a timeout when you never received its id. An unknown reference returns 404 resource_missing.

NameRequiredDescriptionDefault
referenceYesThe `reference` you gave the payment.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive semantics, and the description adds real value beyond them: references are unique per mode, and an unknown reference yields `404 resource_missing`. It does not describe the returned object, but no output schema exists and the error contract is the more useful 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 short sentences, front-loaded with the action, then the safety rationale and error behavior. Nothing is repeated and nothing is superfluous.

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 single-parameter read tool with full annotation coverage and no output schema, the description covers purpose, selection rationale, and failure behavior. Only the shape of a successful response is left implicit, which is acceptable here.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter is already documented. The description adds one meaningful nuance, that uniqueness is scoped per mode, but no format or length constraints beyond that. Baseline 3 is appropriate.

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 gives a specific verb and resource ('Retrieve a transfer') and immediately narrows the lookup key to 'the reference you gave when sending it', which cleanly separates it from the id-based get_transfer sibling without naming it.

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 states a concrete situation for use: checking a transfer after a timeout when you never received its id. There is no explicit when-not or named alternative (get_transfer), but the scenario described is enough to route an agent correctly.

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

get_virtual_accountRetrieve a virtual accountC
Read-onlyIdempotent

Retrieve a virtual account.

Retrieve a virtual account by id (va_…).

NameRequiredDescriptionDefault
idYesThe virtual account id (`va_…`).

TDQS

C2.6/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the entire behavioral profile is supplied structurally. The description adds nothing beyond that — no note on error behavior for unknown ids, no indication of what the account object contains.

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

Conciseness3/5

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

It is short, but the second sentence restates the first with only the id format added, so a third of the text is redundant. Front-loading is fine but there is little substance to front-load.

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 read-only getter with full schema and annotation coverage, this is minimally adequate. However, there is no output schema and the description never indicates what a virtual account record includes, so an agent cannot anticipate the response.

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

Parameters3/5

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

Schema coverage is 100% and the single `id` parameter is already documented in the schema with the same `va_…` format note. The description merely repeats it, so the baseline 3 applies.

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

Purpose3/5

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

The description states a specific verb and resource ("Retrieve a virtual account") and hints at the id form (`va_…`), which slightly separates it from get_virtual_account_by_reference. But it largely restates the tool name and title, and never distinguishes it from list_virtual_accounts or the by-reference sibling in terms of when each applies.

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 when-to-use guidance, no prerequisites, and no mention of alternatives such as get_virtual_account_by_reference or list_virtual_accounts. An agent must infer that this is the id-based lookup purely from the name.

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

get_virtual_account_by_referenceRetrieve a dynamic virtual account by your referenceA
Read-onlyIdempotent

Retrieve a dynamic virtual account by your reference.

Retrieve a dynamic virtual account by the reference you gave when creating it (the same reference as its payment). Dedicated accounts have no reference: retrieve them by id, or list them with customer. An unknown reference returns 404 resource_missing.

NameRequiredDescriptionDefault
referenceYesThe `reference` you gave the payment.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world behavior, so the safety profile is covered. The description still adds real value by disclosing the failure mode: an unknown reference yields 404 resource_missing. It stops short of describing the returned object's shape, but the error contract is the main behavioral gap an agent needs.

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 content is front-loaded and tightly written: identity of the tool, its precondition, its exclusion, and its error case in two short sentences. The opening line largely restates the title, which is the only wasted wording.

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 lookup with full annotation coverage, the description supplies everything needed to choose and call it, including the 404 case. The only minor omission is that no output schema exists and the description says nothing about what the returned account object contains.

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

Parameters3/5

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

Schema description coverage is 100%, so the single parameter is already documented. The description reinforces that the reference is the one given at creation and is the same as the associated payment's reference, which clarifies provenance but adds little beyond the schema text.

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 and resource ("Retrieve a dynamic virtual account"), and crucially scopes it to dynamic accounts retrieved by reference. It explicitly contrasts this with dedicated accounts, which have no reference, and points to the id/list alternatives, so an agent can distinguish it from get_virtual_account without opening either schema.

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

Usage Guidelines5/5

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

It states the exact precondition (a reference you supplied at creation time) and an explicit exclusion: dedicated accounts have no reference and must be fetched by id or listed by customer. That is a genuine when-to-use / when-not-to-use rule plus the fallback path.

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

get_webhook_endpointRetrieve a webhook endpointC
Read-onlyIdempotent

Retrieve a webhook endpoint.

Retrieve a webhook endpoint by id (we_…).

NameRequiredDescriptionDefault
idYesThe webhook endpoint id (`we_…`).

TDQS

C2.6/5.0
Behavior2/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds no behavioral context at all — nothing about failure modes for an unknown id, whether secrets are masked in the response, 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.

Conciseness3/5

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

The description is short, but it is effectively one sentence duplicated: "Retrieve a webhook endpoint" then "Retrieve a webhook endpoint by id (`we_…`)." The repetition wastes the little space available and the id-prefix detail is already in 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?

For a one-parameter, read-only lookup with rich annotations, this is minimally sufficient to invoke the tool correctly. With no output schema, though, the description could reasonably have said what a webhook endpoint object returns (URL, status, enabled events), and it omits that entirely.

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

Parameters3/5

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

Schema coverage is 100% and the single `id` parameter is documented with the same `we_…` prefix format. The description merely restates that format, adding no meaning beyond the schema, so the baseline of 3 applies.

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

Purpose3/5

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

The description states a specific verb and resource ("Retrieve a webhook endpoint") and the lookup key (id `we_…`), so the basic action is unambiguous. However, it does not distinguish this from the many sibling retrieval tools, notably list_webhook_endpoints or test_webhook_endpoint, so an agent gets no help telling them apart beyond the name.

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 on when to use this versus list_webhook_endpoints (when the id is unknown) or test_webhook_endpoint. The only implicit signal is the id parameter, which the schema already provides.

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

list_banksList supported banksA
Read-onlyIdempotent

List supported banks.

List the banks you can send transfers to, with the code to use as bank_code. The list is cached for an hour.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds a genuinely new behavioral fact beyond the annotations: the list is cached for an hour, which tells the agent results may be stale and that repeated calls are cheap. It does not mention ordering or full page-size behavior, but for a closed static list that is minor.

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, the purpose front-loaded, followed by the practical payoff (which field to reuse) and the caching caveat. No redundant phrasing or filler.

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, annotation-rich lookup with no output schema, the description covers purpose, the key returned field, and a caching caveat. It stops short of describing the other returned attributes (e.g., the human-readable bank name) or the ordering of results, which is the only remaining gap.

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 takes zero parameters, so the baseline is 4. The description goes slightly beyond by explaining that the returned 'code' field is what should be passed as 'bank_code' elsewhere, adding downstream meaning rather than restating the schema.

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 ('List supported banks') and immediately qualifies the scope: the banks you can send transfers to. No sibling tool in the list does bank enumeration, so the resource is unambiguous and the purpose is fully identifiable.

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?

Usage is only implied: the agent can infer it should call this before create_transfer to obtain a bank_code. There is no explicit statement of when to use this versus alternatives (e.g., resolve_account for resolving a specific account, or list_sandbox_test_values for test data) and no exclusions or prerequisites.

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

list_checkout_sessionsList checkout sessionsC
Read-onlyIdempotent

List checkout sessions.

List checkout sessions. Filter by status or by the payment_link that started them.

NameRequiredDescriptionDefault
limitNoNumber of objects to return
statusNoOnly objects with this status.
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
payment_linkNoOnly sessions started from this payment link (plink_…)
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds nothing on top: no mention of default page size, cursor-based pagination behavior, or how results are ordered, even though both cursor parameters exist in the schema.

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

Conciseness3/5

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

The description opens by repeating its own first sentence verbatim, which is pure waste. The remaining sentence is tight, but the duplication means it is not front-loaded cleanly.

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 six parameters, a nested date-range object, and cursor pagination but no output schema, the description should at least explain paging and default result size. It covers only two of the six filters and says nothing about the returned collection shape.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters, including the nested created range object and the two cursors, are already documented in the schema. The description restates the status and payment_link filters without adding format, interaction, or default semantics beyond that baseline.

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?

Names a specific verb and resource ('List checkout sessions'), so an agent immediately knows the operation. However, it does not differentiate itself from siblings like get_checkout_session, create_checkout_session, or expire_checkout_session, which would have raised this to 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 Guidelines2/5

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

The description offers no when-to-use guidance or exclusions relative to the sibling read tools (get_checkout_session, get_checkout_session_by_reference). The mention of filtering by status or payment_link is parameter guidance, not selection guidance.

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

list_customersList customersB
Read-onlyIdempotent

List customers.

List your customers. Filter by email to find a customer you created earlier.

NameRequiredDescriptionDefault
emailNoOnly the customer with this email.
limitNoNumber of objects to return
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

B3.3/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds essentially nothing beyond that: no mention of default page size, pagination semantics, ordering, or what a response looks like, so it does not enrich the behavioral picture.

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?

It is short and front-loaded, but the first two sentences ('List customers.' / 'List your customers.') are redundant restatements of the name, so there is minor wasted space.

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 read-only collection tool with full schema documentation and no output schema, the description covers the core purpose and the primary filter use case. Gaps around pagination behavior and return shape are real but modest given the annotation and schema richness.

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

Parameters3/5

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

Schema description coverage is 100%, including the nested created date filter and both cursors, so the schema fully documents all five parameters. The description's email mention is consistent but adds no syntax or meaning beyond what the schema already provides, making the baseline 3 appropriate.

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 states a specific verb and resource ('List customers'), which is enough to distinguish it from the many payment, invoice, and subscription list tools. It does not, however, differentiate itself from its closest sibling get_customer, so an agent must infer that this returns a collection rather than a single object.

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?

'Filter by email to find a customer you created earlier' gives an implied when-to-use for the email filter, but there is no explicit guidance on when to prefer this over get_customer or why one would page through customers. The usage context is present but thin.

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

list_endpoint_deliveriesDeliveries to this endpointB
Read-onlyIdempotent

Deliveries to this endpoint.

Delivery attempts to this endpoint, with response status, error and timing. Filter by status.

NameRequiredDescriptionDefault
idYesThe webhook endpoint id (`we_…`).
limitNoNumber of objects to return
statusNoOnly objects with this status.
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare this a read-only, idempotent, non-destructive, closed-world operation, so the safety profile is covered. The description adds value by enumerating what each delivery record contains (status, error, timing), but says nothing about pagination behavior or how deep the delivery history goes. Adequate, not rich.

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

Conciseness3/5

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

The body is a tight two-clause sentence with the resource scope front-loaded, but the opening line 'Deliveries to this endpoint' duplicates the title verbatim and earns no space. Structure is otherwise clean with no filler.

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?

With six parameters, a nested object, and no output schema, the description does useful work by describing what a delivery record contains. However, it omits pagination guidance (cursor direction, default limit of 10) and the lifecycle meaning of pending/succeeded/failed/dead, which the enum alone does not explain.

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

Parameters3/5

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

Schema description coverage is 100%, including the nested created[gte]/[lt] filter and cursor semantics, so the baseline is 3. The description only restates the status filter and mentions no limit, cursor, or date-range behavior, adding essentially nothing beyond the schema.

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 names a specific resource ('delivery attempts to this endpoint') and states the returned fields (response status, error, timing), which is more concrete than the title alone. It implies scoping to a single webhook endpoint, distinguishing it from list_event_deliveries, but never explicitly contrasts the two siblings, 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 Guidelines2/5

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

'Filter by `status`' is the only usage hint; there is no statement of when to pick this tool over list_event_deliveries or when to follow up with replay_event. No prerequisites or exclusions are given, leaving the agent to infer the endpoint-vs-event distinction.

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

list_event_deliveriesDelivery history for an eventC
Read-onlyIdempotent

Delivery history for an event.

Every delivery of this event to your endpoints.

NameRequiredDescriptionDefault
idYesThe event id (`evt_…`).

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds no behavioral context beyond that — nothing about pagination, ordering, whether failed/retried attempts are included, or how far back history goes. It essentially restates the title, so credit above the minimum is not earned.

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

Conciseness3/5

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

It is short and front-loaded, but the second sentence largely repeats the first, only adding the 'to your endpoints' qualifier. Every sentence should earn its place, and here the redundancy costs it.

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 read-only list tool with one well-documented parameter and rich annotations, the definition is minimally adequate. However, without an output schema the description should at least hint at what a delivery record contains or whether results are paginated, and it does neither.

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?

With a single parameter and 100% schema description coverage, the schema already documents that id is the event id in evt_… format. The description adds no meaning about the identifier or any implied constraints, so the baseline of 3 applies.

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 states the resource (deliveries of an event) and implicitly the operation (history/list), and the second sentence clarifies that these are deliveries sent to the caller's webhook endpoints. It does not distinguish this from the sibling list_endpoint_deliveries, which covers a very similar surface from the endpoint side, so an agent must infer the difference.

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 on when to use this versus alternatives such as list_endpoint_deliveries, list_events, or get_event, nor any mention of prerequisites like needing an existing event id. The agent is left to guess the selection rule from the name alone.

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

list_eventsList eventsB
Read-onlyIdempotent

List events.

List events, the same objects delivered to your webhooks. Filter by type or by resource_id (e.g. a payment id) to see everything that happened to one object. Use it to catch up after downtime.

NameRequiredDescriptionDefault
typeNoOnly objects of this type.
limitNoNumber of objects to return
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
resource_idNoOnly events about this object (e.g. pay_…)
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and a closed-world profile, so safety needs no restating. The description adds the semantic link to webhook payloads and the backfill use case, but says nothing about ordering of results, how far back events are retained (critical for a 'catch up after downtime' tool), or rate limits. That retention gap is a real behavioral omission.

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

Conciseness3/5

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

The opening 'List events.' is a bare restatement of the name and title, consuming a line without adding information before the substantive sentence arrives. The remaining text is tight and front-loads the webhook-equivalence claim, but the redundant lead-in costs it a point.

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?

With six optional parameters, a nested date filter, an enum, and no output schema, the description should say more about what a result looks like and how to page through a large backlog. It covers the two main filters and the purpose but leaves ordering, retention, and the cursor-based traversal strategy unaddressed.

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

Parameters3/5

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

Schema description coverage is 100%, so the enum values, limit bounds, created[] operators, and cursor directions are all already documented. The description adds a little interpretation — that filtering by resource_id shows 'everything that happened to one object' — but gives no syntax hint for the type enum or the cursor workflow. Baseline 3 is appropriate.

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 gives a specific verb and resource and adds a useful identity claim: these are 'the same objects delivered to your webhooks,' which separates event records from the delivery records handled by list_event_deliveries. It does not, however, explicitly distinguish itself from get_event or list_event_deliveries by name, so an agent must infer the boundary from the sibling names alone.

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?

One concrete use case is offered — 'Use it to catch up after downtime' — which tells the agent this is a polling/backfill tool rather than a real-time mechanism. There is no guidance on when to prefer get_event for a single event, when list_event_deliveries is the right call, or what happens past the retention window, so alternatives are left implicit.

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

list_invoicesList invoicesB
Read-onlyIdempotent

List invoices.

List invoices. Filter by status, customer or the subscription that issued them.

NameRequiredDescriptionDefault
limitNoNumber of objects to return
statusNoOnly objects with this status.
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
customerNoCustomer (cus_…)
subscriptionNoInvoices issued by this subscription (sbs_…)
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds nothing beyond filtering surface—no mention of default page size (limit defaults to 10), result ordering, or cursor behavior, so it leaves behavioral gaps that annotation coverage only partly offsets.

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

Conciseness3/5

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

Very short, but the phrase "List invoices" is repeated verbatim in the title, first line, and second line, so a third of the content is pure duplication. Front-loading is fine; the redundancy is not.

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 read-only list tool with no output schema, the description is adequate but thin: it never mentions pagination via starting_after/ending_before, the created date-range object, or the default/max limit, all of which an agent must know to use it well.

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 100%, so baseline is 3; the description adds a useful gloss that the subscription filter selects invoices issued by that subscription (sbs_…). It still omits the created date-range filter and the cursor parameters, but the enum and format semantics are already carried by the schema.

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 ("List invoices") in the first line, which is enough to distinguish it from siblings like get_invoice or create_invoice. It does not explicitly contrast with those siblings, but the intent is unambiguous.

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 second sentence names which filters are available (status, customer, subscription), which implies how to narrow results. However, it gives no guidance on when to use this versus get_invoice or how to page through results, so usage is only implied.

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

list_paymentsList paymentsB
Read-onlyIdempotent

List payments.

List payments. Filter by status, customer, reference, virtual_account, amount received (amount[gte], amount[lte], in kobo) and creation time. Add expand[]=customer to embed the customer object.

NameRequiredDescriptionDefault
qNoSearch: a payment id (pay_…), reference (starts with), account number (starts with) or va_…, customer id (cus_…), email, phone or name (starts with), split rule id (spl_…), or the transfer reference or session id of the transfer that paid it
limitNoNumber of objects to return
amountNoAmount received (kobo), e.g. amount[gte]=100000
expandNoEmbed related objects instead of their ids. `customer` embeds the customer.
statusNoOnly objects with this status.
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
customerNoOnly objects of this customer (`cus_…`).
referenceNoOnly the payment with this reference.
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)
virtual_accountNoPayments into this virtual account (va_…)

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so safety behavior is covered. The description adds that amount values are in kobo and that expand[]=customer embeds the customer object, but it does not add pagination behavior, rate limits, or return-shape context beyond the schema.

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

Conciseness3/5

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

The description is short and front-loaded, but it redundantly repeats "List payments." as a standalone line and again in the next sentence. Apart from that duplication, the filter summary is dense and efficient.

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 an 11-parameter list endpoint with nested amount and created filters, the schema is fully documented and annotations cover the safety profile. The description mentions the main filters and expand behavior, but it omits q search, limit, pagination cursors, and return-value context, so it is adequate rather than complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 11 parameters. The description repeats key filters and the expand option but adds little syntax or meaning beyond the schema, and it omits mention of q, limit, and cursors that the schema documents.

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 ("List payments") and enumerates filter dimensions, making it clear this is a collection endpoint. It does not explicitly name sibling tools such as get_payment or get_payment_by_reference, but the name and filter summary distinguish it adequately.

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?

Usage is implied by the list semantics and by listing filterable fields, but there is no explicit when-to-use/when-not guidance or named alternative. An agent must infer that single-payment retrieval belongs to get_payment or get_payment_by_reference.

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

list_plansList plansC
Read-onlyIdempotent

List plans.

List your plans.

NameRequiredDescriptionDefault
limitNoNumber of objects to return
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

C2.3/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description contributes nothing beyond that: it does not mention the default limit of 10, the 100 max, cursor pagination semantics, or what the returned plan objects contain.

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

Conciseness3/5

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

The text is short and front-loaded, but the second sentence ("List your plans.") is a pure restatement of the first and earns no place. Brevity here reflects under-specification rather than disciplined editing.

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 list endpoint with four parameters including a nested date-range filter and cursor pagination, and with no output schema, the description should at least hint at return shape and pagination behavior. Neither is present, leaving the agent to infer everything from the schema alone.

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

Parameters3/5

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

Schema description coverage is 100%, with the limit bounds, the created[gt/lt/gte/lte] filter example, and both cursor fields documented in the schema itself. The description adds no meaning on top of that, so the baseline 3 applies.

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

Purpose2/5

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

"List plans. List your plans." restates the tool name and title without adding a specific scope, resource detail, or any differentiation from siblings such as get_plan or list_subscriptions. An agent learns only that it returns a collection of plan objects, which the name already conveyed.

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 on when to use this versus get_plan (single plan retrieval) or list_subscriptions (plans are typically fetched to attach to a subscription). No prerequisites, no exclusions, no context about what a "plan" is in this API.

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

list_refundsList refundsB
Read-onlyIdempotent

List refunds.

List refunds. Filter by payment to see the refunds of one payment.

NameRequiredDescriptionDefault
limitNoNumber of objects to return
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
paymentNoOnly refunds of this payment (pay_…)
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

B3.1/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds nothing behavioral beyond that: no mention of the default limit of 10, pagination via cursors, or the shape of the returned list, which is the context a calling agent would actually need.

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

Conciseness2/5

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

The description repeats "List refunds" verbatim in back-to-back sentences, wasting the most prominent position on pure duplication. The remaining content is a single useful clause, so the text is short but poorly structured rather than economical.

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, fully optional-parameter list endpoint with complete schema documentation, rich annotations, and no output schema, the definition contains enough to call it correctly. The missing pieces are pagination and default-limit behavior, which are minor for this tool's complexity but would still help 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 100%, so every parameter is already documented, including the `payment` filter, `created` date range, and both cursors. The description's note about `payment` largely restates what the schema says, so it neither compensates for a gap nor adds notable new meaning; the baseline of 3 applies.

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 plus resource ("List refunds"), which is unambiguous. It does not distinguish this tool from close siblings such as get_refund, get_refund_by_reference, or list_payments, 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 only usage cue is "Filter by `payment` to see the refunds of one payment," which implies when the filter is appropriate. There is no guidance on when to use this instead of get_refund for a single refund, or how it relates to list_payments.

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

list_reportsList reportsC
Read-onlyIdempotent

List reports.

List reports. Filter by type or status.

NameRequiredDescriptionDefault
typeNoOnly objects of this type.
limitNoNumber of objects to return
statusNoOnly objects with this status.
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

C2.3/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered structurally. The description adds nothing beyond that – no mention of default/maximum result counts, pagination behavior via cursors, or what a listing returns.

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

Conciseness3/5

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

It is short, but the first two sentences are an exact duplicate ('List reports.' repeated), which is wasted space rather than front-loading useful information. There is no unnecessary padding beyond that redundancy, but also no structure that helps an agent.

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 6-parameter tool with a nested date-range object, pagination cursors, and sibling tools like get_report and download_report, the description is far too thin. It omits report-vs-object scope, pagination guidance, and any differentiation from related report tools, leaving the agent to rely entirely on the schema.

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

Parameters3/5

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

Schema description coverage is 100%, including enum values for `type` and `status` and a cursor explanation, so the schema carries parameter meaning. The description merely echoes the two filter parameters and adds no semantics beyond what the schema already states; baseline 3 applies.

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

Purpose2/5

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

The description says 'List reports,' which only restates the tool name and title with no added specification. It never clarifies what a 'report' is here, how it differs from get_report, download_report, or create_report in the sibling set, or what the listing contains.

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?

It states you can filter by `type` or `status`, which is a hint at usage, but gives no when-to-use/when-not guidance and never mentions the obvious alternatives (get_report for a single report, download_report for retrieval, create_report for generation). The agent must infer routing from tool names alone.

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

list_risk_eventsList risk events (blocked and flagged activity)B
Read-onlyIdempotent

List risk events (blocked and flagged activity).

List risk events: money movements blocked by your risk limits and payments flagged for review (high value, customer velocity, blocked customers). Filter by review_status.

NameRequiredDescriptionDefault
limitNoNumber of objects to return
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
ending_beforeNoCursor: return objects created after this object id (newer)
review_statusNoOnly risk events with this review status.
starting_afterNoCursor: return objects created before this object id (older)

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered without the description's help. What the description adds is domain semantics about which events appear in the result set and why they were flagged, which is genuine value. It does not discuss result ordering, default limit behavior, or whether flagged vs blocked are distinguishable in the response, so with annotations carrying the safety burden a 3 is right.

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

Conciseness3/5

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

The content is short and front-loaded, but the opening sentence 'List risk events (blocked and flagged activity).' duplicates the title field and is immediately restated by 'List risk events: ...'. Two of the description's sentences are redundant with each other and with the title, so it wastes space despite its brevity.

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 read-only list tool with five optional parameters, full schema coverage, and no output schema, the description supplies what structured fields cannot: what a 'risk event' actually is and the categories that produce them, which effectively stands in for return-value documentation. Remaining gaps are minor — result ordering and how blocked versus flagged entries are represented — and an agent could call it correctly without them.

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

Parameters3/5

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

Schema description coverage is 100%, including the review_status enum values, the date-time filter example, and both pagination cursors. The description's only parameter-related statement ('Filter by review_status') restates what the schema already documents, adding no format, default, or interaction detail. Baseline 3 applies when the schema does all the parameter work.

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 gives a specific verb and resource ('List risk events') and then defines the resource concretely: money movements blocked by risk limits and payments flagged for review, with the trigger reasons (high value, customer velocity, blocked customers). That is far more useful than a tautology. It stops short of explicitly distinguishing this list from neighbors such as get_risk_limits or list_payments, so it lands at 4 rather than 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?

Usage is only implied by the phrase 'Filter by review_status', which hints at the triage workflow (open/cleared/confirmed). There is no explicit when-to-use guidance, no statement of when to reach for get_risk_limits or set_customer_risk_status instead, and no mention of prerequisites such as needing risk monitoring enabled.

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

list_sandbox_test_valuesList the sandbox test values (test mode only)A
Read-onlyIdempotent

List the sandbox test values (test mode only).

Test mode only (403 test_mode_only with a live key). Recipient account numbers that give a payout (or a refund) a fixed outcome in test mode, so you can test failures on purpose: declined, processing then succeeded, processing then failed, a timeout confirmed by a status check, and an account that is not found.

Use them as the recipient of a payout, or as sender_account_number when you simulate a transfer, to test what happens to a refund. Any other number succeeds.

Test mode only: needs an sk_test_ key.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), and the description adds real context beyond them: the auth requirement for a test key, the exact failure mode with a live key (`403 test_mode_only`), and an enumeration of the outcomes each value triggers (declined, processing→succeeded, processing→failed, timeout, not found).

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?

Front-loaded with the headline and the test-mode constraint, then value-adding detail. The one flaw is repetition: 'test mode only' appears in the title, the opening line, and again at the end, which is slightly wasteful.

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?

With zero parameters, a closed schema, and no output schema, the definition supplies everything an agent needs — the credential requirement, the error it will hit otherwise, what the values are, and how to apply them in simulate_transfer or payout creation.

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 takes no parameters, so the baseline is 4 and there is nothing for the description to disambiguate. It does clarify that the returned strings are recipient/sender account numbers, which is meaningful semantics even without a schema.

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 (list sandbox test values) plus a hard scope constraint (test mode only). Nothing among the ~80 siblings overlaps with it, and the agent can tell immediately this is the fixture-list tool rather than a live-data call.

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?

Explicitly says where the values plug in: as the recipient of a payout, or as `sender_account_number` when using simulate_transfer to test refunds. It also states the fallback behavior (any other number succeeds) and the precondition (sk_test_ key), so no inference is required.

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

list_settlement_itemsLedger movements covered by a settlementA
Read-onlyIdempotent

Ledger movements covered by a settlement.

Every movement of your available balance up to the settlement’s cutoff that this settlement accounts for. Use it to reconcile a payout against the payments and transfers behind it.

NameRequiredDescriptionDefault
idYesThe settlement id (`stl_…`).

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive, closed-world behavior. The description adds that results cover only movements up to the settlement cutoff and that they are the movements the settlement accounts for, which clarifies scope beyond annotations; it does not cover pagination or return format.

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 short and front-loads the scope before the reconciliation use case. The opening sentence repeats the title almost verbatim, which is minor redundancy, but the rest is efficient.

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 read-only list tool with rich annotations, the description supplies enough context to understand what is returned at a conceptual level. It could mention pagination if the endpoint paginates, and return format details are absent, but no output schema is provided.

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

Parameters3/5

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

Schema coverage is 100% for the single id parameter, and the schema documents the stl_ prefix. The description does not add further meaning about the id beyond saying the tool is settlement-scoped.

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 identifies the resource as ledger movements covered by a settlement and states the scope: movements of available balance up to the settlement cutoff. It distinguishes this from get_settlement by focusing on the movements behind the settlement rather than the settlement record itself, though it never explicitly names the 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 gives a clear use case: reconciling a payout against the payments and transfers behind it. It does not explain when to use list_settlements or get_settlement instead, so it falls short of full alternative guidance.

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

list_settlementsList settlements (payouts of your available balance to your bank account)B
Read-onlyIdempotent

List settlements (payouts of your available balance to your bank account).

List settlements: payouts of your available balance (or a subaccount’s) to the settlement account you set in the dashboard, on your schedule or on demand. Filter by status or subaccount.

NameRequiredDescriptionDefault
limitNoNumber of objects to return
statusNoOnly objects with this status.
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
subaccountNoOnly settlements of this subaccount (sub_…)
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds domain context (settlement account configured in the dashboard, scheduled or on-demand payouts) but says nothing about result ordering, pagination behavior, or volume of data, so it adds modest value beyond the annotations.

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

Conciseness3/5

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

The title and the first sentence of the body are near-identical, and the second paragraph restates the same definition before adding the filter note. The payoff content (filtering by status/subaccount) is buried at the end, so the text is redundant rather than front-loaded.

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

Completeness3/5

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

There is no output schema, so the description could reasonably say something about what a settlement record looks like or how results are ordered and paginated. With full schema coverage and read-only annotations most essentials are covered, so this is adequate but not complete for a list tool whose result shape is undefined.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents limit, status, created, subaccount, and both cursors. The description only restates that you can filter by status or subaccount, adding no syntax or semantics beyond the schema, and it omits mention of the created range and cursor pagination that the schema defines. Baseline 3 holds.

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 gives a specific verb (list) and resource (settlements) and immediately defines the resource in business terms: payouts of your available balance (or a subaccount's) to the settlement account set in the dashboard. That lets an agent distinguish it from get_settlement (single object) and list_settlement_items (line items of a settlement). It does not explicitly name those siblings as alternatives, which keeps it just 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?

Usage is implied rather than stated. Saying settlements are payouts of available balance to your settlement account gives enough context to infer when this tool is relevant (checking payout history), but there is no explicit when-to-use vs when-not, and no guidance on using list_settlements vs get_settlement or get_subaccount_balance.

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

list_split_rulesList split rulesC
Read-onlyIdempotent

List split rules.

List your split rules.

NameRequiredDescriptionDefault
limitNoNumber of objects to return
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

C2.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds nothing further: it says nothing about ordering, page size behaviour, how cursors combine with the created filter, or what happens when no rules exist.

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

Conciseness3/5

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

It is short and front-loaded, but the second sentence ('List your split rules.') is a pure restatement of the first with the addition of 'your'. Every sentence should earn its place, and this one barely does.

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 the annotations cover safety and the schema fully documents all four parameters including cursors and date filtering, an agent can call this correctly. Still missing is any hint about result ordering or pagination semantics, which matter for a cursor-paginated list endpoint with no output schema.

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

Parameters3/5

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

Schema description coverage is 100%: limit, the created date-range object, and both cursors are all documented in the schema itself. The description adds no parameter meaning, so the baseline of 3 applies for a fully documented schema.

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

Purpose2/5

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

The description restates the tool name and title verbatim ('List split rules'), adding only 'your' to imply account scoping. It does not distinguish this from the sibling reads get_split_rule, or from the writes create_split_rule/update_split_rule, beyond what the name already conveys.

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 when-to-use guidance, no indication of when to prefer get_split_rule for a single rule, and no note of prerequisites. An agent must infer usage entirely from the name.

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

list_subaccountsList subaccountsC
Read-onlyIdempotent

List subaccounts.

List your subaccounts.

NameRequiredDescriptionDefault
limitNoNumber of objects to return
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

C2.2/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered structurally. The description contributes nothing beyond that: no pagination behavior, no mention of default limit of 10 or the 100 maximum, no ordering guarantee, and no note on how cursors interact with the created filter.

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

Conciseness2/5

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

It is short, but the second sentence is a redundant paraphrase of the first and neither is front-loaded with actionable information. Brevity here comes from under-specification rather than from tight writing.

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 paginated list tool with a nested date-range filter and no output schema, the description should at minimum clarify pagination strategy and what a returned subaccount contains. It leaves an agent to infer everything from the schema alone.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains the limit cap, the created date-range filter syntax, and both cursor semantics. The description adds no meaning beyond the schema, which places it at the baseline for high-coverage schemas rather than above it.

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

Purpose2/5

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

The description restates the tool name twice ('List subaccounts. / List your subaccounts.') without adding scope, filtering behavior, or any differentiator from sibling tools like get_subaccount or list_customers. An agent learns only that it returns a list of subaccounts, which the name already conveys.

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 when-to-use guidance whatsoever — no mention of when to call this versus get_subaccount for a single record, or list_customers for the related resource. It does not state prerequisites such as account or API-key scope, nor does it mention what the results represent.

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

list_subscriptionsList subscriptionsC
Read-onlyIdempotent

List subscriptions.

List subscriptions. Filter by status or customer.

NameRequiredDescriptionDefault
limitNoNumber of objects to return
statusNoOnly objects with this status.
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
customerNoCustomer (cus_…)
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

C2.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered elsewhere. The description adds nothing beyond that: it does not mention the default limit of 10, the 100 max, pagination semantics, or what the response contains, leaving behavior undisclosed.

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

Conciseness2/5

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

"List subscriptions" appears twice verbatim, which is pure waste in a three-sentence description. The remaining sentence is short and front-loaded, but the duplication signals a copy/paste artifact rather than deliberate structure.

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?

With six parameters, a nested date-range filter, cursor pagination, and no output schema, the description should at minimum explain paging and the creation-time filter. It covers only two of six parameters and says nothing about return values or how to continue pagination.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters including the nested `created` filter and both cursors are already documented in the schema. The description's mention of `status` and `customer` only duplicates schema content, so the baseline 3 applies.

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

Purpose3/5

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

The description states a clear verb and resource ("List subscriptions"), but that is essentially a restatement of the tool name and title, and it makes no attempt to distinguish this list endpoint from siblings like get_subscription, create_subscription, or cancel_subscription. The only value-add is the mention of status/customer filtering.

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?

Filtering by `status` or `customer` hints at a retrieval use case, but there is no explicit guidance on when to call this versus get_subscription for a single record or versus other list tools. No preconditions, no mention of when a caller should page with cursors instead.

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

list_transactionsList ledger transactionsB
Read-onlyIdempotent

List ledger transactions.

Every ledger journal that moved your balances, with its signed effect per balance (credits to you are positive) and the object that caused it. Filter by journal type or by source. Use it for reconciliation.

NameRequiredDescriptionDefault
typeNoOnly objects of this type.
limitNoNumber of objects to return
sourceNoWhat caused the movement
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description still adds real value with the sign convention ("credits to you are positive") and the claim that each entry carries the causing object, but it says nothing about ordering or how deep the history goes.

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

Conciseness3/5

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

It is short and the purpose statement leads, which is good. The second sentence crams definition, sign convention and return shape into one dense clause, while pagination and the default/maximum limit of 10/100 get no mention at all, so length is not the problem, allocation is.

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

Completeness3/5

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

There is no output schema, so the description carries the return-value burden and does partially meet it by naming the signed per-balance effect and the source object. But result ordering, the default page size and the fact that cursors are the only way to reach older entries are never stated, leaving an agent without guidance on iterating a potentially long ledger.

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 coverage is 100% and enum values are documented in the schema, so the baseline would be 3. The description earns a point above baseline by explaining what the two enum filters actually mean in ledger terms ("journal type", "what caused the movement"), which clarifies the type-vs-source distinction that the schema descriptions leave ambiguous.

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?

Names a specific verb and resource ("List ledger transactions") and goes further by defining what a transaction is: a journal that moved balances, with a signed effect and the originating object. However, it never distinguishes this from the many sibling list_* tools (list_payments, list_transfers, list_settlements, list_settlement_items), so the agent must infer the boundary itself.

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?

One concrete use case is given ("Use it for reconciliation") plus the filtering options, which implies when it fits. There is no when-not guidance and no named alternative, which matters in a toolset where list_settlement_items and get_balance are plausible substitutes for balance-level reconciliation.

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

list_transfersList transfersC
Read-onlyIdempotent

List transfers.

List transfers. Filter by status and creation time.

NameRequiredDescriptionDefault
limitNoNumber of objects to return
statusNoOnly objects with this status.
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

C2.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so safety is covered structurally. The description adds nothing beyond that — no mention of pagination behavior, result ordering, default page size, or whether results are scoped to the whole account, even though cursor parameters exist.

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

Conciseness2/5

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

The title phrase 'List transfers' is repeated as both the lead sentence and the first line of the description, wasting the opening slot. What remains is a single vague sentence about filters, so the definition is both redundant and under-loaded.

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?

It is a list tool with a nested created object, cursor pagination, and no output schema, yet the description says nothing about the return shape, ordering, or paging strategy. Given no output schema, the description should carry that burden and does not.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents limit, status, created, and the cursor parameters in detail. The description merely restates that status and creation time can be filtered, adding no meaning beyond the schema; baseline 3 applies.

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

Purpose3/5

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

The description names a specific verb and resource ('List transfers') but states it twice, and gives no differentiation from siblings such as get_transfer, list_transactions, or list_settlements. An agent can infer the resource but not the scope relative to the wider transfer-related family.

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 when-to-use guidance: no mention of when to prefer this over get_transfer, get_transfer_by_reference, or simulate_transfer, and no exclusions. The only hint is the filter sentence, which is an implied usage but not a selection rule.

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

list_virtual_accountsList virtual accountsC
Read-onlyIdempotent

List virtual accounts.

List virtual accounts. Filter by type, status, customer or account_number.

NameRequiredDescriptionDefault
typeNoOnly objects of this type.
limitNoNumber of objects to return
statusNoOnly objects with this status.
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
customerNoOnly objects of this customer (`cus_…`).
ending_beforeNoCursor: return objects created after this object id (newer)
account_numberNoOnly the account with this 10-digit number.
starting_afterNoCursor: return objects created before this object id (older)

TDQS

C2.5/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered structurally. The description adds no behavioral context beyond that: no mention of the default page size of 10, the 100 maximum, how cursor pagination behaves, or what happens with combined filters. With annotations doing all the work, the description contributes almost nothing.

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

Conciseness3/5

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

The description is short and front-loaded, but the sentence "List virtual accounts." is duplicated verbatim, so one of the three lines carries zero information. The remaining filter sentence is efficient, but the redundancy signals a poorly assembled definition.

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 is an 8-parameter list tool with a nested created object, two enums, cursor pagination and no output schema. The description never addresses pagination or result shape, which is the main thing an agent needs for a list endpoint, leaving it materially incomplete for the tool's complexity despite strong annotations.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented in the schema, including the enum values for type and status and the created date-range example. The description names four filters (type, status, customer, account_number) but adds no meaning beyond the schema and omits limit and both cursors, which are the parameters an agent most often gets wrong. Baseline 3 applies.

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

Purpose3/5

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

The description states the verb and resource ("List virtual accounts"), which is clear enough to act on, but it is a literal restatement of the tool name and title with no scope or differentiation. Nothing distinguishes it from siblings like get_virtual_account or get_virtual_account_by_reference beyond the word "list".

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 when-to-use guidance, no indication of when to prefer this over get_virtual_account or get_virtual_account_by_reference, and no mention of prerequisites or pagination workflow. The agent must infer everything from the name.

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

list_webhook_endpointsList webhook endpointsC
Read-onlyIdempotent

List webhook endpoints.

List your webhook endpoints with their delivery health.

NameRequiredDescriptionDefault
limitNoNumber of objects to return
createdNoFilter on creation time, e.g. created[gte]=2026-01-01T00:00:00Z
ending_beforeNoCursor: return objects created after this object id (newer)
starting_afterNoCursor: return objects created before this object id (older)

TDQS

C2.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered structurally. The only behavioral value the description adds beyond that is the note that results carry delivery health, but it doesn't explain what that field means or whether it is computed versus stored.

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

Conciseness3/5

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

Two very short sentences, but the first is a verbatim restatement of the title and the second repeats "webhook endpoints" again. It is front-loaded and non-verbose, yet a meaningful portion of the text is redundant with structured 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 simple read-only list endpoint with no output schema and a fully documented input schema, the definition is minimally sufficient to call the tool. It still leaves open what "delivery health" comprises and how results are ordered across cursor pages, which would help an agent use the output correctly.

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

Parameters3/5

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

Schema description coverage is 100% and all four parameters are optional, with cursor and created-filter semantics documented inline in the schema. Per the baseline rule, a 3 is appropriate since the description adds no parameter meaning beyond the schema.

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

Purpose3/5

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

The description states a specific verb and resource ("List webhook endpoints") and adds that results include delivery health, which is meaningful. However, it does nothing to distinguish this from related siblings such as list_endpoint_deliveries or get_webhook_endpoint, so an agent gets the general purpose but not its boundary.

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 on when to use this versus get_webhook_endpoint (single endpoint lookup) or list_endpoint_deliveries (per-event delivery attempts), nor any mention of prerequisites or pagination workflow. The agent must infer usage entirely from the name.

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

mark_invoice_uncollectibleMark an invoice uncollectible (it can still be paid)B
Destructive

Mark an invoice uncollectible (it can still be paid).

Mark an open invoice uncollectible for your records. The customer can still pay it.

NameRequiredDescriptionDefault
idYesThe invoice id (`inv_…`).

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false, so the write/destructive profile is covered structurally. The description adds genuinely useful context the annotations cannot convey: the invoice remains payable, meaning this is a bookkeeping designation rather than a cancellation. It still omits whether the action can be reversed or un-marked, and what happens to an invoice that is already paid or already uncollectible.

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?

Short and front-loaded, with the key caveat (still payable) stated immediately. The cost is repetition: the first line restates the title verbatim, and "the customer can still pay it" says the same thing as the parenthetical, so two of the three sentences carry overlapping information.

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 mutation with no output schema, the definition covers what it does and one important semantic nuance. It falls short on reversibility and on sibling disambiguation versus void_invoice — the two things an agent most needs to choose and call this correctly.

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

Parameters3/5

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

Schema description coverage is 100% for the single parameter, and the schema documents the `inv_…` id format. The description adds nothing about the id parameter, so the baseline of 3 applies — the schema carries the burden and does it adequately.

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 ("Mark an open invoice uncollectible") and scopes it to open invoices. It never names a sibling such as void_invoice or update_invoice, so the boundary between this and voiding an invoice is left implicit — the parenthetical about the customer still being able to pay hints at the difference but does not draw it.

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 word "open" implies a precondition (only open invoices qualify) and the note that the customer can still pay implies a when-to-use context — for record-keeping/write-off rather than cancelling the debt. However there is no explicit statement of when to prefer this over void_invoice, nor what happens if the invoice isn't open.

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

replay_eventRe-deliver an eventA

Re-deliver an event.

Deliver an event again, to every endpoint subscribed to it or to one endpoint. The payload and X-PletoPay-Event-ID are unchanged, so your de-duplication still applies. Replays are limited per business (429 rate_limited, see Retry-After).

NameRequiredDescriptionDefault
idYesThe event id (`evt_…`).
endpointNoOnly replay to this endpoint (we_…)
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations' safety profile, it discloses two behaviors an agent cannot get from structured fields: the payload and `X-PletoPay-Event-ID` are byte-identical on replay, and replays are throttled per business with a 429/`Retry-After` contract. These are exactly the traits needed to avoid hammering the endpoint or double-processing on the consumer side.

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, front-loaded with the verb and scope, then safety-relevant detail. Nothing is repeated from the title or the schema.

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?

There is no output schema, so the description is the only place behavior can be described; it covers scope, payload invariance, and throttling but never says what the call returns (delivery records? counts? nothing?). For a re-delivery trigger that gap is minor but real.

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 coverage is 100%, so the parameter docs already carry the basics (baseline 3). The description still adds meaning by making the semantics of omitting `endpoint` explicit — the fan-out is to every subscribed endpoint — which the schema's 'Only replay to this endpoint' does not state.

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 ('Re-deliver an event') and immediately defines scope: every subscribed endpoint or a single `endpoint`. That scope statement cleanly separates it from read-only siblings like get_event and list_event_deliveries.

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?

Clear about the operation's context and its consequences (dedup still applies, per-business replay limits), which implicitly tells the agent when a repeat delivery is safe. It does not explicitly contrast with the closest alternative, test_webhook_endpoint, so the agent must infer that testing vs. real re-delivery are different actions.

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

resolve_accountResolve a bank account name before sendingA
Read-onlyIdempotent

Resolve a bank account name before sending.

Look up the account name for a bank code and account number (NIP name enquiry). Show the name to the person sending money before they confirm. An account that can’t be resolved returns 400 account_not_resolved. In live mode, lookups need an approved business verification and count toward the money-movement rate limit.

NameRequiredDescriptionDefault
bank_codeYes
account_numberYes

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, the description discloses meaningful behavioral details: NIP name enquiry, the `400 account_not_resolved` failure case, live-mode business verification requirements, and money-movement rate-limit consumption. These are exactly the operational constraints annotations do not capture.

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 four tight sentences with no filler, front-loading the tool's purpose before workflow, error behavior, and operational constraints. Every sentence adds useful information.

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 lookup, the definition covers purpose, pre-send workflow, error handling, verification, and rate limits well. The main gap is that it does not tell the agent where to get `bank_code` or clarify the return value, though the return value is largely implied by 'account name' and there is no output schema.

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 undocumented parameters. It names both `bank_code` and `account_number` and adds the NIP enquiry context, but it does not explain bank-code format, account-number format, or where to obtain a valid bank code, leaving meaningful gaps.

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: resolve a bank account name via NIP name enquiry. It distinguishes the tool from sending operations by framing it as a pre-send check, so an agent can tell it is not a payment-creation tool.

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 explicitly says to use the tool before sending money and to show the resolved name before confirmation, which gives clear timing and workflow guidance. It does not name a specific alternative or exclusion, such as using create_transfer after resolution or list_banks to obtain a bank code.

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

rotate_webhook_secretRotate the signing secretA
Destructive

Rotate the signing secret.

Replace the endpoint’s signing secret. The new secret is returned only in this response, and deliveries are signed with it from now on.

NameRequiredDescriptionDefault
idYesThe webhook endpoint id (`we_…`).

TDQS

A3.9/5.0
Behavior5/5

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

Beyond the destructive, non-idempotent annotations, it discloses two critical behaviors: the new secret is returned only in this response, and deliveries are signed with it from that point onward. This provides essential secret-capture and timing information that is absent from the structured fields.

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

Conciseness4/5

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

The description is short and places the operation before its important one-time-return and signing consequences. However, 'Rotate the signing secret' and 'Replace the endpoint’s signing secret' largely repeat each other and the title.

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 operation, the target, mutation, return sensitivity, and effective timing are sufficiently covered despite the absence of an output schema. It could be more complete by explicitly warning that the prior secret is invalidated and that the new value must be captured before the response is discarded, although both are strongly implied.

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 sole id parameter is fully documented in the schema, including its webhook-endpoint role and we_ prefix, so the high-coverage baseline applies. The description’s reference to 'the endpoint' adds no parameter syntax, validation, or selection detail beyond that schema.

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 states that the tool replaces a webhook endpoint’s signing secret, making both the action and resource unambiguous. It does not explicitly differentiate this operation from update_webhook_endpoint or other webhook-endpoint siblings.

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?

Usage is implied for rotating an endpoint’s signing credential, and the immediate effect on deliveries clarifies the operation’s scope. There is no explicit when-to-use or when-not-to-use guidance, such as rotation after compromise versus updating or deleting an endpoint.

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

search_docsSearch the Pletopay docsA
Read-onlyIdempotent

Search the Pletopay guides (payments, virtual accounts, transfers, refunds, checkout, webhooks, errors, testing, going live). Returns the best-matching sections with a link and a snippet; read a whole page with get_doc.

NameRequiredDescriptionDefault
limitNoHow many sections to return.
queryYesWhat to look for, in plain words.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds useful behavior beyond that: results are ranked best-matches returned as a link plus a snippet, and full content requires a separate call. No rate limits or result-truncation details, but the key behavior is 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 tight sentences with zero filler: scope and return shape first, then the routing hint to get_doc. Nothing redundant with the title.

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

Completeness5/5

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

For a simple two-parameter search tool with no output schema, the description covers scope, result shape (link + snippet), and the escape hatch for full content. That is everything an agent needs to call it correctly.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters (query, limit) are already documented in the schema. The description only adds the notion of ranked "best-matching sections," which implies relevance ordering but gives no query syntax or formatting guidance, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("Search the Pletopay guides") and enumerates the covered topic areas, so the agent knows the corpus scope. It also explicitly distinguishes itself from the sibling get_doc, which fetches a whole page.

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?

Names the alternative tool and the condition that selects it ("read a whole page with get_doc"), which is clear routing guidance. It stops short of saying when search is the wrong approach (e.g., exact API reference lookups), so it is clear but not exhaustive.

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

set_customer_risk_statusSet a customer's risk statusA

Set a customer's risk status.

Set a customer’s risk status. blocked customers can’t be issued new payments or accounts (409 customer_blocked); elevated is informational.

NameRequiredDescriptionDefault
idYesThe customer id (`cus_…`).
reasonNo
statusYesblocked: no new payments or accounts for this customer

TDQS

A3.5/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly=false, idempotent=false, destructive=false), and the description adds genuine context beyond that: blocked customers cannot receive new payments or accounts and the API surfaces `409 customer_blocked`. That consequence-and-error-code disclosure is exactly what an agent needs before flipping a customer to blocked. It doesn't mention reversibility (setting back to `normal`) or whether `reason` is recorded anywhere, which keeps it short of 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.

Conciseness3/5

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

The body is two efficient clauses, but the first line repeats the title verbatim before the real sentence begins, wasting the most valuable position on a restatement. Front-loading the blocked/409 consequence instead would make it tighter.

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 small mutation tool with no output schema, the description covers the key side effect and error code, but leaves open the purpose of the `reason` field, whether `normal` lifts restrictions, and what permissions are required. Adequate but with clear gaps given the mutation is not marked destructive.

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 67% and the description partially duplicates the enum documentation for `status` while adding meaning ('elevated' is informational) that the schema does not state. However, the optional `reason` parameter is undocumented in both schema and description, so the description does not fully compensate for the coverage gap – baseline 3.

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 a customer's risk status) that maps directly to the enum values, so an agent knows exactly what mutation it performs. It is distinguishable from update_customer in principle, though the description never names that sibling, so the differentiation is implicit rather than stated.

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 status semantics ('blocked' vs 'elevated' being informational) implicitly tell the agent when each value is appropriate, which is real usage guidance. But there is no explicit when-to-use-this-instead-of (`update_customer`, `list_risk_events`, `get_risk_limits`) and no stated prerequisites or exclusions.

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

simulate_transferSimulate a customer bank transfer (test mode only)A

Simulate a customer bank transfer (test mode only).

Test mode only (403 test_mode_only with a live key). Simulate a transfer into one of your test virtual accounts, as a customer would make it.

The transfer then flows through the same pipeline as live money: the payment moves to succeeded and webhooks are sent. A wrong amount into an exact-amount account is refused (400 simulation_rejected), as a real transfer would be. An account that is not active (for example a one-time account that already received its payment) is refused before anything is sent (409 virtual_account_not_active). A 202 only means the simulation was accepted; watch the payment or its events for the outcome.

Test mode only: needs an sk_test_ key.

NameRequiredDescriptionDefault
amountYesAmount in kobo
sender_nameNoName of the simulated sender
account_numberYesYour virtual account number that should receive the transfer
sender_account_numberNoAccount number of the simulated sender. Refunds go back to the sender, so a test value here (see the sandbox test values) lets you test refund outcomes.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, it discloses that the simulation flows through the live pipeline (payment reaches `succeeded`, webhooks fire) and enumerates concrete failure modes: 403 test_mode_only, 400 simulation_rejected for wrong amounts on exact-amount accounts, and 409 virtual_account_not_active. It also warns that a 202 only means acceptance and the outcome must be watched via the payment or events.

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 content is front-loaded with the test-mode constraint and the outcome semantics, and each sentence carries substantive information. The 'test mode only' constraint is repeated three times, which is redundant, though the emphasis is defensible for a high-risk-of-misuse tool.

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 simulation tool with no output schema, the description covers the safety constraint, the async nature of the 202 response, how to observe the outcome, and the specific error conditions an agent may hit. Nothing material needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters including the refund behavior of sender_account_number. The description adds only indirect parameter meaning (amount correctness against exact-amount accounts), which is the baseline expectation when the schema does the heavy lifting.

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

Purpose5/5

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

The description states a specific verb and resource ('Simulate a customer bank transfer') and immediately scopes it to test virtual accounts, which cleanly separates it from the live-money sibling create_transfer. An agent can identify what this does without opening the schema.

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 a clear usage context: test mode only, requires an sk_test_ key, and the transfer must target one of your test virtual accounts. It does not explicitly name create_transfer as the live-mode alternative, so the when-not-to-use routing 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.

test_webhook_endpointSend a signed webhook.test event to this endpoint onlyA

Send a signed webhook.test event to this endpoint only.

Send a signed webhook.test event to this endpoint only, to check your signature verification and connectivity. The endpoint must be enabled (409 endpoint_disabled). Test sends are limited per business (429 rate_limited, see Retry-After).

NameRequiredDescriptionDefault
idYesThe webhook endpoint id (`we_…`).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare the non-read-only, open-world, non-idempotent profile, so the bar is lower, and the description still adds real value: the endpoint must be enabled (409 endpoint_disabled) and test sends are rate-limited per business (429 rate_limited with Retry-After). It stops short of saying whether a delivery record is created or whether the test event appears in delivery listings.

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?

Short and front-loaded: the scope constraint comes first, then the purpose, then error conditions. Minor waste from the opening sentence duplicating the title and being restated almost verbatim in the following 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 one-parameter action tool with no output schema, the description covers purpose, prerequisite state, and the two likely failure modes. The remaining gap is the response shape — whether it returns a delivery/event id or just success — which an agent would want before calling.

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 single `id` parameter has full schema description coverage including the `we_…` prefix format, so the schema carries the semantics. The description reinforces that the send is scoped to that one endpoint but adds no format or validation detail beyond the schema; baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("Send a signed `webhook.test` event") plus an explicit scope constraint ("to this endpoint only"), which separates it from siblings like replay_event and list_endpoint_deliveries. An agent can identify the operation without opening the schema.

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 use case — verifying signature verification and connectivity — which tells the agent when this tool is appropriate. It does not name an alternative (e.g., replay_event for re-sending real events), so the when-not-to-use side is left implicit.

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

update_customerUpdate a customerA
Idempotent

Update a customer.

Update a customer’s email, name or phone. metadata is merged into the existing metadata. Changing the email to one another customer uses returns 409 customer_exists. Set a metadata key to "" to delete it; the merged metadata may have at most 50 keys (400 metadata_too_large).

NameRequiredDescriptionDefault
idYesThe customer id (`cus_…`).
nameNo
emailNo
phoneNo
metadataNoMerged into existing metadata
idempotency_keyNoOptional. A unique key for this request; retrying with the same key returns the original result instead of acting twice. One is generated if omitted.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds substantial behavior beyond that: metadata is merged rather than replaced, setting a key to "" deletes it, merged metadata is capped at 50 keys, and the specific error codes returned on collision or overflow. That is exactly the operational context an agent needs before invoking a mutation.

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 tight sentences: the restated title line is mildly redundant but acts as an anchor, then merge semantics, then error conditions — ordered from core behavior to edge cases. No filler and no repetition of schema-only details.

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 six-parameter mutation with no output schema, the description covers the non-obvious parts: merge behavior, deletion sentinel, key cap and error codes. It does not say what the response contains or whether unspecified fields are left untouched, which is the one remaining gap for an update tool.

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

Parameters4/5

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

Schema coverage is only 50% (name, email and phone have no schema descriptions), and the description compensates by naming those three updatable fields and by explaining metadata's merge-and-delete semantics plus its size limit. It says nothing extra about idempotency_key, but the schema already documents that parameter fully, so the gap is minor.

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 opens with a specific verb+resource ('Update a customer') and immediately narrows the scope to the mutable fields ('email, name or phone'), which makes it distinguishable from create_customer and get_customer in the sibling list. It stops short of naming any sibling explicitly, so it is clear rather than maximally differentiating.

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?

Usage is only implied by the verb — an agent can infer this is the tool for modifying an existing customer, but the description never states prerequisites, when to prefer it over other write paths, or what happens on a partial update. The error cases (409 customer_exists, 400 metadata_too_large) are useful context but are failure modes, not when-to-use guidance.

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

update_invoiceUpdate a draft invoiceA
Idempotent

Update a draft invoice.

Change a draft invoice’s customer, items, taxes, due date, memo or metadata. Only drafts can be changed (409 invoice_not_draft).

NameRequiredDescriptionDefault
idYesThe invoice id (`inv_…`).
memoNo
itemsNo
taxesNo
customerNo
due_dateNo
metadataNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false, so the safety profile is covered. The description adds real context beyond them by disclosing the draft-only precondition and the exact error code on violation. It stops short of saying whether items/taxes arrays are replaced wholesale or merged, which matters for an update 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?

Two short sentences with the identity statement first and the constraint second. No filler, no restating of the title, and the error code is placed exactly where an agent will look for it.

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 7-parameter mutation with nested objects and no output schema, the definition covers the critical precondition but leaves the caller guessing on update semantics for arrays and on what the response contains. Adequate to invoke, not fully complete.

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 only 14% across 7 parameters, so the description has to carry weight; it enumerates which fields are updatable, which does map to the optional params. However, it adds no meaning beyond the field names — no note that `id` is required, no currency-unit guidance, and no replacement-vs-merge semantics for the nested arrays.

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 ("Update a draft invoice") and enumerates the mutable surface (customer, items, taxes, due date, memo, metadata). This clearly separates it from sibling write operations like finalize_invoice, void_invoice, and mark_invoice_uncollectible.

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 an explicit when-not: only drafts can be changed, and the failure mode is named (`409 invoice_not_draft`). It doesn't route the agent to the sibling to use instead when an invoice is finalized (e.g. void_invoice or mark_invoice_uncollectible), which keeps it short of a 5.

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

update_planUpdate or deactivate a planB
Idempotent

Update or deactivate a plan.

Rename a plan or deactivate it. Inactive plans take no new subscriptions; existing subscriptions continue.

NameRequiredDescriptionDefault
idYesThe plan id (`plan_…`).
nameNo
activeNoInactive plans take no new subscriptions; existing ones continue
descriptionNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare idempotency, non-destructiveness, and open/closed world. The description adds valuable business behavior: 'Inactive plans take no new subscriptions; existing subscriptions continue.' However, it does not cover permission requirements or side effects beyond that, and it repeats the same line from the active parameter description.

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 short and front-loaded with the core action. However, it repeats the title phrase 'Update or deactivate a plan' at the start and again as 'Rename a plan or deactivate it', slightly reducing efficiency.

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 mutable tool with no output schema and annotations covering safety, the description is adequate but not fully complete. It explains the deactivation side effect but omits whether renaming affects existing subscriptions, what permissions are needed, or how partial updates work.

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?

With 50% schema description coverage, the description partially compensates by implying the 'name' parameter via 'Rename a plan' and the 'active' parameter via 'deactivate'. It does not add meaning for the 'description' parameter or clarify whether updates are partial or full.

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 states a specific verb (update/deactivate) and resource (plan), and clarifies that the update can rename or deactivate. It does not explicitly name sibling tools like get_plan or create_plan, but the action is unambiguous.

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 when to use the tool (to rename or deactivate a plan) but gives no explicit guidance on when not to use it or which alternatives (e.g., create_plan, get_plan) exist. Usage is clear only by inference.

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

update_split_ruleActivate or deactivate a split ruleA
DestructiveIdempotent

Activate or deactivate a split rule.

Activate or deactivate a split rule. Deactivated rules can’t be used for new payments; payments already created keep their frozen split.

In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user.

NameRequiredDescriptionDefault
idYesThe split rule id (`spl_…`).
activeYesDeactivated rules cannot be used for new payments; existing payments keep their frozen split.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the mutation profile is covered structurally. The description adds real value beyond that: it warns that live mode moves real money or redirects payout destinations, and that the effect is irreversible for already-created payments — exactly the operational context an agent needs before invoking a destructive toggle.

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

Conciseness3/5

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

The opening sentence is duplicated word-for-word, which is pure waste and pushes the genuinely useful warning further down. The remaining two sentences are well-formed and front-load the consequence before the caution, but the redundancy and the joint title/description overlap weaken structure.

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 toggle with no output schema, the description covers the key concerns: what changes, the effect on existing payments, live-mode risk, and a confirmation requirement. Only smaller gaps remain, such as whether reactivation restores prior behavior or whether any response payload should be expected.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are documented, with the 'active' parameter description nearly duplicating the prose sentence. The description adds no new syntax, format, or edge-case meaning for 'id' (such as whether a deactivated rule can be re-fetched or reactivated) beyond what the schema states, so the baseline 3 applies.

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 pair and resource ('Activate or deactivate a split rule'), which is unambiguous and clearly distinct from siblings like create_split_rule, get_split_rule, and list_split_rules. It loses a point only because the same sentence is repeated verbatim rather than expanding on scope or audience.

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?

It gives a clear usage effect (deactivated rules can't be used for new payments while existing payments keep their frozen split) and a pre-call caution about confirming amount and destination with the user. However, it never explicitly frames this against alternatives — e.g., it does not say to use get_split_rule to inspect current state first, or create_split_rule to make a new one — so the 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.

update_subaccountUpdate a subaccountA
DestructiveIdempotent

Update a subaccount.

Update a subaccount’s name, email, status or metadata. Changing the payout account (bank_code with account_number) re-runs name enquiry, and the new account is used only after a cooldown (settlement_account.usable_from) to protect against account takeover.

In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user.

NameRequiredDescriptionDefault
idYesThe subaccount id (`sub_…`).
nameNo
emailNo
statusNo
metadataNo
bank_codeNoChange the payout account (a cooldown applies before it is used)
account_numberNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety bar is partly met; the description goes further with non-obvious behavior — a payout-account change re-runs name enquiry and the new account is only used after a cooldown surfaced via `settlement_account.usable_from`, plus the irreversibility of live-mode changes. The one weak spot is the amount/destination confirmation line, which describes money movement rather than this tool's actual field mutations.

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?

Front-loaded with the purpose, then the payout-account caveat, then the risk warning — a sensible ordering that an agent can scan. The closing sentence about confirming the exact amount in kobo is inapplicable to this schema and reads as boilerplate that could be trimmed.

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 destructive, non-read-only mutation with no output schema, the description covers what an agent most needs: which fields are changes, the cooldown after a payout-account swap, and that live-mode effects are irreversible. It omits permission/auth requirements and has no return-shape note (there is no output schema), but the critical risk context is present.

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?

With schema coverage at only 29%, the description must compensate, and it largely does: it names four of the parameters by purpose and explains that `bank_code` only makes sense paired with `account_number` and triggers re-verification. It still does not clarify `status` transitions or `metadata` merge/replace semantics, which are the remaining undocumented parameters.

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 ("Update a subaccount") and immediately enumerates the mutable surface — name, email, status, metadata, and the payout account pairing. That is enough to separate it from create_subaccount, get_subaccount, and list_subaccounts without opening the schema.

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?

It gives a precondition ("Before calling, confirm the exact amount (in kobo) and the destination with the user") and flags live-mode risk, which is real usage guidance. However, it names no alternative tool and gives no when-not-to-use condition, and the "exact amount (in kobo)" instruction does not map to any parameter on this tool, so the guidance is partly inapplicable.

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

update_webhook_endpointUpdate a webhook endpoint (re-enabling resets its health)A
Idempotent

Update a webhook endpoint (re-enabling resets its health).

Change an endpoint’s URL, events or description, or disable and re-enable it. Re-enabling an endpoint that was auto-disabled after repeated failures resets its health.

NameRequiredDescriptionDefault
idYesThe webhook endpoint id (`we_…`).
urlNo
statusNo
descriptionNo
enabled_eventsNo

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly=false, destructive=false, idempotent=true and openWorld=false, so the safety bar is lower. The description adds genuinely non-derivable behavioral context: re-enabling an endpoint that was auto-disabled after repeated failures resets its health, which is a state transition the agent cannot infer from the schema. It stops short of saying what happens if the URL is changed (e.g., re-verification) or whether omitted fields are left untouched.

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?

Two tight sentences, with the surprising behavioral fact (health reset on re-enable) front-loaded in the title and repeated usefully in context. The title is duplicated verbatim as the first line of the description, which is a small redundancy rather than a real cost.

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 5-parameter mutation tool with no output schema and sparse schema descriptions, the definition establishes purpose and the one non-obvious side effect, which is the most important gap filled. It still leaves the agent guessing about partial-update semantics, whether URL changes require re-verification, and what the response contains after an update.

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 only 20% (just the id field is documented), so the description carries real weight and does name url, events, description and status. However, it adds no semantics beyond the field names — nothing on whether enabled_events replaces the whole list, what the '*' wildcard means, or what disabled vs enabled implies for delivery. Naming fields is minimal compensation for a 5-param schema.

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 states a specific verb and resource ('Update a webhook endpoint') and enumerates the mutable surface: URL, events, description, and enable/disable status. It's clearly distinguishable from siblings like delete_webhook_endpoint or test_webhook_endpoint by virtue of being an in-place mutation, though it never names those siblings explicitly.

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?

It gives an implied when-to-use by listing the fields that can be changed, and adds a specific scenario for re-enabling an auto-disabled endpoint. There are no explicit exclusions or routing to alternatives (delete_webhook_endpoint, rotate_webhook_secret, test_webhook_endpoint), and no stated prerequisites such as the endpoint existing or being owned by the caller.

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

void_invoiceVoid an invoiceA
Destructive

Void an invoice.

Void an open or uncollectible invoice so it can no longer be paid. Invoices in any other status return 409 invoice_not_open.

NameRequiredDescriptionDefault
idYesThe invoice id (`inv_…`).

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is known. The description adds real value on top: the state precondition and the exact error code returned on a rejected call. It does not state whether a void is reversible or what the response body contains, which is the remaining gap for a destructive mutation.

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 waste: the action first, then the precondition and error path. Every sentence carries information an agent needs.

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 destructive mutation with no output schema, this covers action, eligibility, and failure mode, and the annotations supply the safety hints. It is only slightly incomplete in omitting confirmation of irreversibility and what a successful response looks like.

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?

With a single parameter at 100% schema description coverage the schema already documents the `inv_…` id format, so the description adds nothing parameter-specific. Baseline 3 applies.

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 (void an invoice) and defines the effect: the invoice 'can no longer be paid'. It does not name or contrast with the closely related siblings mark_invoice_uncollectible or update_invoice, so an agent must infer the boundary itself.

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 an explicit eligibility condition (only open or uncollectible invoices) and the failure mode for everything else (409 invoice_not_open). It stops short of naming alternatives — e.g., that mark_invoice_uncollectible is the way to set a non-payable state short of voiding — so the when-not-to-use side is only half covered.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 85 tool updatesv1.0.0
    • First observedcancel_subscription
    • First observedclose_virtual_account
    • First observedcreate_checkout_session
    • First observedcreate_customer
    • First observedcreate_invoice
    • First observedcreate_payment
    • First observedcreate_payment_link
    • First observedcreate_plan
    • First observedcreate_refund
    • First observedcreate_report
    • First observedcreate_split_rule
    • First observedcreate_subaccount
    • First observedcreate_subscription
    • First observedcreate_transfer
    • First observedcreate_virtual_account
    • First observedcreate_webhook_endpoint
    • First observeddelete_webhook_endpoint
    • First observeddownload_report
    • First observedexpire_checkout_session
    • First observedfinalize_invoice
    • First observedget_balance
    • First observedget_checkout_session
    • First observedget_checkout_session_by_reference
    • First observedget_customer
    • First observedget_doc
    • First observedget_event
    • First observedget_invoice
    • First observedget_payment
    • First observedget_payment_by_reference
    • First observedget_payment_link
    • First observedget_plan
    • First observedget_refund
    • First observedget_refund_by_reference
    • First observedget_report
    • First observedget_risk_limits
    • First observedget_settlement
    • First observedget_split_rule
    • First observedget_statement
    • First observedget_subaccount
    • First observedget_subaccount_balance
    • First observedget_subscription
    • First observedget_transfer
    • First observedget_transfer_by_reference
    • First observedget_virtual_account
    • First observedget_virtual_account_by_reference
    • First observedget_webhook_endpoint
    • First observedlist_banks
    • First observedlist_checkout_sessions
    • First observedlist_customers
    • First observedlist_endpoint_deliveries
    • First observedlist_event_deliveries
    • First observedlist_events
    • First observedlist_invoices
    • First observedlist_payment_links
    • First observedlist_payments
    • First observedlist_plans
    • First observedlist_refunds
    • First observedlist_reports
    • First observedlist_risk_events
    • First observedlist_sandbox_test_values
    • First observedlist_settlement_items
    • First observedlist_settlements
    • First observedlist_split_rules
    • First observedlist_subaccounts
    • First observedlist_subscriptions
    • First observedlist_transactions
    • First observedlist_transfers
    • First observedlist_virtual_accounts
    • First observedlist_webhook_endpoints
    • First observedmark_invoice_uncollectible
    • First observedreplay_event
    • First observedresolve_account
    • First observedrotate_webhook_secret
    • First observedsearch_docs
    • First observedset_customer_risk_status
    • First observedsimulate_transfer
    • First observedtest_webhook_endpoint
    • First observedupdate_customer
    • First observedupdate_invoice
    • First observedupdate_payment_link
    • First observedupdate_plan
    • First observedupdate_split_rule
    • First observedupdate_subaccount
    • First observedupdate_webhook_endpoint
    • First observedvoid_invoice

TDQS

B3.2/5.0

Scored across 85 tools

Disambiguation4/5

Most tools are clearly separated by resource and action, and the by-reference lookup variants are explicitly named. A few overlaps remain, notably create_payment versus dynamic create_virtual_account, which describe the same underlying operation, and the event/delivery tools require careful reading to distinguish.

Naming Consistency5/5

The tool set uses a consistent snake_case verb_noun pattern throughout: get_, list_, create_, update_, delete_, plus clear lifecycle verbs such as close_, expire_, finalize_, void_, cancel_, rotate_, and replay_. Reference lookups follow a predictable get_<resource>_by_reference pattern with only minor compound names.

Tool Count1/5

85 tools is far above a well-scoped MCP tool set and forces agents to choose among a very large number of resource-specific endpoints. Even for a broad payments platform, this surface is heavy and could be consolidated, especially reference-lookup variants, event delivery tools, and CRUD groups.

Completeness5/5

The surface covers full lifecycle operations for core domains: payments, virtual accounts, customers, subaccounts, splits, transfers, refunds, invoices, subscriptions, plans, checkout sessions, payment links, webhooks/events, reports, risk, settlements, docs, and sandbox tools. It includes create/get/list/update/lifecycle and reconciliation operations, with no obvious dead end for the stated payments purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to interact with Juspay's payment processing APIs and merchant dashboard for managing orders, transactions, refunds, customers, gateways, and reporting through natural language.
    21
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to interact with the full range of Paystack APIs, allowing operations like transaction management, customer creation, and payments through natural language.
    2
    86 npm
    56
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides AI assistants with read and safe-write access to Alternative Payments customers, invoices, payment requests, transactions, payouts, and webhooks without directly moving money.
    Apache 2.0