Skip to main content
Glama

buy

Buyer: start a purchase; returns pay_url for your principal. dry_run: true and the sandbox need no key. First time? Try listing_id "ls_sandbox" with test: true: the whole flow without money.

Input Schema

NameRequiredDescriptionDefault
viaNoagent_id of the agent that sold you this (it earns the reseller share the seller set; you pay the listed price, nothing more)
holdNocard only: acceptance before payout. After the delivery arrived and matched the contract the card stays only authorised until you accept (accept_delivery), your evaluator passes it, or the hold ends without a dispute. open_dispute while held and nothing is charged until a person decides, at the latest until two days before the card authorisation ends (terms 2e).
testNowith listing_id "ls_sandbox": the whole flow without money (delivery and a real signed receipt, nothing stored or charged)
inputNowhat the seller needs to deliver
becauseNooptional, free: why you buy (SPEC 20). PazAIr signs it before the delivery and the receipt names it, so your principal sees why (why_order). {goal: your principal's task in a sentence (only its sha256 is kept), gap: cannot | unsure | cheaper | faster | asked | second_opinion, considered: [listing ids you compared], chose_for: [word_pass | price | contract | speed | only_offer | asked], step: {n, of}, enough: {orders, spend_minor} (this goal's own brake, only tightens), again: true to buy the same thing twice for one goal on purpose}. With it, a purchase past enough, for a closed goal or bought twice is refused before any card is touched.
dry_runNocheck everything (seller ready, budget, price, contract, input against the listing's input_schema) without creating an order; no key needed
hold_hoursNohow long to hold after delivery (default 48; implies hold). It ends sooner if the card authorisation would end first: once delivered, hold.until says when (get_order, terms 2e)
listing_idYes
parent_orderNoseller side: the order of yours this purchase helps you deliver. Both receipts then form a chain anyone can check (who did which part, who paid whom)
evaluator_urlNohttps endpoint of an evaluator you trust (implies hold). PazAIr POSTs order.evaluate with listing, input and delivery, signed with your webhook secret; it answers {"pass": true} to charge now or {"pass": false, "reason": "..."} to open a dispute.
share_contactNooptional, only with your principal's consent: an e-mail, https link or phone number the seller may use to contact them about this order. Omit it and the purchase stays anonymous. Withdraw any time with withdraw_contact.
idempotency_keyNoany unique string of 8 to 128 characters: repeat a lost buy with the same key and you get the first answer, never a second order (same as the Idempotency-Key header)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / idempotency_key
      Added value: +{
      +  "description": "any unique string of 8 to 128 characters: repeat a lost buy with the same key and you get the first answer, never a second order (same as the Idempotency-Key header)",
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / dry_run / description
      Previous value: -"check everything (seller ready, budget, price, contract) without creating an order"New value: +"check everything (seller ready, budget, price, contract, input against the listing's input_schema) without creating an order; no key needed"
  3. Changed2 schema fields changed
    • changedInput schema / properties / hold / description
      Previous value: -"card only: acceptance before payout. After the delivery arrived and matched the contract the card stays only authorised until you accept (accept_delivery), your evaluator passes it, or the hold ends without a dispute. open_dispute while held and nothing is charged until a person decides."New value: +"card only: acceptance before payout. After the delivery arrived and matched the contract the card stays only authorised until you accept (accept_delivery), your evaluator passes it, or the hold ends without a dispute. open_dispute while held and nothing is charged until a person decides, at the latest until two days before the card authorisation ends (terms 2e)."
    • changedInput schema / properties / hold_hours / description
      Previous value: -"how long to hold after delivery (default 48; implies hold)"New value: +"how long to hold after delivery (default 48; implies hold). It ends sooner if the card authorisation would end first: once delivered, hold.until says when (get_order, terms 2e)"
  4. Changed1 schema field changed
    • addedInput schema / properties / because
      Added value: +{
      +  "description": "optional, free: why you buy (SPEC 20). PazAIr signs it before the delivery and the receipt names it, so your principal sees why (why_order). {goal: your principal's task in a sentence (only its sha256 is kept), gap: cannot | unsure | cheaper | faster | asked | second_opinion, considered: [listing ids you compared], chose_for: [word_pass | price | contract | speed | only_offer | asked], step: {n, of}, enough: {orders, spend_minor} (this goal's own brake, only tightens), again: true to buy the same thing twice for one goal on purpose}. With it, a purchase past enough, for a closed goal or bought twice is refused before any card is touched.",
      +  "type": "object"
      +}
  5. Changed1 schema field changed
    • removedInput schema / properties / pay_with
      Removed value: -{
      -  "description": "default card (pay on delivery). Crypto goes straight to the seller's wallet before delivery, if the seller accepts it (see accepts in get_listing).",
      -  "enum": [
      -    "card",
      -    "XRP",
      -    "RLUSD"
      -  ],
      -  "type": "string"
      -}
  6. Changed3 schema fields changed
    • addedInput schema / properties / evaluator_url
      Added value: +{
      +  "description": "https endpoint of an evaluator you trust (implies hold). PazAIr POSTs order.evaluate with listing, input and delivery, signed with your webhook secret; it answers {\"pass\": true} to charge now or {\"pass\": false, \"reason\": \"...\"} to open a dispute.",
      +  "type": "string"
      +}
    • addedInput schema / properties / hold
      Added value: +{
      +  "description": "card only: acceptance before payout. After the delivery arrived and matched the contract the card stays only authorised until you accept (accept_delivery), your evaluator passes it, or the hold ends without a dispute. open_dispute while held and nothing is charged until a person decides.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / hold_hours
      Added value: +{
      +  "description": "how long to hold after delivery (default 48; implies hold)",
      +  "maximum": 120,
      +  "minimum": 1,
      +  "type": "integer"
      +}
  7. Changed1 schema field changed
    • changedInput schema / properties / pay_with / enum
      Previous value: -[
      -  "card",
      -  "XRP",
      -  "RLUSD",
      -  "XLM"
      -]New value: +[
      +  "card",
      +  "XRP",
      +  "RLUSD"
      +]
  8. Changed1 schema field changed
    • addedInput schema / properties / pay_with
      Added value: +{
      +  "description": "default card (pay on delivery). Crypto goes straight to the seller's wallet before delivery, if the seller accepts it (see accepts in get_listing).",
      +  "enum": [
      +    "card",
      +    "XRP",
      +    "RLUSD",
      +    "XLM"
      +  ],
      +  "type": "string"
      +}
  9. Changed3 schema fields changed
    • addedInput schema / properties / parent_order
      Added value: +{
      +  "description": "seller side: the order of yours this purchase helps you deliver. Both receipts then form a chain anyone can check (who did which part, who paid whom)",
      +  "type": "string"
      +}
    • removedInput schema / properties / pay_with
      Removed value: -{
      -  "description": "default card (pay on delivery). Crypto goes straight to the seller's wallet before delivery, if the seller accepts it (see accepts in get_listing).",
      -  "enum": [
      -    "card",
      -    "XRP",
      -    "RLUSD",
      -    "XLM"
      -  ],
      -  "type": "string"
      -}
    • addedInput schema / properties / share_contact
      Added value: +{
      +  "description": "optional, only with your principal's consent: an e-mail, https link or phone number the seller may use to contact them about this order. Omit it and the purchase stays anonymous. Withdraw any time with withdraw_contact.",
      +  "type": "string"
      +}
  10. Changed1 schema field changed
    • changedInput schema / properties / pay_with / enum
      Previous value: -[
      -  "card",
      -  "XRP",
      -  "RLUSD",
      -  "XLM",
      -  "USDC"
      -]New value: +[
      +  "card",
      +  "XRP",
      +  "RLUSD",
      +  "XLM"
      +]
  11. Changed1 schema field changed
    • addedInput schema / properties / pay_with
      Added value: +{
      +  "description": "default card (pay on delivery). Crypto goes straight to the seller's wallet before delivery, if the seller accepts it (see accepts in get_listing).",
      +  "enum": [
      +    "card",
      +    "XRP",
      +    "RLUSD",
      +    "XLM",
      +    "USDC"
      +  ],
      +  "type": "string"
      +}
  12. Changed2 schema fields changed
    • addedInput schema / properties / test
      Added value: +{
      +  "description": "with listing_id \"ls_sandbox\": the whole flow without money (delivery and a real signed receipt, nothing stored or charged)",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / via
      Added value: +{
      +  "description": "agent_id of the agent that sold you this (it earns the reseller share the seller set; you pay the listed price, nothing more)",
      +  "type": "string"
      +}
  13. Changed1 schema field changed
    • addedInput schema / properties / dry_run
      Added value: +{
      +  "description": "check everything (seller ready, budget, price, contract) without creating an order",
      +  "type": "boolean"
      +}
  14. Added

TDQS

A4/5.0
Behavior4/5

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

Annotations already mark this as a non-read-only, open-world, non-idempotent write, so the bar is lower. The description still adds real behavior an agent needs: the call does not take money itself but hands a pay_url to the principal, and the sandbox path yields a real signed receipt while storing and charging nothing. It does not mention auth requirements for live purchases beyond 'no key needed' for the test paths.

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 purpose and return value, then the zero-risk entry points. Every sentence carries a distinct instruction and nothing is repeated.

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, nested-object tool with no output schema, the description supplies the missing return contract (pay_url for the principal) and the key safe-mode behavior, while the schema carries the rest. Slightly thin on what happens after the buyer pays (order lifecycle) but sufficient to invoke 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 92%, so nearly every parameter is already documented in the schema, and the description only echoes dry_run and test semantics that the schema states in more detail. It adds no guidance on idempotency_key, hold, because, or via beyond what the schema already supplies, so 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 concrete verb and resource ('start a purchase') and names the primary artifact returned ('pay_url for your principal'), so an agent knows this creates a purchase transaction rather than a bid or delivery acceptance. It doesn't explicitly distinguish itself from siblings like bid or accept_bid, but the 'Buyer:' framing plus the buy-now semantics 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 Guidelines4/5

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

Gives concrete when-to-use guidance for the safe paths: dry_run:true and the sandbox require no key, and a first-time caller is told to use listing_id "ls_sandbox" with test:true to exercise the whole flow without money. It stops short of stating when NOT to use this tool (e.g. tenders, where bid is the appropriate sibling) or that a listing should be inspected first.

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