Skip to main content
Glama

Last Price

verify_price

Ask whether a price makes sense for its context, rather than what the price should be. Returns a verdict (fair, too_high, too_low, or unknown), the band it was judged against, a signed deviation from the reference, a confidence, and the evidence behind it. A verdict of "unknown" means the price could not be judged, which is not the same as fair. Pass quote_valid_until from the compute_price result the price came from, and where quote expiry is switched on the answer says quote_expired when that quote is stale. Where paid verdicts are switched on, a caller with no key can pay for one verdict with x402: pass payment, a signed payment for the price and terms listed under payments.x402.verify_price in /.well-known/agents.json; a verdict of unknown is not charged. Where buyers' spend limits are switched on and metadata.category names a category, the evidence includes buyer_budget: what buyers' own spend checks allowed for it (buyer_envelope), reported and never counted in the verdict.

Input Schema

NameRequiredDescriptionDefault
geoNoOptional geography hint, e.g. US.
channelNoOptional. The sales channel, e.g. an agent marketplace. With a rate saved by set_channel_rates, the price covers the channel's cut.
paymentNoOptional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header; or, where the answer offers MPP tempo, the whole Payment-Authorization value ("Payment " and the credential). Omit it to read what the call costs and how to pay; nothing is charged until you send it.
currencyNoThree-letter ISO currency code, e.g. USD. Defaults to USD.
metadataNoOptional free-form context.
max_priceNoOptional hard ceiling. Binding: a verdict will never relax it.
min_priceNoOptional hard floor. Binding: a verdict will never relax it.
buyer_typeNoOptional. Who the price is for: an AI agent or a person. Recorded with the quote only.
product_idNoOptional identifier of what is being priced.
buyer_agentNoOptional. The buying agent, e.g. chatgpt. A label recorded with the quote only.
product_typeNoOptional category of what is being priced.
current_priceNoOptional incumbent price. Not required: asking whether a price is sensible does not presuppose an existing one.
outcome_termsNoOptional, for a price charged per outcome: when the outcome counts as failed and what is owed then. The result echoes the terms normalised, with complete false until success_definition, resolve_by and on_timeout are all set.
proposed_priceYesThe price to judge. This is the subject of the call.
customer_segmentNoOptional segment, e.g. enterprise.
quote_valid_untilNoOptional. The valid_until of the compute_price result this price came from (RFC 3339). Where quote expiry is switched on, a time already past is answered with quote_expired: true.

Output Schema

NameRequiredDescriptionDefault
messageNo
verdictNo
currencyNo
confidenceNo
proposed_priceNo
reference_priceNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +false
    • changedInput schema / properties / buyer_agent / description
      Previous value: -"Optional. The buying agent, e.g. chatgpt or agent.example.com. A label recorded with the quote only (while its release flag is on); never sent to the pricing function."New value: +"Optional. The buying agent, e.g. chatgpt. A label recorded with the quote only."
    • changedInput schema / properties / channel / description
      Previous value: -"Optional. The sales channel the price is for, such as a shopping agent or an agent marketplace. When your workspace saved a rate for it with set_channel_rates and channel pricing is on, the price is raised so you keep the same amount after the channel's cut."New value: +"Optional. The sales channel, e.g. an agent marketplace. With a rate saved by set_channel_rates, the price covers the channel's cut."
    • changedInput schema / properties / outcome_terms / description
      Previous value: -"Optional, for a price charged per outcome. When the outcome counts as failed and what is owed then. Where outcome terms are switched on for the workspace, the result carries outcome_terms: these terms normalised, the deadline as a time, the amount owed on timeout, and which terms are missing (complete is false without success_definition, resolve_by and on_timeout). Sending it marks the price as an outcome price; so does metadata.unit \"outcome\"."New value: +"Optional, for a price charged per outcome: when the outcome counts as failed and what is owed then. The result echoes the terms normalised, with complete false until success_definition, resolve_by and on_timeout are all set."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "confidence": {
      +      "type": "number"
      +    },
      +    "currency": {
      +      "type": "string"
      +    },
      +    "message": {
      +      "type": "string"
      +    },
      +    "proposed_price": {
      +      "type": "number"
      +    },
      +    "reference_price": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "verdict": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / payment
      Added value: +{
      +  "description": "Optional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header; or, where the answer offers MPP tempo, the whole Payment-Authorization value (\"Payment \" and the credential). Omit it to read what the call costs and how to pay; nothing is charged until you send it.",
      +  "maxLength": 8192,
      +  "minLength": 20,
      +  "type": "string"
      +}
  3. Changed5 schema fields changed
    • addedInput schema / properties / buyer_agent
      Added value: +{
      +  "description": "Optional. The buying agent, e.g. chatgpt or agent.example.com. A label recorded with the quote only (while its release flag is on); never sent to the pricing function.",
      +  "maxLength": 100,
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / buyer_type
      Added value: +{
      +  "description": "Optional. Who the price is for: an AI agent or a person. Recorded with the quote only.",
      +  "enum": [
      +    "agent",
      +    "person",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / channel
      Added value: +{
      +  "description": "Optional. The sales channel the price is for, such as a shopping agent or an agent marketplace. When your workspace saved a rate for it with set_channel_rates and channel pricing is on, the price is raised so you keep the same amount after the channel's cut.",
      +  "maxLength": 64,
      +  "type": "string"
      +}
    • addedInput schema / properties / outcome_terms
      Added value: +{
      +  "description": "Optional, for a price charged per outcome. When the outcome counts as failed and what is owed then. Where outcome terms are switched on for the workspace, the result carries outcome_terms: these terms normalised, the deadline as a time, the amount owed on timeout, and which terms are missing (complete is false without success_definition, resolve_by and on_timeout). Sending it marks the price as an outcome price; so does metadata.unit \"outcome\".",
      +  "properties": {
      +    "evidence": {
      +      "description": "What proves the outcome, e.g. [\"delivery_receipt\"].",
      +      "items": {
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    "on_timeout": {
      +      "description": "What is owed when the deadline passes without success.",
      +      "enum": [
      +        "no_charge",
      +        "partial",
      +        "full"
      +      ],
      +      "type": "string"
      +    },
      +    "resolve_by": {
      +      "description": "The deadline: an ISO 8601 duration from the quote (P30D, PT48H) or an RFC 3339 time. After it, with no success, the outcome has failed.",
      +      "type": "string"
      +    },
      +    "success_definition": {
      +      "description": "What the buyer must see for the outcome to count.",
      +      "maxLength": 500,
      +      "type": "string"
      +    },
      +    "timeout_share": {
      +      "description": "With on_timeout \"partial\": the fraction of the price owed, e.g. 0.3 for 30%.",
      +      "exclusiveMaximum": 1,
      +      "exclusiveMinimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / quote_valid_until
      Added value: +{
      +  "description": "Optional. The valid_until of the compute_price result this price came from (RFC 3339). Where quote expiry is switched on, a time already past is answered with quote_expired: true.",
      +  "format": "date-time",
      +  "type": "string"
      +}
  4. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnly/openWorld/idempotent/destructive; the description goes well beyond them by disclosing the billing model (one verdict per payment, unknown verdicts are never charged), the expiry behavior (quote_expired on stale quotes), the conditional buyer_budget evidence and that it never affects the verdict, and the semantic difference between 'unknown' and 'fair'. The readOnlyHint=false is consistent with the disclosed fact that it can charge and records quote metadata.

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?

Purpose and return values are front-loaded, and each subsequent clause maps to a distinct concern (judgment semantics, expiry, payment, buyer_budget). It is dense but not padded; the payment sentence stacks several nested clauses and could be split, which is the main structural cost.

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 16-parameter tool with nested objects and an output schema, the description covers the parts that structured fields cannot: the meaning of each verdict including the unknown case, when charging occurs, expiry handling, and the informational-only status of buyer_budget. Return-value detail is already carried by the output schema, so nothing material is left for the agent to guess.

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 earns more by explaining cross-tool provenance for quote_valid_until and the wire format/endpoint for payment (payments.x402.verify_price in /.well-known/agents.json), plus the metadata.category trigger for buyer_budget. It leaves other high-value parameters such as max_price/min_price and outcome_terms entirely to the schema, so it does not fully compensate.

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 subject ('ask whether a price makes sense for its context') and immediately distinguishes itself from the price-generating sibling by the clause 'rather than what the price should be.' It also enumerates the exact return shape (verdict, band, deviation, confidence, evidence), so an agent knows precisely what it gets back and how it differs from compute_price.

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

Usage Guidelines4/5

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

The compute_price vs. verify_price split is explicit, and the description supplies concrete routing instructions: pass quote_valid_until from the compute_price result that produced the price, and use the x402 payment path only when paid verdicts are enabled and no key is present. What's absent is a direct statement of when not to call it (e.g., when no price exists yet, use compute_price first), which is only implied by the quote_valid_until sentence.

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