Skip to main content
Glama

Server Details

Free tamper-evident receipts for agents. HMAC chain, confirm-before-pay, wallets, escrow.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 28 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A3.9/5.0

Scored across 15 tools

Disambiguation4/5

The set spans two clear domains (wallet/escrow jobs vs. purchase receipts), and each tool targets a distinct resource+action, so an agent can generally pick correctly. The main friction is a cluster of edit_token-consuming receipt mutators (attach_proof, record_payment, set_receipt_visibility) plus the read-side pair (get_receipt vs verify_receipt), which are distinguishable only after reading the long descriptions.

Naming Consistency4/5

Almost everything follows a verb_noun pattern (create_job, get_balance, record_approval, refund_job, verify_receipt). Minor deviations: the bare verb 'purchase', and inconsistent creation verbs ('create_job'/'create_checkout' vs 'open_wallet').

Tool Count4/5

15 tools is at the upper edge of the comfortable range but justified by covering two related sub-domains (credits/escrow and receipts). No tool looks redundant enough to cut, though the surface is on the heavier side.

Completeness3/5

Receipt lifecycle is well covered (record, read, payment, proof, visibility, verify), and jobs have create/get/release/refund. But there is no list_jobs or list_receipts (agents must already hold IDs), and a disputed receipt has no resolution path, leaving real dead ends.

Available Tools

15 tools
attach_proofAttach delivery proofAInspect

Attach proof of delivery to a receipt. Requires the edit_token from record_approval. Moves approved to delivered, or to disputed when status is disputed. over_cap is true when actual_amount exceeds the price cap. Does not move money. Same as POST /v1/receipts/:id/proof.

NameRequiredDescriptionDefault
typeYesProof kind. Examples: order_confirmation, tracking, url, hash.
valueYesThe proof itself: confirmation id, tracking number, URL, or hash.
statusNoOmit to mark an approved receipt delivered. Pass disputed to dispute it.
edit_tokenYesSecret returned once by record_approval. Required to attach proof.
receipt_idYesReceipt id from record_approval (rcpt_…).
actual_amountNoAmount actually charged. over_cap is true when this is above the price cap.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses the state machine transitions, the auth dependency on record_approval's edit_token, the meaning of the over_cap flag, and an explicit negative guarantee ('Does not move money'). Annotations only say non-readonly/non-idempotent; the description supplies the operational consequences.

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?

Five short sentences, each load-bearing: purpose, prerequisite, state effects, semantic flag, and negative guarantee, ending with the REST endpoint. Front-loaded and free of repetition.

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 mutation tool with no output schema, the description covers prerequisites, side effects, and at least one response signal (over_cap). It leaves the success payload shape and any post-attach follow-up (e.g. release_job) unaddressed, which keeps it just short of complete.

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 baseline is 3, but the description adds meaning the schema doesn't: where edit_token and receipt_id come from, and that over_cap reflects actual_amount exceeding the price cap. It doesn't add syntax detail for type/value beyond the examples already in 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?

Specific verb+resource ('Attach proof of delivery to a receipt') with the exact state transitions the call causes (approved→delivered, disputed→disputed). An agent can distinguish this from record_approval, verify_receipt, and release_job without reading any 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?

States the prerequisite clearly ('Requires the edit_token from record_approval') and the condition for the disputed branch. It stops short of naming when NOT to use it or pointing at an alternative tool, so it gives strong context but no exclusions.

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

create_checkoutCreate checkoutAInspect

Start a Stripe Checkout credit top-up. Same as POST /v1/wallets/:id/checkout. Returns the checkout url (open that URL; it keeps Stripe's hosted-page fragment). credits is an integer from 500 to 100000 ($5 minimum). Credits are applied only after Stripe reports the session paid. Returns the API error when Stripe is not configured.

NameRequiredDescriptionDefault
api_keyNoWallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.
creditsYesCredits to buy. 1 credit = $0.01 USD. Minimum 500 credits ($5). Same limits as POST /v1/wallets/:id/checkout.
wallet_idNoWallet to credit. Defaults to the wallet that owns the API key.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare the mutation/read-write profile, and the description adds genuinely useful behavior: it returns a checkout URL that must be opened, credits are only applied after Stripe reports the session paid, and an API error is returned when Stripe is not configured. That async-settlement and failure-mode context goes beyond what the annotations convey, though it stops short of covering repeat invocations or session expiry.

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 underlying route, and the operational notes (open the URL, credits applied post-payment) each earn their space. There is mild redundancy in restating the credits range already present in 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?

With no output schema, the description correctly compensates by explaining the return value (the checkout URL) and its handling. It also covers the Stripe-not-configured error path and the delayed credit application, leaving only minor gaps around wallet prerequisites and idempotency on repeat calls.

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 three parameters are already documented, including the 500–100000 range and the 1 credit = $0.01 conversion. The description largely restates the credits bounds and adds little syntax or format detail beyond the schema, 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?

Names a specific verb and resource: starting a Stripe Checkout credit top-up, and anchors it to the underlying POST /v1/wallets/:id/checkout route so the agent knows exactly what is invoked. It does not, however, distinguish itself from the sibling `purchase`, which an agent could plausibly confuse with this tool.

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 this is the way to buy credits via Stripe's hosted page, but there is no explicit when-to-use statement and no guidance on choosing between this and the sibling `purchase`. No prerequisites (e.g., needing a valid wallet) or exclusions are given.

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

create_jobCreate escrow jobA
Idempotent
Inspect

Hold credits in escrow for a job another agent will do; release when the work is delivered, refund if not. Debits amount_credits from the authenticated payer wallet and marks the job held. payee_wallet_id receives the credits on release. Rejects amount_credits below 1, a payer equal to the payee, a missing or other-mode payee wallet, and insufficient balance. idempotency_key makes a retry return the same job without debiting twice. Same as POST /v1/jobs.

NameRequiredDescriptionDefault
api_keyNoWallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.
descriptionYesWhat the payee is being paid to do.
amount_creditsYesCredits to debit from the authenticated payer wallet and hold until release or refund.
idempotency_keyYesCaller-chosen key scoped to the payer. A retry with the same key and the same parameters returns the original job and does not debit again.
payee_wallet_idYesWallet that receives the credits when the payer releases the job.

TDQS

A4.2/5.0
Behavior4/5

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

Adds substantial behavior beyond the annotations: it names the exact funding source (authenticated payer wallet), enumerates the rejection conditions (amount_credits < 1, payer == payee, missing/other-mode payee wallet, insufficient balance), and spells out the idempotency contract that a retry returns the same job without double-debiting. The annotations already cover readOnly=false and idempotent=true, so this is useful amplification rather than the sole disclosure, and the one remaining gap is the response shape.

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

Conciseness5/5

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

Four tightly packed sentences with the escrow purpose front-loaded, followed by debit mechanics, failure conditions, and idempotency. Every clause carries information and nothing is 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 mutation tool with no output schema, the description covers funding, validation failures, idempotency, and the API equivalent, which is most of what an agent needs to invoke it safely. It never says what the created job object returns (job id, status field), which is the one item an agent must infer from 'returns the same job', so it is strong but 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 100%, so every parameter is already documented in the schema, and the description largely restates that content (amount_credits minimum, idempotency_key retry behavior, payee receiving credits on release). It adds the cross-field rule that payer must differ from payee, but that is a small increment over an already complete schema, so the baseline of 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?

States a concrete verb and resource ('Hold credits in escrow for a job') and pins down the exact lifecycle moment, which cleanly separates it from the sibling release_job and refund_job tools that act on an existing job. The closing 'Same as POST /v1/jobs' anchors it to a known API surface, so an agent can place 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?

Gives clear context for when this tool applies: the escrow-hold step whose credits are later released or refunded, which implicitly routes the agent to release_job/refund_job for those follow-ups. It stops short of any explicit when-not or named alternative (e.g. create_checkout or purchase), so the guidance is contextual rather than directive.

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

get_balanceGet balanceA
Read-onlyIdempotent
Inspect

Return the authenticated wallet id and prepaid credit balance. Same as GET /v1/balance. Does not return the API key.

NameRequiredDescriptionDefault
api_keyNoWallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent and non-destructive behavior, so the safety profile is covered. The description adds genuinely new behavioral context: it maps to GET /v1/balance and explicitly states the API key is NOT returned, which is security-relevant output information absent from the annotations and schema.

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

Conciseness5/5

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

Three short, front-loaded sentences with zero filler. The primary capability is stated first, followed by the REST equivalent and the explicit exclusion.

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 wallet query with rich annotations and full parameter documentation, the description supplies what is missing (returned fields, REST mapping, no secret leakage). Only the absence of any error/authentication-failure behavior keeps this from a 5.

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%: the single api_key parameter is fully documented, including the Bearer fallback and the BOTSUPPLY_API_KEY env var. The description adds nothing about parameters, so the baseline 3 applies.

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

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 (returns the wallet id and prepaid credit balance), which clearly distinguishes it from siblings like create_checkout or purchase. It stops short of explicitly contrasting itself with any sibling tool, 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 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 alternatives are named. The agent can infer this is the tool for checking available credit, but nothing tells it how balance checking relates to purchase or open_wallet flows.

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

get_jobGet escrow jobA
Read-onlyIdempotent
Inspect

Return an escrow job's status (held, released, or refunded), the held amount, any release fee, and the payer and payee wallets. The caller must be the payer or the payee. A job from another Stripe mode is not visible. Same as GET /v1/jobs/:id.

NameRequiredDescriptionDefault
job_idYesEscrow job id returned by create_job (job_…).
api_keyNoWallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context beyond the annotations: an authorization requirement (caller must be payer or payee) and a cross-mode visibility quirk. It still doesn't say what an errored or not-found call looks like, but the additions are substantive.

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 short sentences, front-loaded with the return payload, then access rules, then the REST endpoint mapping. Every sentence earns its place and none of it repeats structured fields verbatim.

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 present, the description must describe return values and it does so explicitly. Access constraints and mode scoping are covered, and the annotations handle the idempotency/read-only profile, so an agent has everything needed to 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%, including the job_… id format and the api_key fallback chain, so the schema already carries the parameter burden. The description adds no syntax or format detail beyond what the schema states, making the baseline 3 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?

States a specific verb and resource ('Return an escrow job's status') and enumerates the exact payload the agent will receive (status, held amount, release fee, payer/payee wallets). The read-only framing is clearly distinguishable from the sibling mutators create_job, release_job, and refund_job.

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 concrete eligibility precondition ('The caller must be the payer or the payee') and an exclusion ('A job from another Stripe mode is not visible'), which tells the agent when this call will fail or return nothing. It does not name an alternative tool for cases that fall outside those conditions, so it stops short of full when/when-not/alternatives guidance.

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

get_receiptGet purchase receiptA
Read-onlyIdempotent
Inspect

Read a public purchase receipt: what was reported as approved, scope, price cap, merchant, proofs, payments, content hash, approver_confirmation, pay_allowed, and public_view. external_payment_ref is the latest recorded payment ref, or the approval-time ref when no payment is recorded. paid_before_confirmation and over_cap are true when any recorded payment has that flag. Those three fields are derived at read time and do not change the signed row. status is unconfirmed, confirmed, or declined. confirmed means the person with access to the contact clicked Confirm, with time and channel. unconfirmed is the default and is not a verification of the person. pay_allowed is true only when approver_confirmation.status is confirmed, or when no approver_contact was given and the price cap is under RECEIPT_CONFIRM_THRESHOLD (default 100, in the price cap currency). Agents must poll get_receipt and pay only when pay_allowed is true. When public_view is redacted, the approver is initials, the agent name is Agent, contacts are omitted, and payment refs and proof values are on file plus the last 4 characters. BotSupply does not move the money. The approver name is what the calling agent reported. No API key. The raw contact, confirm link, and edit token are not included. Poll this to learn the click result. Same as GET /v1/receipts/:id.

NameRequiredDescriptionDefault
receipt_idYesPublic receipt id (rcpt_…).

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/destructive, but the description adds substantial context beyond them: derived fields (external_payment_ref, paid_before_confirmation, over_cap) that don't change the signed row, the pay_allowed gating logic, redaction behavior under public_view, that BotSupply doesn't move money, and that raw contact/confirm link/edit token are excluded. This is rich disclosure of non-obvious read 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 purpose, then dense but mostly load-bearing detail about status, pay_allowed, and redaction. It is a long single block with a few run-on sentences, but nearly every clause carries decision-relevant information.

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?

There is no output schema, so the description must describe the return shape, and it does so comprehensively (status values, derived flags, pay_allowed rule, redaction. Nothing an agent needs to call and interpret this tool 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?

With a single parameter at 100% schema coverage, the schema already fully documents receipt_id ('Public receipt id (rcpt_…)'). The description confirms the public nature of the id but adds no syntax or format beyond the schema, 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?

The description opens with the specific verb+resource 'Read a public purchase receipt' and then enumerates the returned fields, so the agent knows exactly what this tool does. It does not explicitly differentiate itself from the sibling verify_receipt, which is the main thing keeping it below 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 Guidelines4/5

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

Provides clear operational context: 'Agents must poll get_receipt and pay only when pay_allowed is true' and 'Poll this to learn the click result.' This tells the agent when to call it, but it does not name or exclude alternatives (e.g., verify_receipt), so it stops short of full routing guidance.

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

list_catalogList catalogA
Read-onlyIdempotent
Inspect

List live BotSupply SKUs, credit prices, short descriptions, and what a purchase does not include. Payloads stay behind purchase. recipe.book-table, when listed, is recipe documentation only and does not place a reservation.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/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 non-open-world, so the safety profile is covered. The description adds genuinely new behavior context: only live SKUs are listed, payloads are withheld until purchase, and recipe.book-table entries are docs that do not trigger a reservation.

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-loads the returned fields in one sentence, then adds two short qualifiers about payloads and recipe.book-table. Every sentence earns its place, though the phrase 'what a purchase does not include' is slightly abstract.

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 and no parameters, the description carries the burden of describing what comes back, and it does so (SKUs, prices, descriptions, exclusions). An agent can invoke this correctly, though it never states format or pagination.

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 there is nothing for the description to clarify; the 4 baseline applies. The description instead spends its words on return content, which is appropriate here.

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 (List) and resource (live BotSupply SKUs) plus the fields surfaced: credit prices, short descriptions, and purchase exclusions. It also differentiates itself from the sibling purchase tool by noting payloads are withheld and that recipe.book-table is documentation, not a reservation.

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: 'Payloads stay behind purchase' hints that purchase is the route to payloads, and the recipe note implies this is a read-only reference. There is no explicit 'use this vs. purchase/create_checkout' routing statement or precondition guidance.

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

open_walletOpen walletAInspect

Create a wallet and return wallet_id plus api_key once, with balance_credits 0. Same as POST /v1/wallets. This does not look up an existing wallet. Keep the api_key; later tools need it as Authorization: Bearer or as api_key.

NameRequiredDescriptionDefault
labelNoOptional label, 1 to 80 characters. Same field as POST /v1/wallets.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations declare the safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=false), and the description adds genuinely operational context beyond them: the api_key is returned only once, it must be retained, and it is consumed by later calls as a Bearer token. That once-only credential disclosure is exactly the kind of behavioral trait annotations cannot express.

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 action and the returned artifacts, then the negative scope, then the credential-handling requirement. Every clause carries non-redundant information.

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 present, the description carries the return-value burden itself and does so by naming wallet_id, api_key, and balance_credits, plus how the api_key is subsequently used. Nothing essential for correct invocation 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% and the single optional 'label' parameter is fully documented in the schema, including its 1-80 character bound and its equivalence to POST /v1/wallets. The description adds no parameter-level detail, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("Create a wallet") plus the exact return payload (wallet_id, api_key, balance_credits 0). It also negates a nearby misconception with "This does not look up an existing wallet," so an agent can tell it apart from any retrieval-style call and from siblings like get_balance or create_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?

Gives explicit when-not guidance ("does not look up an existing wallet") and forward-looking usage ("later tools need it as Authorization: Bearer or as api_key"). It stops short of naming a concrete alternative sibling for wallet lookup, but no such sibling exists in the listed set, so the guidance is contextually sufficient.

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

purchasePurchaseAInspect

Buy one live catalog SKU with prepaid credits. Sends { sku } to POST /v1/purchase and returns that JSON, including the pack or recipe payload. Does not place a reservation. recipe.book-table is documentation the buying agent runs itself. An unknown SKU is rejected. Insufficient balance returns an error and does not deduct credits.

NameRequiredDescriptionDefault
skuYesLive catalog SKU. The field name is sku, not sku_id.
api_keyNoWallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare non-read-only, non-idempotent, non-destructive, closed-world, so the bar is lower. The description still adds real value: the exact request shape and endpoint, the no-reservation guarantee, unknown-SKU rejection, and that an insufficient balance fails without deducting credits — all non-obvious failure semantics.

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

Conciseness5/5

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

Five short sentences, front-loaded with the core action and credit implication, then progressively narrower caveats. Each sentence carries distinct information — mechanism, endpoint, return, exclusion, error behavior — with no repetition of the title or 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?

With no output schema, the description covers the return ('returns that JSON, including the pack or recipe payload') and the auth story is handled in the schema, so an agent has enough to call it. It stops short of stating retry/idempotency consequences of a failed or repeated purchase, which is the one remaining gap for a spend-credits operation.

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

Parameters3/5

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

Schema coverage is 100%, so sku and api_key are already fully documented, including the sku-vs-sku_id warning and the BOTSUPPLY_API_KEY fallback. The description only restates that sku is the sent body field, adding no format or constraint detail beyond the schema, so the 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 (buy) and resource (one live catalog SKU) with the exact credit mechanism and endpoint (POST /v1/purchase). The scope phrase 'one live catalog SKU' cleanly separates it from list_catalog, create_checkout, and get_balance without needing to open any 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 rules out adjacent behavior ('Does not place a reservation') and clarifies that recipe.book-table is documentation the caller runs itself, which prevents a mistaken tool call. However it never states when to choose this over siblings like create_checkout, so the when-to-use decision is only implied by the word 'buy'.

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

record_approvalRecord reported approvalAInspect

Write a record of what was reported as approved for a purchase on any payment rail. The approver is a name supplied by the calling agent; this does not confirm who approved. BotSupply does not hold or move the money. Returns receipt_id, a public receipt_url, and an edit_token shown once. If approver_contact is an email, also issues a single-use expiring confirm link. When no email provider is configured, the response includes confirm_url and nothing is sent; the caller delivers that link. A click is a signed hash-chain event. approver_confirmation.status stays unconfirmed until the person with access to that contact clicks Confirm or Decline. confirmed means that person clicked Confirm. It is not a legal-identity check, and an unconfirmed receipt is not a verification of the person. Without an email approver_contact, pay_allowed is true only when the price cap is under RECEIPT_CONFIRM_THRESHOLD (default 100, in the price cap currency). At or above that threshold the receipt still records and shows that confirmation is required, and pay_allowed stays false. Poll get_receipt and pay only when pay_allowed is true. Optional public_view is full (default) or redacted, with optional public_scope for the redacted public text. That display setting is outside the hash. No wallet or API key. Rate limited per IP. Same as POST /v1/receipts.

NameRequiredDescriptionDefault
scopeYesWhat was reported as approved, in plain text.
agent_idNoOptional id of the agent that will pay. Not a BotSupply API key.
approverYesName the calling agent reports as the approver. Not confirmation that this person approved.
agent_nameNoOptional display name of the paying agent.
public_viewNoPublic display. full (default) or redacted. Stored outside the hash, so changing it later does not break verify. redacted shows initials, hides contacts, and shortens payment refs and proof values.
merchant_urlNoOptional http or https URL for the merchant.
payment_railYesHow the agent will pay. Examples: stripe_link, card, x402, botsupply_wallet.
public_scopeNoOptional scope shown on the public receipt while public_view is redacted. The stored scope is unchanged and is what the approver confirms.
merchant_nameYesMerchant or seller name.
approver_contactNoOptional email string, or { channel: "email", address }. An email issues a one-time confirm link. The address is stored only as a hash. sms is reserved and rejected until a sender exists. A non-email string is stored as a hash only and does not issue a link.
price_cap_amountYesMaximum amount reported as approved. A positive decimal, for example 25 or "19.95".
price_cap_currencyYesCurrency code, 3 to 10 letters, for example USD or USDC.
external_payment_refNoOptional id from the payment rail. BotSupply does not look it up.
confirmation_webhook_urlNoOptional public https URL. After the contact clicks Confirm or Decline, BotSupply POSTs { receipt_id, approver_confirmation }. Best-effort. Poll get_receipt if it does not arrive. Requires an email approver_contact.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, the description discloses critical behavior: no custody of funds, rate limiting per IP, one-time edit_token, single-use expiring confirm links, hash-chain click events, and the threshold rule where pay_allowed remains false at or above RECEIPT_CONFIRM_THRESHOLD without an email contact. It also clarifies that confirmation is not a legal-identity check. This is rich behavioral context that annotations alone do not provide.

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 dense and front-loads the core action before moving into confirmation semantics and threshold behavior. There is some redundancy around what "confirmed" does and does not mean, but every major sentence serves a purpose for a complex, high-stakes 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?

There is no output schema, but the description still explains the return shape (receipt_id, public receipt_url, edit_token shown once, optional confirm_url) and the webhook behavior. Combined with the threshold logic and polling instructions, it gives an agent enough to invoke and handle the response correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful cross-parameter behavior: email approver_contact issues a confirm link, non-email is stored only as a hash and issues no link, and public_view/public_scope settings sit outside the hash. It also explains how approver_contact and price_cap_amount interact with pay_allowed and the confirmation threshold, which goes beyond 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?

The description opens with a specific verb and resource: writing a record of what was reported as approved for a purchase on any payment rail. It distinguishes this from money-movement tools by explicitly stating "BotSupply does not hold or move the money" and ties into the broader flow with "Poll get_receipt and pay only when pay_allowed is true." An agent can identify this as a receipt/approval record, not a checkout or payment execution 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 gives clear workflow guidance for after the call: poll get_receipt and only pay when pay_allowed is true, and explains the no-email-provider fallback where the caller must deliver confirm_url. It does not explicitly name sibling alternatives like record_payment, nor does it state when not to use this tool, but the operational context is clear.

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

record_paymentRecord a paymentAInspect

Record a payment the calling agent already made against a receipt. BotSupply does not hold or move the money. Requires the edit_token from record_approval. Appends a signed hash-chain event payment_recorded. paid_at defaults to now. Sets paid_before_confirmation when the payment time is before the confirm event, or when a contact was set and the receipt was never confirmed. Sets over_cap when amount exceeds the price cap. Those cases are stored and flagged. They are not rejected. Poll get_receipt and pay only when pay_allowed is true; recording an early or over-cap payment does not make pay_allowed true. Same as POST /v1/receipts/:id/payment.

NameRequiredDescriptionDefault
amountYesAmount paid, in the receipt price-cap currency. over_cap is true when this exceeds the price cap. The payment is still recorded.
paid_atNoWhen the payment happened, ISO-8601. Omit to use the server time. paid_before_confirmation is true when this is earlier than the confirm event, or when a contact was set and the receipt was never confirmed. The payment is still recorded.
edit_tokenYesSecret returned once by record_approval. Required to record a payment.
receipt_idYesReceipt id from record_approval (rcpt_…).
external_payment_refYesId from the payment rail. BotSupply does not look it up and does not move the money.

TDQS

A4.5/5.0
Behavior4/5

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

Rich disclosure beyond annotations: hash-chain event payment_recorded, paid_at defaulting to now, the paid_before_confirmation and over_cap flags, and the crucial "stored and flagged... not rejected" semantics. What's missing is retry guidance: idempotentHint is false, so an agent should be warned about re-submitting the same external_payment_ref and double-recording.

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 purpose before mechanics, and nearly every sentence carries a distinct rule. Some sentences are fragmentary ("Those cases are stored and flagged. They are not rejected.") and the passage is dense, but nothing is redundant with 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?

Covers the prerequisite token, flags, and the follow-up action (poll get_receipt) needed to act correctly, which compensates for having no output schema. A brief note on what the call returns or how to safely retry would close the last gap for a non-idempotent write.

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 baseline is 3; the description still adds value by explaining what edit_token's provenance is, that paid_at defaults to now, and the consequence of an over-cap amount. external_payment_ref's behavior is left entirely to the schema, so it's not a full 5.

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?

"Record a payment the calling agent already made against a receipt" names a specific verb (record), resource (payment), and scope (a payment already made, not one BotSupply executes). The added "BotSupply does not hold or move the money" separates it cleanly from siblings like create_checkout, purchase, and refund_job.

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 a hard prerequisite ("Requires the edit_token from record_approval"), and a precise sequencing rule with the sibling: "Poll get_receipt and pay only when pay_allowed is true." It also explicitly says recording does not flip pay_allowed, which tells the agent when this tool alone is insufficient.

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

refund_jobRefund escrow jobAInspect

Return held escrow credits to the payer when the work is not delivered or the job is cancelled. The payer or the payee can refund, and only while the job is held. The full hold goes back to the payer; no platform fee is taken. Refunding twice, or refunding after release, is rejected and does not move credits again. Same as POST /v1/jobs/:id/refund.

NameRequiredDescriptionDefault
job_idYesEscrow job id returned by create_job (job_…).
api_keyNoWallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the money movement (full hold returns to payer, no platform fee taken), the authorization model (payer or payee), and the rejection behavior on repeat or post-release calls. It also maps the tool to its REST equivalent (POST /v1/jobs/:id/refund). The non-idempotent-but-guarded behavior described is consistent with idempotentHint=false.

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?

Five tight sentences, front-loaded with the core action and its condition, then authorization, then the credit outcome, then the error guards. Every sentence carries distinct information with no 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?

There is no output schema, and the description covers the essential return behavior (full hold back to payer, no fee) and error cases, which is close to sufficient. It does not describe the response shape or any resulting job status, a minor gap for a mutation tool 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% and both parameters (job_id, api_key) are documented there, including the bsk_ prefix and the BOTSUPPLY_API_KEY fallback. The description adds no parameter-level detail beyond that, so the 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 ('Return held escrow credits to the payer') plus the triggering conditions (work not delivered, job cancelled). It implicitly distinguishes itself from the sibling release_job by explaining that 'refunding after release is rejected', so an agent can route without opening schemas.

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

Usage Guidelines4/5

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

Gives clear preconditions: only while the job is held, and either payer or payee may invoke it. It also names the failure cases (double refund, refund after release) that should steer an agent away. It never explicitly names release_job as the alternative path, so it stops just short of full when/when-not/alternative guidance.

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

release_jobRelease escrow jobAInspect

Release held escrow credits to the payee when the work is delivered. Only the payer can release, and only while the job is held. ESCROW_FEE_BPS (default 0) is withheld on release, recorded on the job, and credited to nobody; the payee receives amount_credits minus that fee. Releasing twice, or releasing after a refund, is rejected and does not move credits again. Same as POST /v1/jobs/:id/release.

NameRequiredDescriptionDefault
job_idYesEscrow job id returned by create_job (job_…).
api_keyNoWallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false, idempotentHint=false, destructiveHint=false. The description goes well beyond that: caller authorization (payer only), lifecycle precondition (job must be held), fee withholding semantics (ESCROW_FEE_BPS recorded on job, credited to nobody), and duplicate/after-refund rejection behavior with no credit movement.

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?

Front-loaded with purpose, then authorization, then fee mechanics, then failure modes, then the REST mapping. Every sentence carries a distinct fact and nothing is repeated from the schema.

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 two-parameter mutation tool with no output schema, the description covers permissions, preconditions, credit math, idempotency, and error outcomes — everything an agent needs to invoke it correctly and predict the effect.

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 there (job_id format, api_key fallback behavior). The description adds no parameter-level detail beyond incidental mentions of amount_credits and the ESCROW_FEE_BPS config value, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb+resource (release held escrow credits to the payee) plus the triggering condition (work delivered). It is clearly separable from siblings like refund_job and get_job without opening any schema.

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

Usage Guidelines4/5

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

Gives concrete when/when-not conditions: only the payer may release, only while the job is held, and release after a refund or a second release is rejected. It stops short of explicitly naming refund_job as the alternative path, so it is strong context rather than full routing.

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

set_receipt_visibilitySet receipt public viewA
Idempotent
Inspect

Change a receipt's public display to full or redacted. Requires the edit_token from record_approval. Optional public_scope replaces the scope shown publicly while redacted. Stored outside the hash chain, so the content hash and verify result do not change. redacted shows the approver as initials, the agent name as Agent, no email or phone, and payment refs and proof values as on file plus the last 4 characters. Merchant name, merchant URL, amounts, cap, timeline, and statuses stay visible. BotSupply does not move money. Same as POST /v1/receipts/:id/visibility.

NameRequiredDescriptionDefault
edit_tokenYesSecret returned once by record_approval. Required to change the public view.
receipt_idYesReceipt id from record_approval (rcpt_…).
public_viewYesfull shows the record with emails and phones masked. redacted hides purchaser details.
public_scopeNoOptional. Replaces the scope on the public receipt while redacted. Omit to leave the stored public scope unchanged.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare idempotent, non-destructive, mutating semantics, and the description adds substantial context: the change is stored outside the hash chain so content hash and verify result are unaffected, exactly what redaction hides vs. shows, and that BotSupply does not move money. This is rich disclosure well beyond 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?

Front-loaded with the core action and required token, then supporting details. The redaction enumeration is dense but each clause carries distinct meaning; slightly verbose but no clear waste.

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?

No output schema exists, and the description compensates by explaining what changes and what stays visible. It omits any error/authorization failure behavior for an invalid edit_token, a minor 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?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning: public_scope only applies while redacted, and redacted's display consequences are spelled out. The enum values are also contextualized beyond the schema's brief fields.

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 (change) and resource (a receipt's public display) with an explicit value set (full or redacted), so an agent can distinguish this from siblings like verify_receipt or record_approval 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?

Names the prerequisite for use (edit_token from record_approval) and describes the optional public_scope condition. It does not name an alternative sibling tool or state when NOT to use it, so it falls short of explicit routing guidance.

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

verify_receiptVerify purchase receiptA
Read-onlyIdempotent
Inspect

Recompute the receipt hash chain and HMAC signature. valid is true when the stored receipt matches the chain and the server signature, so the record hasn't been changed since it was created. valid does not confirm who approved. The result also includes approver_confirmation: unconfirmed, confirmed, or declined. confirmed means the person with access to the contact clicked Confirm. valid is false when a row was altered. Same as GET /v1/receipts/:id/verify.

NameRequiredDescriptionDefault
receipt_idYesPublic receipt id (rcpt_…).

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds genuinely non-obvious behavior beyond that: it recomputes a hash chain plus HMAC, `valid` collapses chain-match and server-signature checks, `valid` is false specifically when a row was altered, and `valid` says nothing about approval. That is substantive disclosure for a tool with no output schema.

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 integrity semantics and the `valid` / `approver_confirmation` split are front-loaded in the opening sentences, and the endpoint mapping is a useful trailing anchor. There is mild redundancy in restating falsity twice ('valid is false when a row was altered' after 'valid is true when…'), but nothing wasteful overall.

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 must carry the return semantics, and it does: it defines `valid` and all three `approver_confirmation` values. It doesn't cover what a hash-chain mismatch looks like in the response shape or any error behavior for an unknown receipt id, leaving a small gap for a single-parameter integrity tool.

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 `receipt_id` parameter is documented as the public rcpt_… id in the schema itself. The description adds no format, sourcing, or failure-mode guidance for that id (e.g. what happens on an unknown id), 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 names a specific action (recompute the receipt hash chain and HMAC signature) against a specific resource (a stored receipt), and defines what the resulting `valid` flag means, which makes the integrity-check intent distinguishable from retrieval siblings such as get_receipt. It stops short of explicitly contrasting itself with those siblings, 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?

Usage is implied by the semantics of `valid` (use it to check a record hasn't been altered), and the description explicitly bounds scope with 'valid does not confirm who approved', pointing the agent toward `approver_confirmation` for that question. There is no explicit when-to-use guidance relative to get_receipt or record_approval, and no stated preconditions, so it stays at minimum-viable.

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. 2 tool updates
    • Changedrecord_approval2 fields changed
      • addedInput schema / properties / public_scope
        Added value: +{
        +  "description": "Optional scope shown on the public receipt while public_view is redacted. The stored scope is unchanged and is what the approver confirms.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
      • addedInput schema / properties / public_view
        Added value: +{
        +  "description": "Public display. full (default) or redacted. Stored outside the hash, so changing it later does not break verify. redacted shows initials, hides contacts, and shortens payment refs and proof values.",
        +  "enum": [
        +    "full",
        +    "redacted"
        +  ],
        +  "type": "string"
        +}
    • Addedset_receipt_visibility
  2. 1 tool update
    • Addedrecord_payment
  3. 1 tool update
    • Changedrecord_approval5 fields changed
      • addedInput schema / properties / approver_contact / anyOf
        Added value: +[
        +  {
        +    "maxLength": 320,
        +    "type": "string"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "address": {
        +        "maxLength": 320,
        +        "type": "string"
        +      },
        +      "channel": {
        +        "description": "email today. sms is reserved.",
        +        "enum": [
        +          "email",
        +          "sms"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "channel",
        +      "address"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedInput schema / properties / approver_contact / description
        Previous value: -"Optional email or phone. Stored only as a hash and never shown on the receipt."New value: +"Optional email string, or { channel: \"email\", address }. An email issues a one-time confirm link. The address is stored only as a hash. sms is reserved and rejected until a sender exists. A non-email string is stored as a hash only and does not issue a link."
      • removedInput schema / properties / approver_contact / maxLength
        Removed value: -320
      • removedInput schema / properties / approver_contact / type
        Removed value: -"string"
      • addedInput schema / properties / confirmation_webhook_url
        Added value: +{
        +  "description": "Optional public https URL. After the contact clicks Confirm or Decline, BotSupply POSTs { receipt_id, approver_confirmation }. Best-effort. Poll get_receipt if it does not arrive. Requires an email approver_contact.",
        +  "type": "string"
        +}
  4. 1 tool update
    • Changedrecord_approval3 fields changed
      • changedInput schema / properties / approver / description
        Previous value: -"Display name or handle of the human who approved the purchase."New value: +"Name the calling agent reports as the approver. Not confirmation that this person approved."
      • changedInput schema / properties / price_cap_amount / description
        Previous value: -"Maximum amount approved. A positive decimal, for example 25 or \"19.95\"."New value: +"Maximum amount reported as approved. A positive decimal, for example 25 or \"19.95\"."
      • changedInput schema / properties / scope / description
        Previous value: -"What the human approved, in plain text."New value: +"What was reported as approved, in plain text."
  5. 4 tool updates
    • Addedattach_proof
    • Addedget_receipt
    • Addedrecord_approval
    • Addedverify_receipt
  6. 4 tool updates
    • Addedcreate_job
    • Addedget_job
    • Addedrefund_job
    • Addedrelease_job
  7. 1 tool update
    • Changedcreate_checkout2 fields changed
      • changedInput schema / properties / credits / description
        Previous value: -"Credits to buy. 1 credit = $0.01 USD. Same limits as POST /v1/wallets/:id/checkout."New value: +"Credits to buy. 1 credit = $0.01 USD. Minimum 500 credits ($5). Same limits as POST /v1/wallets/:id/checkout."
      • changedInput schema / properties / credits / minimum
        Previous value: -100New value: +500
  8. 5 tool updates
    • First observedcreate_checkout
    • First observedget_balance
    • First observedlist_catalog
    • First observedopen_wallet
    • First observedpurchase

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to create cryptographically verifiable receipts of their delegated work, with capabilities for multi-party approval and offline verification.
    11
    96 npm
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Every agent action is recorded in a SHA-256 hash chain. Prove to clients that your agent did what it said it did. Record, query, verify, and export agent activity.
    3
    27 npm
    2
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources