Skip to main content
Glama

Record reported approval

record_approval

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.

Input Schema

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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema 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"
      +}
  2. Changed5 schema 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"
      +}
  3. Changed3 schema 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."
  4. Added

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources