{
  "_meta": {
    "availability": "Served at /tools and /mcp by every Envoy instance; contract 1 is retired and no longer served. Envoy decides for each purchase who checks out: the agent with a one-time card (checkout_by agent) or Envoy itself (checkout_by envoy)",
    "contract": "envoy@2026-10",
    "evidence": "Served at /tools and /mcp by every Envoy instance. Examples use synthetic data.",
    "publicPaths": {
      "browserTool": "/api/browser/tools/{tool}",
      "disconnect": "/disconnect",
      "installationChallenge": "/installation/challenge",
      "mcp": "/mcp",
      "openapi": "/openapi.json",
      "tool": "/tools/{tool}",
      "tools": "/tools"
    },
    "revision": "envoy@2026-10"
  },
  "tools": [
    {
      "_meta": {
        "personalPaths": [
          "data.account.profile",
          "data.account.addresses"
        ],
        "secretPaths": [],
        "service": "shared"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true,
        "title": "Read account"
      },
      "description": "Read account sections at task start or when the purchase reference is lost. Defaults to balance, services, active_purchase and held_purchases (money in open agent purchases, separate from held by the bank). Add profile for the user's name, verified mobile and email, or addresses for saved delivery addresses to fill checkout forms. Never returns card details.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "include": {
            "default": [
              "balance",
              "services",
              "active_purchase",
              "held_purchases"
            ],
            "description": "Sections to read. A single string is also accepted.",
            "items": {
              "description": "Selected account section.",
              "enum": [
                "balance",
                "limits",
                "services",
                "active_purchase",
                "agent",
                "profile",
                "addresses",
                "held_purchases"
              ],
              "type": "string"
            },
            "type": "array",
            "uniqueItems": true
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "get_account",
      "outputSchema": {
        "properties": {
          "account": {
            "description": "Requested account sections.",
            "type": "object"
          },
          "card": {
            "description": "One-time card, only while ready.",
            "type": "object"
          },
          "checkout_by": {
            "description": "Who completes the merchant checkout. agent: you pay once with the one-time card Envoy releases. envoy: Envoy checks out itself; no card is released, so never open the merchant payment step. Absent until Envoy decides; it can change, so act on the latest reply.",
            "enum": [
              "agent",
              "envoy"
            ],
            "type": "string"
          },
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "follow_up": {
            "description": "Optional feedback call after a completed purchase: tool and args. Add the user's words as answer.",
            "type": "object"
          },
          "money": {
            "description": "What has happened to the user's money.",
            "enum": [
              "not_charged",
              "set_aside",
              "charged",
              "refunding",
              "refunded",
              "unknown"
            ],
            "type": "string"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "next_cursor": {
            "description": "Pass as cursor to list_transactions for the next page.",
            "type": "string"
          },
          "purchase": {
            "description": "question: the open question while situation is needs_answer or needs_details: id, kind and prompt. Show the user prompt word for word. funding: only for a gift-card pay_link task, the URL the user pays, amount and expiry. Never an approval link.",
            "type": [
              "object",
              "null"
            ]
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "spending_closed": {
            "description": "Spending access is closed: no further card details are released. It does not prove the issuer blocked the card, and recovery of any money continues separately.",
            "type": "boolean"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          },
          "transactions": {
            "description": "Spending transactions.",
            "type": "array"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "shared"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true,
        "title": "List transactions"
      },
      "description": "Read the user's transaction history exactly as the Envoy app shows it, newest first, with an opaque pagination cursor. from must not be later than to.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "description": "Opaque pagination cursor bound to this connection, date range and page size.",
            "maxLength": 2048,
            "minLength": 1,
            "type": "string"
          },
          "from": {
            "description": "Start date.",
            "format": "date",
            "type": "string"
          },
          "limit": {
            "description": "Maximum transactions.",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          },
          "to": {
            "description": "End date.",
            "format": "date",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "list_transactions",
      "outputSchema": {
        "properties": {
          "account": {
            "description": "Requested account sections.",
            "type": "object"
          },
          "card": {
            "description": "One-time card, only while ready.",
            "type": "object"
          },
          "checkout_by": {
            "description": "Who completes the merchant checkout. agent: you pay once with the one-time card Envoy releases. envoy: Envoy checks out itself; no card is released, so never open the merchant payment step. Absent until Envoy decides; it can change, so act on the latest reply.",
            "enum": [
              "agent",
              "envoy"
            ],
            "type": "string"
          },
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "follow_up": {
            "description": "Optional feedback call after a completed purchase: tool and args. Add the user's words as answer.",
            "type": "object"
          },
          "money": {
            "description": "What has happened to the user's money.",
            "enum": [
              "not_charged",
              "set_aside",
              "charged",
              "refunding",
              "refunded",
              "unknown"
            ],
            "type": "string"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "next_cursor": {
            "description": "Pass as cursor to list_transactions for the next page.",
            "type": "string"
          },
          "purchase": {
            "description": "question: the open question while situation is needs_answer or needs_details: id, kind and prompt. Show the user prompt word for word. funding: only for a gift-card pay_link task, the URL the user pays, amount and expiry. Never an approval link.",
            "type": [
              "object",
              "null"
            ]
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "spending_closed": {
            "description": "Spending access is closed: no further card details are released. It does not prove the issuer blocked the card, and recovery of any money continues separately.",
            "type": "boolean"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          },
          "transactions": {
            "description": "Spending transactions.",
            "type": "array"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "purchase"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true,
        "title": "List purchases"
      },
      "description": "Use this when the user asks about a purchase and you lack its purchase_id: purchases made through you, newest first. States may be out of date: check one with get_purchase_status before telling the user.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "default": 10,
            "description": "How many, newest first.",
            "maximum": 20,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "list_purchases",
      "outputSchema": {
        "properties": {
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "purchases": {
            "description": "Newest first; state as last seen.",
            "type": "array"
          },
          "situation": {
            "description": "Only on a refusal.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "purchase"
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false,
        "title": "Start a purchase"
      },
      "description": "Start a purchase when the user asks to pay with Envoy or has chosen Envoy as the default for this checkout. Never ask for card details. Retry with the same key; a new key is a new purchase. Send the full cart exactly as the user asked, the delivery address, each item's image and the merchant_logo: the user sees them on the approval screen. Only items bought; no gifts. Never split a cart or lower a total. Envoy decides who checks out: read checkout_by in each reply. agent: you get a one-time card. envoy: Envoy checks out; never open the payment step. Envoy never shares a browser live-view link.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "address": {
            "description": "Delivery address on one line, with recipient name, phone and 6-digit PIN code. Prefer address_id from get_account. Do not also send address_id.",
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          },
          "address_id": {
            "description": "Saved address ID from get_account with include addresses. Preferred over address. Do not also send address.",
            "maxLength": 64,
            "minLength": 1,
            "type": "string"
          },
          "facts": {
            "description": "Order facts.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "code": {
                  "description": "deliver_to|arrives|sold_by|restaurant|check_in|check_out|cancellation|booked_for",
                  "type": "string"
                },
                "value": {
                  "type": "string"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "idempotency_key": {
            "description": "One key per intent; retry with the same key. A new key is a new purchase.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*$",
            "type": "string"
          },
          "items": {
            "description": "What to buy, one entry per product. Only items being bought: no free gifts or ₹0 lines.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "image": {
                  "description": "Direct URL of the product image shown on the cart or product page. Used only to show the user what they are approving. Starts with https://; a bare domain or http:// is upgraded to https://.",
                  "pattern": "^(?:[Hh][Tt][Tt][Pp][Ss]?://)?[^\\s/?#:@]+\\.[^\\s/?#:@]+(?:[/?#]\\S*)?$",
                  "type": "string"
                },
                "name": {
                  "description": "Item name, including size, colour or variant.",
                  "maxLength": 200,
                  "minLength": 1,
                  "type": "string"
                },
                "price": {
                  "description": "Line price in rupees, quantity included.",
                  "type": "string"
                },
                "product_id": {
                  "description": "A search_products product's product_id, on every item or none.",
                  "pattern": "^ofr_[a-f0-9]{32}$",
                  "type": "string"
                },
                "quantity": {
                  "default": 1,
                  "description": "Quantity; default 1. Numeric string also accepted.",
                  "maximum": 99,
                  "minimum": 1,
                  "type": "integer"
                },
                "url": {
                  "description": "Item page URL. Starts with https://; a bare domain or http:// is upgraded to https://.",
                  "pattern": "^(?:[Hh][Tt][Tt][Pp][Ss]?://)?[^\\s/?#:@]+\\.[^\\s/?#:@]+(?:[/?#]\\S*)?$",
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": "object"
            },
            "maxItems": 20,
            "minItems": 1,
            "type": "array"
          },
          "max_total": {
            "description": "Highest total the user accepts; defaults to total. The card's hard limit: set it above total if fees may still be added. Rupees, up to 2 decimals; number also accepted, \"₹\" and thousands commas are stripped.",
            "maxLength": 20,
            "pattern": "^[0-9]+(?:\\.[0-9]{1,2})?$",
            "type": "string"
          },
          "merchant_logo": {
            "description": "Merchant logo or brand image URL, as shown on the page. Starts with https://; a bare domain or http:// is upgraded to https://.",
            "pattern": "^(?:[Hh][Tt][Tt][Pp][Ss]?://)?[^\\s/?#:@]+\\.[^\\s/?#:@]+(?:[/?#]\\S*)?$",
            "type": "string"
          },
          "merchant_url": {
            "description": "Merchant checkout or product URL; the merchant name is taken from its domain. Starts with https://; a bare domain or http:// is upgraded to https://.",
            "pattern": "^(?:[Hh][Tt][Tt][Pp][Ss]?://)?[^\\s/?#:@]+\\.[^\\s/?#:@]+(?:[/?#]\\S*)?$",
            "type": "string"
          },
          "order_title": {
            "description": "Display only, as shown, like price_lines and facts; Envoy drops what it cannot show. Order title.",
            "type": "string"
          },
          "price_lines": {
            "description": "Bill lines adding up to total.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "amount": {
                  "description": "Rupees, positive.",
                  "type": "string"
                },
                "code": {
                  "description": "item_total|delivery|taxes_fees|packaging|discount",
                  "type": "string"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "product_id": {
            "description": "For a product from search_products, pass its product_id, merchant_url and total exactly; Envoy buys it from Elixir and the user approves in the app.",
            "pattern": "^ofr_[a-f0-9]{32}$",
            "type": "string"
          },
          "rail": {
            "description": "gift_card: buy a gift card of a merchant list_gift_card_merchants lists, for this total. operated_checkout: Envoy places the order itself or refuses; no card is released. Omit for a one-time card. Not with retry_of or product_id.",
            "enum": [
              "gift_card",
              "operated_checkout"
            ],
            "type": "string"
          },
          "retry_of": {
            "description": "Retry a card purchase you reported failed on Envoy's browser checkout: its purchase ID or original idempotency key. Same merchant site, items and total. Envoy finishes it with that card if it can still use it, otherwise as a new purchase on the user's own card. Envoy may also accept a purchase that failed because its card could not be issued.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:pur_[a-f0-9]{32}|(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*)$",
            "type": "string"
          },
          "total": {
            "description": "Checkout total in INR, with delivery, tax and fees. Rupees, up to 2 decimals; number also accepted, \"₹\" and thousands commas are stripped.",
            "maxLength": 20,
            "pattern": "^[0-9]+(?:\\.[0-9]{1,2})?$",
            "type": "string"
          },
          "user_request": {
            "description": "The user's own words for this purchase, including any notes.",
            "maxLength": 300,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "idempotency_key",
          "merchant_url",
          "total",
          "items",
          "user_request"
        ],
        "type": "object"
      },
      "name": "start_purchase",
      "outputSchema": {
        "properties": {
          "account": {
            "description": "Requested account sections.",
            "type": "object"
          },
          "card": {
            "description": "One-time card, only while ready.",
            "type": "object"
          },
          "checkout_by": {
            "description": "Who completes the merchant checkout. agent: you pay once with the one-time card Envoy releases. envoy: Envoy checks out itself; no card is released, so never open the merchant payment step. Absent until Envoy decides; it can change, so act on the latest reply.",
            "enum": [
              "agent",
              "envoy"
            ],
            "type": "string"
          },
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "follow_up": {
            "description": "Optional feedback call after a completed purchase: tool and args. Add the user's words as answer.",
            "type": "object"
          },
          "money": {
            "description": "What has happened to the user's money.",
            "enum": [
              "not_charged",
              "set_aside",
              "charged",
              "refunding",
              "refunded",
              "unknown"
            ],
            "type": "string"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "next_cursor": {
            "description": "Pass as cursor to list_transactions for the next page.",
            "type": "string"
          },
          "purchase": {
            "description": "question: the open question while situation is needs_answer or needs_details: id, kind and prompt. Show the user prompt word for word. funding: only for a gift-card pay_link task, the URL the user pays, amount and expiry. Never an approval link.",
            "type": [
              "object",
              "null"
            ]
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "quote": {
            "description": "INR price; not a charge/refund.",
            "type": "object"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "spending_closed": {
            "description": "Spending access is closed: no further card details are released. It does not prove the issuer blocked the card, and recovery of any money continues separately.",
            "type": "boolean"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          },
          "transactions": {
            "description": "Spending transactions.",
            "type": "array"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [
          "data.payment_details"
        ],
        "service": "shared"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true,
        "title": "Check purchase status"
      },
      "description": "Omit purchase for the active/latest one; pass after_revision to hold up to 45 seconds, then call again at once; without it, the reply is immediate. For agent checkout, ready carries the card: pay once and report. No card follows a report or disconnect. After a failed report, follow recovery: start_purchase with retry_of only when offered, or a new ready handout after reconciliation. When checkout_by is envoy, no card is released: Envoy checks out. Relay purchase.question.prompt; submit the user's answer. Stop after four unchanged holds or when told.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "after_revision": {
            "description": "Return early when the revision changes.",
            "minimum": 0,
            "type": "integer"
          },
          "purchase": {
            "description": "Purchase ID or original idempotency key.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:pur_[a-f0-9]{32}|(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*)$",
            "type": "string"
          },
          "wait_seconds": {
            "default": 45,
            "description": "Hold at most 45 seconds; without after_revision return at once.",
            "maximum": 45,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "get_purchase_status",
      "outputSchema": {
        "properties": {
          "account": {
            "description": "Requested account sections.",
            "type": "object"
          },
          "card": {
            "description": "Secret. Release only while ready after authorization (a gift card: after its link was paid); never log or persist these values. card is present exactly when kind is card, voucher exactly when kind is gift_card.",
            "type": "object"
          },
          "checkout_by": {
            "description": "Who completes the merchant checkout. agent: you pay once with the one-time card Envoy releases. envoy: Envoy checks out itself; no card is released, so never open the merchant payment step. Absent until Envoy decides; it can change, so act on the latest reply.",
            "enum": [
              "agent",
              "envoy"
            ],
            "type": "string"
          },
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "follow_up": {
            "description": "Optional feedback call after a completed purchase: tool and args. Add the user's words as answer.",
            "type": "object"
          },
          "money": {
            "description": "What has happened to the user's money.",
            "enum": [
              "not_charged",
              "set_aside",
              "charged",
              "refunding",
              "refunded",
              "unknown"
            ],
            "type": "string"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "next_cursor": {
            "description": "Pass as cursor to list_transactions for the next page.",
            "type": "string"
          },
          "purchase": {
            "description": "question: the open question while situation is needs_answer or needs_details: id, kind and prompt. Show the user prompt word for word. funding: only for a gift-card pay_link task, the URL the user pays, amount and expiry. Never an approval link.",
            "type": [
              "object",
              "null"
            ]
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "quote": {
            "description": "INR price; not a charge/refund.",
            "type": "object"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "spending_closed": {
            "description": "Spending access is closed: no further card details are released. It does not prove the issuer blocked the card, and recovery of any money continues separately.",
            "type": "boolean"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          },
          "transactions": {
            "description": "Spending transactions.",
            "type": "array"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "shared"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false,
        "title": "Answer a purchase question"
      },
      "description": "Use this when a purchase is waiting on the user (needs_details or needs_answer): send their reply to purchase.question, or feedback after purchase.follow_up, or at any time. Pass the question id and a type. Show the prompt verbatim and wait; never answer for the user. On kind otp it is the code the merchant sent the user to sign in: send it once, then never repeat or keep it. Never send a password, a payment or bank code, or a card detail. Supply a new idempotency_key for each new answer. Retry with the same key and answer. Then keep reading get_purchase_status.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "answer": {
            "description": "What the user said, in their words: the reply to purchase.question, or feedback after purchase.follow_up. An otp question asks for the code the merchant sent the user to sign in: send it once, then never repeat or keep it. Never your own answer, and never a password, a payment or bank code, or a card detail.",
            "maxLength": 800,
            "minLength": 1,
            "type": "string"
          },
          "idempotency_key": {
            "description": "One key per answer. Retry with the same key and the same answer; a reused key with a different answer is refused.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*$",
            "type": "string"
          },
          "purchase": {
            "description": "Purchase ID or original idempotency key.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:pur_[a-f0-9]{32}|(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*)$",
            "type": "string"
          },
          "question": {
            "description": "The id from purchase.question or purchase.follow_up. An earlier question cannot be answered.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "rating": {
            "description": "Rating from 1 to 5. Feedback only.",
            "maximum": 5,
            "minimum": 1,
            "type": "integer"
          },
          "type": {
            "description": "What you are sending. details: a missing detail Envoy asked for. answer: the user's reply to purchase.question. feedback: the user's view, after purchase.follow_up or at any time. Envoy matches it to the open question.",
            "enum": [
              "details",
              "answer",
              "feedback"
            ],
            "type": "string"
          }
        },
        "required": [
          "type",
          "answer",
          "idempotency_key"
        ],
        "type": "object"
      },
      "name": "answer_purchase_question",
      "outputSchema": {
        "properties": {
          "account": {
            "description": "Requested account sections.",
            "type": "object"
          },
          "card": {
            "description": "One-time card, only while ready.",
            "type": "object"
          },
          "checkout_by": {
            "description": "Who completes the merchant checkout. agent: you pay once with the one-time card Envoy releases. envoy: Envoy checks out itself; no card is released, so never open the merchant payment step. Absent until Envoy decides; it can change, so act on the latest reply.",
            "enum": [
              "agent",
              "envoy"
            ],
            "type": "string"
          },
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "follow_up": {
            "description": "Optional feedback call after a completed purchase: tool and args. Add the user's words as answer.",
            "type": "object"
          },
          "money": {
            "description": "What has happened to the user's money.",
            "enum": [
              "not_charged",
              "set_aside",
              "charged",
              "refunding",
              "refunded",
              "unknown"
            ],
            "type": "string"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "next_cursor": {
            "description": "Pass as cursor to list_transactions for the next page.",
            "type": "string"
          },
          "purchase": {
            "description": "question: the open question while situation is needs_answer or needs_details: id, kind and prompt. Show the user prompt word for word. funding: only for a gift-card pay_link task, the URL the user pays, amount and expiry. Never an approval link.",
            "type": [
              "object",
              "null"
            ]
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "quote": {
            "description": "INR price; not a charge/refund.",
            "type": "object"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "spending_closed": {
            "description": "Spending access is closed: no further card details are released. It does not prove the issuer blocked the card, and recovery of any money continues separately.",
            "type": "boolean"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          },
          "transactions": {
            "description": "Spending transactions.",
            "type": "array"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "shared"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false,
        "title": "Answer Envoy (old name)"
      },
      "description": "Deprecated name of answer_purchase_question; same input and result. Prefer answer_purchase_question.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "answer": {
            "description": "What the user said, in their words: the reply to purchase.question, or feedback after purchase.follow_up. An otp question asks for the code the merchant sent the user to sign in: send it once, then never repeat or keep it. Never your own answer, and never a password, a payment or bank code, or a card detail.",
            "maxLength": 800,
            "minLength": 1,
            "type": "string"
          },
          "idempotency_key": {
            "description": "One key per answer. Retry with the same key and the same answer; a reused key with a different answer is refused.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*$",
            "type": "string"
          },
          "purchase": {
            "description": "Purchase ID or original idempotency key.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:pur_[a-f0-9]{32}|(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*)$",
            "type": "string"
          },
          "question": {
            "description": "The id from purchase.question or purchase.follow_up. An earlier question cannot be answered.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "rating": {
            "description": "Rating from 1 to 5. Feedback only.",
            "maximum": 5,
            "minimum": 1,
            "type": "integer"
          },
          "type": {
            "description": "What you are sending. details: a missing detail Envoy asked for. answer: the user's reply to purchase.question. feedback: the user's view, after purchase.follow_up or at any time. Envoy matches it to the open question.",
            "enum": [
              "details",
              "answer",
              "feedback"
            ],
            "type": "string"
          }
        },
        "required": [
          "type",
          "answer",
          "idempotency_key"
        ],
        "type": "object"
      },
      "name": "submit_answer",
      "outputSchema": {
        "properties": {
          "account": {
            "description": "Requested account sections.",
            "type": "object"
          },
          "card": {
            "description": "One-time card, only while ready.",
            "type": "object"
          },
          "checkout_by": {
            "description": "Who completes the merchant checkout. agent: you pay once with the one-time card Envoy releases. envoy: Envoy checks out itself; no card is released, so never open the merchant payment step. Absent until Envoy decides; it can change, so act on the latest reply.",
            "enum": [
              "agent",
              "envoy"
            ],
            "type": "string"
          },
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "follow_up": {
            "description": "Optional feedback call after a completed purchase: tool and args. Add the user's words as answer.",
            "type": "object"
          },
          "money": {
            "description": "What has happened to the user's money.",
            "enum": [
              "not_charged",
              "set_aside",
              "charged",
              "refunding",
              "refunded",
              "unknown"
            ],
            "type": "string"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "next_cursor": {
            "description": "Pass as cursor to list_transactions for the next page.",
            "type": "string"
          },
          "purchase": {
            "description": "question: the open question while situation is needs_answer or needs_details: id, kind and prompt. Show the user prompt word for word. funding: only for a gift-card pay_link task, the URL the user pays, amount and expiry. Never an approval link.",
            "type": [
              "object",
              "null"
            ]
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "quote": {
            "description": "INR price; not a charge/refund.",
            "type": "object"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "spending_closed": {
            "description": "Spending access is closed: no further card details are released. It does not prove the issuer blocked the card, and recovery of any money continues separately.",
            "type": "boolean"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          },
          "transactions": {
            "description": "Spending transactions.",
            "type": "array"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "purchase"
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false,
        "title": "Report checkout result"
      },
      "description": "Only when checkout_by is agent: report paid only on merchant confirmation; if completion is unclear, report failed with failure_reason other. For other failures, choose the closest failure_reason. Include the exact checkout_attempt_id from the handout when supplied. A report is an observation, not settlement; Envoy refuses cancel_purchase afterward. Retry after failed only once money is settled and the prior card is terminal, and only with a new ready handout or accepted start_purchase retry_of. First report wins. Never pay while verifying.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "amount_paid": {
            "description": "Amount the merchant charged. Rupees, up to 2 decimals; number also accepted, \"₹\" and thousands commas are stripped.",
            "maxLength": 20,
            "pattern": "^[0-9]+(?:\\.[0-9]{1,2})?$",
            "type": "string"
          },
          "checkout_attempt_id": {
            "description": "Copy the checkout_attempt_id from the card handout used for this payment. Omit only for a legacy handout; never guess or replace it with a newer attempt.",
            "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
            "type": "string"
          },
          "failure_reason": {
            "description": "Required when outcome is failed. card_not_accepted: the merchant would not take this card. card_declined: the card payment was declined. otp_failed: the bank code check failed. price_changed: the total changed at checkout. out_of_stock: an item was unavailable. site_error: the site failed during checkout. site_blocked: the site blocked the checkout or your browser. other: any other failure.",
            "enum": [
              "card_not_accepted",
              "card_declined",
              "otp_failed",
              "price_changed",
              "out_of_stock",
              "site_error",
              "site_blocked",
              "other"
            ],
            "type": "string"
          },
          "merchant_order_ref": {
            "description": "Merchant order reference, as the merchant showed it (at most 128 characters, no control characters).",
            "maxLength": 128,
            "minLength": 1,
            "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]+$",
            "type": "string"
          },
          "outcome": {
            "description": "Agent observation, not settlement evidence: report paid only when the merchant confirmed payment. If you cannot tell whether payment completed, report failed with failure_reason other.",
            "enum": [
              "paid",
              "failed"
            ],
            "type": "string"
          },
          "purchase": {
            "description": "Purchase ID or original idempotency key.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:pur_[a-f0-9]{32}|(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*)$",
            "type": "string"
          }
        },
        "required": [
          "purchase",
          "outcome"
        ],
        "type": "object"
      },
      "name": "report_checkout_result",
      "outputSchema": {
        "properties": {
          "account": {
            "description": "Requested account sections.",
            "type": "object"
          },
          "card": {
            "description": "One-time card, only while ready.",
            "type": "object"
          },
          "checkout_by": {
            "description": "Who completes the merchant checkout. agent: you pay once with the one-time card Envoy releases. envoy: Envoy checks out itself; no card is released, so never open the merchant payment step. Absent until Envoy decides; it can change, so act on the latest reply.",
            "enum": [
              "agent",
              "envoy"
            ],
            "type": "string"
          },
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "follow_up": {
            "description": "Optional feedback call after a completed purchase: tool and args. Add the user's words as answer.",
            "type": "object"
          },
          "money": {
            "description": "What has happened to the user's money.",
            "enum": [
              "not_charged",
              "set_aside",
              "charged",
              "refunding",
              "refunded",
              "unknown"
            ],
            "type": "string"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "next_cursor": {
            "description": "Pass as cursor to list_transactions for the next page.",
            "type": "string"
          },
          "purchase": {
            "description": "question: the open question while situation is needs_answer or needs_details: id, kind and prompt. Show the user prompt word for word. funding: only for a gift-card pay_link task, the URL the user pays, amount and expiry. Never an approval link.",
            "type": [
              "object",
              "null"
            ]
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "quote": {
            "description": "INR price; not a charge/refund.",
            "type": "object"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "spending_closed": {
            "description": "Spending access is closed: no further card details are released. It does not prove the issuer blocked the card, and recovery of any money continues separately.",
            "type": "boolean"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          },
          "transactions": {
            "description": "Spending transactions.",
            "type": "array"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "purchase"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false,
        "title": "Report a checkout step"
      },
      "description": "Call at each step of your own checkout (checkout_by agent): the user watches it live in the Envoy app. Moves no money, returns no card. Repeats are harmless.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "checkout_attempt_id": {
            "description": "From the handout, if any.",
            "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
            "type": "string"
          },
          "purchase": {
            "description": "Purchase ID or original idempotency key.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:pur_[a-f0-9]{32}|(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*)$",
            "type": "string"
          },
          "step": {
            "description": "Step reached.",
            "enum": [
              "merchant_opened",
              "cart_built",
              "payment_page_reached",
              "payment_applied",
              "otp_requested",
              "otp_submitted",
              "order_submitted",
              "blocked"
            ],
            "type": "string"
          }
        },
        "required": [
          "purchase",
          "step"
        ],
        "type": "object"
      },
      "name": "report_checkout_step",
      "outputSchema": {
        "properties": {
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "shared"
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false,
        "title": "Cancel a purchase"
      },
      "description": "Before any checkout report, request a stop when the user changes their mind or the merchant total differs. Envoy refuses cancel_purchase after any report_checkout_result and explains that the purchase must reconcile. Cancellation is not proof of a refund or card blocking; follow the returned purchase and next action.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "purchase": {
            "description": "Purchase ID or original idempotency key.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:pur_[a-f0-9]{32}|(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*)$",
            "type": "string"
          },
          "reason": {
            "description": "Cancellation reason.",
            "type": "string"
          }
        },
        "required": [
          "purchase"
        ],
        "type": "object"
      },
      "name": "cancel_purchase",
      "outputSchema": {
        "properties": {
          "account": {
            "description": "Requested account sections.",
            "type": "object"
          },
          "card": {
            "description": "One-time card, only while ready.",
            "type": "object"
          },
          "checkout_by": {
            "description": "Who completes the merchant checkout. agent: you pay once with the one-time card Envoy releases. envoy: Envoy checks out itself; no card is released, so never open the merchant payment step. Absent until Envoy decides; it can change, so act on the latest reply.",
            "enum": [
              "agent",
              "envoy"
            ],
            "type": "string"
          },
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "follow_up": {
            "description": "Optional feedback call after a completed purchase: tool and args. Add the user's words as answer.",
            "type": "object"
          },
          "money": {
            "description": "What has happened to the user's money.",
            "enum": [
              "not_charged",
              "set_aside",
              "charged",
              "refunding",
              "refunded",
              "unknown"
            ],
            "type": "string"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "next_cursor": {
            "description": "Pass as cursor to list_transactions for the next page.",
            "type": "string"
          },
          "purchase": {
            "description": "question: the open question while situation is needs_answer or needs_details: id, kind and prompt. Show the user prompt word for word. funding: only for a gift-card pay_link task, the URL the user pays, amount and expiry. Never an approval link.",
            "type": [
              "object",
              "null"
            ]
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "quote": {
            "description": "INR price; not a charge/refund.",
            "type": "object"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "spending_closed": {
            "description": "Spending access is closed: no further card details are released. It does not prove the issuer blocked the card, and recovery of any money continues separately.",
            "type": "boolean"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          },
          "transactions": {
            "description": "Spending transactions.",
            "type": "array"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "purchase"
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false,
        "title": "Give back a gift card"
      },
      "description": "Give back a gift_card purchase whose code you cannot use, with the product: Envoy checks out with it. Until it reads ready again, never use the code, pay or report. Follow get_purchase_status; the user enters any merchant sign-in code in the Envoy app, never in chat.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "idempotency_key": {
            "description": "Retry with the same key.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*$",
            "type": "string"
          },
          "max_total": {
            "description": "Highest order total the user accepts. Rupees, up to 2 decimals; number also accepted, \"₹\" and thousands commas are stripped.",
            "maxLength": 20,
            "pattern": "^[0-9]+(?:\\.[0-9]{1,2})?$",
            "type": "string"
          },
          "product": {
            "additionalProperties": false,
            "description": "What Envoy buys.",
            "properties": {
              "name": {
                "description": "Product name.",
                "maxLength": 200,
                "minLength": 1,
                "type": "string"
              },
              "quantity": {
                "description": "How many.",
                "maximum": 10,
                "minimum": 1,
                "type": "integer"
              },
              "variant": {
                "description": "Option, e.g. size.",
                "maxLength": 60,
                "minLength": 1,
                "type": "string"
              }
            },
            "required": [
              "name",
              "quantity"
            ],
            "type": "object"
          },
          "purchase": {
            "description": "Purchase ID or original idempotency key.",
            "maxLength": 64,
            "minLength": 16,
            "pattern": "^(?:pur_[a-f0-9]{32}|(?:[A-Za-oq-z0-9_-]|p[A-Za-tv-z0-9_-]|pu[A-Za-qs-z0-9_-]|pur[A-Za-z0-9-])[A-Za-z0-9_-]*)$",
            "type": "string"
          }
        },
        "required": [
          "purchase",
          "product",
          "max_total",
          "idempotency_key"
        ],
        "type": "object"
      },
      "name": "give_back_gift_card",
      "outputSchema": {
        "properties": {
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "purchase": {
            "description": "user_task enter_otp: the user enters the merchant sign-in code in the Envoy app; never ask for it in chat.",
            "type": [
              "object",
              "null"
            ]
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "shared"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true,
        "title": "List gift-card merchants"
      },
      "description": "List merchants selling gift cards. Only a listed merchant can be bought; Envoy picks from amounts or amount_range for the cart total. discount_percent is an indicative product maximum; null means none reported. Say \"up to\". The actual purchase quote is authoritative; until available, payable is unknown. redeem_at says where the gift card is used: account — add it to the user's account balance on the merchant site, then check out normally; checkout — enter it at the merchant's payment step; null — not known yet. To buy, call start_purchase with rail \"gift_card\".",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "required": [],
        "type": "object"
      },
      "name": "list_gift_card_merchants",
      "outputSchema": {
        "properties": {
          "account": {
            "description": "Requested account sections.",
            "type": "object"
          },
          "card": {
            "description": "One-time card, only while ready.",
            "type": "object"
          },
          "checkout_by": {
            "description": "Who completes the merchant checkout. agent: you pay once with the one-time card Envoy releases. envoy: Envoy checks out itself; no card is released, so never open the merchant payment step. Absent until Envoy decides; it can change, so act on the latest reply.",
            "enum": [
              "agent",
              "envoy"
            ],
            "type": "string"
          },
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "follow_up": {
            "description": "Optional feedback call after a completed purchase: tool and args. Add the user's words as answer.",
            "type": "object"
          },
          "merchants": {
            "description": "Gift-card merchants: name, domain, amounts or amount_range, discount_percent (indicative product maximum; null: unreported). Say \"up to\". Actual purchase quote is authoritative; payable is unknown until available. Never infer price from payment method or card ownership.",
            "type": "array"
          },
          "money": {
            "description": "What has happened to the user's money.",
            "enum": [
              "not_charged",
              "set_aside",
              "charged",
              "refunding",
              "refunded",
              "unknown"
            ],
            "type": "string"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "next_cursor": {
            "description": "Pass as cursor to list_transactions for the next page.",
            "type": "string"
          },
          "purchase": {
            "description": "question: the open question while situation is needs_answer or needs_details: id, kind and prompt. Show the user prompt word for word. funding: only for a gift-card pay_link task, the URL the user pays, amount and expiry. Never an approval link.",
            "type": [
              "object",
              "null"
            ]
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "spending_closed": {
            "description": "Spending access is closed: no further card details are released. It does not prove the issuer blocked the card, and recovery of any money continues separately.",
            "type": "boolean"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          },
          "transactions": {
            "description": "Spending transactions.",
            "type": "array"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "shared"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true,
        "title": "List gift-card merchants (old name)"
      },
      "description": "Deprecated name of list_gift_card_merchants; same input and result. Prefer list_gift_card_merchants.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "required": [],
        "type": "object"
      },
      "name": "get_merchants",
      "outputSchema": {
        "properties": {
          "account": {
            "description": "Requested account sections.",
            "type": "object"
          },
          "card": {
            "description": "One-time card, only while ready.",
            "type": "object"
          },
          "checkout_by": {
            "description": "Who completes the merchant checkout. agent: you pay once with the one-time card Envoy releases. envoy: Envoy checks out itself; no card is released, so never open the merchant payment step. Absent until Envoy decides; it can change, so act on the latest reply.",
            "enum": [
              "agent",
              "envoy"
            ],
            "type": "string"
          },
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "follow_up": {
            "description": "Optional feedback call after a completed purchase: tool and args. Add the user's words as answer.",
            "type": "object"
          },
          "merchants": {
            "description": "Gift-card merchants: name, domain, amounts or amount_range, discount_percent (indicative product maximum; null: unreported). Say \"up to\". Actual purchase quote is authoritative; payable is unknown until available. Never infer price from payment method or card ownership.",
            "type": "array"
          },
          "money": {
            "description": "What has happened to the user's money.",
            "enum": [
              "not_charged",
              "set_aside",
              "charged",
              "refunding",
              "refunded",
              "unknown"
            ],
            "type": "string"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "next_cursor": {
            "description": "Pass as cursor to list_transactions for the next page.",
            "type": "string"
          },
          "purchase": {
            "description": "question: the open question while situation is needs_answer or needs_details: id, kind and prompt. Show the user prompt word for word. funding: only for a gift-card pay_link task, the URL the user pays, amount and expiry. Never an approval link.",
            "type": [
              "object",
              "null"
            ]
          },
          "purchase_id": {
            "description": "Pass as purchase in later calls. Never show it to the user.",
            "type": "string"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "spending_closed": {
            "description": "Spending access is closed: no further card details are released. It does not prove the issuer blocked the card, and recovery of any money continues separately.",
            "type": "boolean"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          },
          "transactions": {
            "description": "Spending transactions.",
            "type": "array"
          }
        },
        "type": "object"
      }
    },
    {
      "_meta": {
        "personalPaths": [],
        "secretPaths": [],
        "service": "purchase"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true,
        "title": "Search Elixir marketplace"
      },
      "description": "Search Elixir's marketplace when the user wants a product and names no merchant, or asks for Elixir or Envoy. Show each with its price. To buy one or several, call start_purchase once with items [{name, quantity, product_id}], total = the sum of their total.display (e.g. \"₹998.00\") and their merchant_url. 1mg products may add a handling fee; if Envoy answers with a different total, ask the user and resend with it. Moves no money.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "address_id": {
            "description": "Saved address ID from get_account to deliver to; default: the default saved address.",
            "maxLength": 64,
            "minLength": 1,
            "type": "string"
          },
          "quantity": {
            "default": 1,
            "description": "How many; default 1.",
            "maximum": 99,
            "minimum": 1,
            "type": "integer"
          },
          "query": {
            "description": "What the user wants, in their words.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "search_products",
      "outputSchema": {
        "properties": {
          "fix": {
            "description": "Input fields to fix before retrying.",
            "type": "array"
          },
          "next": {
            "description": "The call to make next: tool, args (pass verbatim) and wait_seconds before calling.",
            "type": "object"
          },
          "products": {
            "description": "Elixir marketplace products: product_id, name, brand, price, quantity, total and merchant_url.",
            "type": "array"
          },
          "retry": {
            "description": "Whether and how to retry.",
            "enum": [
              "same_call",
              "after_fix",
              "check_status_first",
              "new_purchase",
              "no"
            ],
            "type": "string"
          },
          "situation": {
            "description": "Where the purchase stands. The English briefing above says what it means.",
            "enum": [
              "needs_details",
              "needs_answer",
              "waiting_for_user",
              "working",
              "ready",
              "confirming",
              "done",
              "stopped",
              "needs_support"
            ],
            "type": "string"
          },
          "support_ref": {
            "description": "Give this to the user only if they ask for help.",
            "type": "string"
          }
        },
        "type": "object"
      }
    }
  ]
}
