{"serverId":"mcp-registry/llc.facet/ucp-shopping","tools":[{"name":"cancel_cart","fixed":{"name":"cancel_cart","description":"Cancel a cart. Idempotent, owner-scoped, and moves no money. REQUIRES IDENTITY plus an Idempotency-Key on a signature-required Terminal.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"The cart id."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":82,"tokensAfter":82},{"name":"cancel_checkout","fixed":{"name":"cancel_checkout","description":"Cancel a checkout session before completion, releasing its inventory hold. Idempotent, owner-scoped, and moves no money (distinct from an escrow refund). REQUIRES IDENTITY plus an Idempotency-Key on a signature-required Terminal.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"The checkout session id."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":112,"tokensAfter":112},{"name":"complete_checkout","fixed":{"name":"complete_checkout","description":"Complete a checkout you created and place the order by submitting the buyer-signed payment credential. This is the MONEY-MOVING leg: funds capture on-chain to the merchant's pay_to (x402) or into escrow (Boson). The amount is re-derived server-side from the reservation, never your request, and the buyer's signature is verified before any capture. A per-buyer refusal (FORBIDDEN, cap-exceeded, FULFILLMENT_REQUIRED) returns as an error result; a missing or invalid identity is a real 401. REQUIRES I","inputSchema":{"type":"object","required":["checkout_id","payment"],"properties":{"payment":{"type":"object","description":"The payment container `{ instruments: [{ credential: { type, ... } }] }`, where credential.type is `x402_authorization` or `boson_commit_authorization`. Sign the seller-signed offer LOCALLY with your own wallet; Facet never holds your key."},"checkout_id":{"type":"string","description":"The checkout id from create_checkout."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":278,"tokensAfter":278},{"name":"create_cart","fixed":{"name":"create_cart","description":"Create a pre-checkout cart from catalog line items. A cart is a mutable scratchpad: it moves no money and holds no inventory, so it carries estimated (server-derived) totals and NO payment_handlers. Assemble it, then create_checkout(cart_id) to convert. REQUIRES IDENTITY on a signature-required Terminal.","inputSchema":{"type":"object","properties":{"line_items":{"type":"array","items":{"type":"object","properties":{"item":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"quantity":{"type":"integer","minimum":1}}},"description":"Items, each `{ item: { id }, quantity }`. Prices are catalog-derived, never yours."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":190,"tokensAfter":190},{"name":"create_checkout","fixed":{"name":"create_checkout","description":"Open a checkout session for one or more catalog line items (or promote a cart with `cart_id`). Returns the session plus server-resolved `payment_handlers` (rail, pay_to, exact amount) to satisfy: the price and pay_to are the MERCHANT's, sealed here, never read from your request. Physical goods REQUIRE a `fulfillment` ship-to (else FULFILLMENT_REQUIRED), sealed at create. REQUIRES IDENTITY on a signature-required Terminal: a Facet KYA as `Authorization: Bearer <kya>`.","inputSchema":{"type":"object","properties":{"cart_id":{"type":"string","description":"Promote an existing cart: its stored lines drive the checkout and any line_items are ignored (the business must use the cart contents)."},"line_items":{"type":"array","items":{"type":"object","properties":{"item":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"quantity":{"type":"integer","minimum":1}}},"description":"Items to buy, each `{ item: { id }, quantity }`. Omit when using cart_id."},"fulfillment":{"type":"object","description":"Ship-to destination. REQUIRED for physical products; sealed at create."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":318,"tokensAfter":318},{"name":"get_cart","fixed":{"name":"get_cart","description":"Read back one of YOUR carts by id: line items and estimated totals. Owner-scoped, so another agent's id returns not_found. REQUIRES IDENTITY on a signature-required Terminal.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"The cart id."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":91,"tokensAfter":91},{"name":"get_checkout","fixed":{"name":"get_checkout","description":"Read back one of YOUR checkout sessions by id: status, totals, line items, payment_handlers. Owner-scoped, so another agent's id returns not_found. REQUIRES IDENTITY on a signature-required Terminal.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"The checkout session id."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":103,"tokensAfter":103},{"name":"get_order","fixed":{"name":"get_order","description":"Read back one of YOUR orders on this merchant: status, amount, settlement state. Use the order_id returned when you paid. You can only read orders your own agent identity placed — another agent's order returns FORBIDDEN. REQUIRES IDENTITY: Facet KYA as `Authorization: Bearer <kya>`.","inputSchema":{"type":"object","required":["order_id"],"properties":{"order_id":{"type":"string","description":"The order id returned at payment."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":131,"tokensAfter":131},{"name":"get_payment_capabilities","fixed":{"name":"get_payment_capabilities","description":"Which settlement rails this merchant actually accepts (e.g. coin/boson-escrow for escrowed funds that release on fulfilment, coin/usdc-base for direct). Call before get_payment_requirements so you pass a rail_id this merchant registers, rather than guessing. No identity required — this is discovery data.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":113,"tokensAfter":113},{"name":"get_payment_requirements","fixed":{"name":"get_payment_requirements","description":"Turn a `quote_token` from get_quote into a seller-signed payment offer to authorize. Returns `requirements` (escrow address, asset, exact atomic amount, network) — sign it LOCALLY with your own wallet (e.g. @bosonprotocol/x402-client handle402 for `coin/boson-escrow`, producing an X-PAYMENT string). Facet never holds your key and cannot sign for you, which is why paying is two steps and not one. The offer binds to the quote_token's sealed landed total and ship-to, so the amount is the merchant's","inputSchema":{"type":"object","required":["product_id","rail_id","amount","quote_token"],"properties":{"qty":{"type":"integer","minimum":1,"description":"Must match the quote_token. Default 1."},"amount":{"type":"object","required":["amount","currency"],"properties":{"amount":{"type":"integer","description":"Atomic units, e.g. 16930000 for $16.93 USDC (6dp)."},"currency":{"type":"string","description":"e.g. \"USDC\"."}},"description":"The landed total in ATOMIC units. Must equal the quote_token's sealed total."},"rail_id":{"type":"string","description":"Settlement rail, e.g. \"coin/boson-escrow\" (escrow: funds release on fulfilment) or \"coin/usdc-base\". See /v1/payments/capabilities for what this merchant registers."},"site_id":{"type":"string","description":"Usually omitted — this Terminal's bound site is used."},"product_id":{"type":"string","description":"Must match the product the quote_token sealed."},"quote_token":{"type":"string","description":"The signed token from get_quote."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":434,"tokensAfter":434},{"name":"get_product","fixed":{"name":"get_product","description":"Get full product detail by product or variant identifier.","inputSchema":{"type":"object","required":["catalog"],"properties":{"catalog":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":70,"tokensAfter":70},{"name":"get_quote","fixed":{"name":"get_quote","description":"Get the real landed cost of a product from this merchant: goods + shipping + tax for a specific destination, plus a signed `quote_token` the payment path binds to. Call this before paying — the token is what makes the price the MERCHANT's, not one you name. Physical products REQUIRE a `fulfillment` ship-to; without one you get FULFILLMENT_REQUIRED. An unserviceable destination returns UNDELIVERABLE (the merchant's own shipping zones, which Facet cannot waive). REQUIRES IDENTITY: send a Facet KYA","inputSchema":{"type":"object","required":["product_id"],"properties":{"qty":{"type":"integer","minimum":1,"description":"Quantity. Default 1."},"site_id":{"type":"string","description":"Usually omitted — this Terminal's bound site is used."},"product_id":{"type":"string","description":"Product or variant id, e.g. from search_catalog."},"fulfillment":{"type":"object","properties":{"mode":{"enum":["inline","ref"],"type":"string","description":"`inline` with a full address, or `ref` to reuse a prior fulfillment_ref."},"address":{"type":"object","required":["recipient","line1","locality","region","postal_code","country"],"properties":{"line1":{"type":"string"},"line2":{"type":"string"},"phone":{"type":"string"},"region":{"type":"string","description":"State/province. Required even where the country has none."},"country":{"type":"string","description":"ISO 3166-1 alpha-2, e.g. US."},"locality":{"type":"string","description":"City."},"recipient":{"type":"string"},"postal_code":{"type":"string"}},"description":"All six fields are required, including `region`."},"fulfillment_ref":{"type":"string","description":"Opaque ref from a prior quote (mode `ref`)."}},"description":"Ship-to destination. REQUIRED for physical products."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":494,"tokensAfter":494},{"name":"list_orders","fixed":{"name":"list_orders","description":"List YOUR order history on this merchant, newest first. Scoped to your own agent identity — you never see another agent's orders. REQUIRES IDENTITY: Facet KYA as `Authorization: Bearer <kya>`.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"description":"Max orders to return."},"cursor":{"type":"string","description":"Opaque cursor from a previous page."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":121,"tokensAfter":121},{"name":"lookup_catalog","fixed":{"name":"lookup_catalog","description":"Look up one or more products or variants by identifier (batch).","inputSchema":{"type":"object","required":["catalog"],"properties":{"catalog":{"type":"object","required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"string"},"maxItems":100,"minItems":1}}}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":88,"tokensAfter":88},{"name":"post_delivery_refund","fixed":{"name":"post_delivery_refund","description":"Request a refund or return on a DELIVERED order you placed on this merchant. Opens a merchant-approved refund ticket (status `requested`); it moves NO money on its own. The merchant reviews and approves it, and only then does the send-back sign from the merchant's OWN wallet (non-custodial). Amount and recipient are NOT inputs: the refund amount is derived and capped server-side, and the recipient is the order's stamped payer, never one you name. Pass `refund_line_items` to refund only part of t","inputSchema":{"type":"object","required":["order_id","reason"],"properties":{"reason":{"type":"string","description":"Why the refund or return is requested. Required."},"receipt":{"type":"object","properties":{"body":{"type":"string"},"path":{"type":"string"},"trace_id":{"type":"string"},"signature":{"type":"string"}},"description":"Optional Ed25519-signed settlement receipt (the signed settle response you received). When valid and bound to this order it records receipt_verified on the ticket; it never gates the refund."},"order_id":{"type":"string","description":"The order id returned at payment (settle / checkout complete). A reservation id is not an order id."},"refund_line_items":{"type":"array","items":{"type":"object","required":["product_id","qty"],"properties":{"qty":{"type":"integer","minimum":1,"description":"At most the ordered quantity for that line."},"product_id":{"type":"string","description":"A product id present in the order."}}},"description":"Optional PARTIAL selection: refund only these lines instead of the whole order. Advisory at request time; the merchant is authoritative and may adjust it at decide. Omit for a full-order refund."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":479,"tokensAfter":479},{"name":"search_catalog","fixed":{"name":"search_catalog","description":"Search the merchant catalog for products matching a free-text query.","inputSchema":{"type":"object","required":["catalog"],"properties":{"catalog":{"type":"object","properties":{"query":{"type":"string","description":"Free-text search query."},"pagination":{"type":"object","properties":{"limit":{"type":"integer","minimum":1},"cursor":{"type":"string"}}}}}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":112,"tokensAfter":112},{"name":"update_cart","fixed":{"name":"update_cart","description":"Replace a cart's line items (full replacement), re-priced server-side. Owner-scoped. REQUIRES IDENTITY on a signature-required Terminal.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"The cart id."},"line_items":{"type":"array","items":{"type":"object","properties":{"item":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"quantity":{"type":"integer","minimum":1}}},"description":"The new full set of items, each `{ item: { id }, quantity }`."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":157,"tokensAfter":157},{"name":"update_checkout","fixed":{"name":"update_checkout","description":"Return a checkout's CURRENT sealed snapshot. Facet seals price and items at create, so this is a no-op that reports the session plus a note: to change line items, update the cart and start a new checkout with create_checkout(cart_id). Owner-scoped.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"The checkout session id."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":117,"tokensAfter":117},{"name":"wishlist_add","fixed":{"name":"wishlist_add","description":"Save a product to YOUR wishlist on this merchant for later. Idempotent: saving the same product again updates its note and keeps the original save time. Scoped to your own agent identity. REQUIRES IDENTITY: Facet KYA as `Authorization: Bearer <kya>`.","inputSchema":{"type":"object","required":["product_id"],"properties":{"note":{"type":"string","description":"Optional short note. No personal data."},"product_id":{"type":"string","description":"The product id to save."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":143,"tokensAfter":143},{"name":"wishlist_list","fixed":{"name":"wishlist_list","description":"List YOUR saved items (wishlist) on this merchant, newest first. Scoped to your own agent identity, so you never see another agent's list. REQUIRES IDENTITY: Facet KYA as `Authorization: Bearer <kya>`.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"description":"Max items to return."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":102,"tokensAfter":102},{"name":"wishlist_remove","fixed":{"name":"wishlist_remove","description":"Remove a product from YOUR wishlist on this merchant. Idempotent: removing something not on your list succeeds with removed:false. Scoped to your own agent identity. REQUIRES IDENTITY: Facet KYA as `Authorization: Bearer <kya>`.","inputSchema":{"type":"object","required":["product_id"],"properties":{"product_id":{"type":"string","description":"The product id to remove."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":116,"tokensAfter":116}],"toolsChanged":21,"tokensSaved":0,"todo":[{"tool":"get_product","params":["catalog"]},{"tool":"lookup_catalog","params":["catalog"]},{"tool":"search_catalog","params":["catalog"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}