{"serverId":"mcp-registry/com.tokenofesteem/token-of-esteem","tools":[{"name":"cancel_gift","fixed":{"name":"cancel_gift","description":"Cancel an in-flight gift and receive the refund amount. Free. Only possible before the booklet goes to print; once printing has started it fails with cancel_too_late. Pass the gift_id from create_gift and an optional reason for your records.","inputSchema":{"type":"object","required":["gift_id"],"properties":{"reason":{"type":"string","maxLength":200,"description":"Optional human-readable reason for the cancellation, recorded on the order."},"gift_id":{"type":"string","description":"The gift_id returned by create_gift, identifying the order to cancel."}}},"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":167,"tokensAfter":167},{"name":"create_gift","fixed":{"name":"create_gift","description":"Place the order: write, print, and mail the booklet. CHARGES the buyer. The recipient is whoever you name in recipient, which may be your own user. Idempotent on idempotency_key for 24 hours. Pass shared_payment_token to pay tokenlessly, or omit it to charge the account's saved card.","inputSchema":{"type":"object","required":["idempotency_key","brief","recipient"],"properties":{"brief":{"type":"object","required":["recipient_first_name","voice","tone","celebrate"],"properties":{"tone":{"enum":["warm_with_ribbing","warm_only","deep_appreciation"],"type":"string"},"voice":{"enum":["hype_man","best_friend","conspiracy"],"type":"string"},"in_jokes":{"type":"array","items":{"type":"string","maxLength":200,"minLength":4},"maxItems":6,"minItems":0},"celebrate":{"type":"array","items":{"type":"string","maxLength":140,"minLength":4},"maxItems":8,"minItems":2},"image_brief":{"type":"string","maxLength":300},"image_model":{"enum":["flux_2_pro","imagen_4","ideogram_3","recraft_v4","gpt_image_2","nano_banana_2"],"type":"string"},"tease_gently":{"type":"array","items":{"type":"string","maxLength":140,"minLength":4},"maxItems":6,"minItems":0},"do_not_mention":{"type":"array","items":{"type":"string","maxLength":60,"minLength":1},"maxItems":8,"minItems":0},"recipient_first_name":{"type":"string","pattern":"^[a-zA-Z\\s'-]+$","maxLength":40,"minLength":1}},"description":"Structured brief about the recipient: what to celebrate, what to tease gently, and the inside jokes worth knowing."},"format":{"enum":["manual_v1"],"type":"string","description":"Booklet format. Only manual_v1, a 16-page booklet, is supported today."},"recipient":{"oneOf":[{"type":"object","required":["recipient_id"],"properties":{"recipient_id":{"type":"string","minLength":1}}},{"type":"object","required":["first_name","ship_to"],"properties":{"ship_to":{"type":"object","required":["name","line1","city","region","postal_code","country"],"properties":{"city":{"type":"string","maxLength":60,"minLength":1},"name":{"type":"string","maxLength":100,"minLength":1},"line1":{"type":"string","maxLength":120,"minLength":1},"line2":{"type":"string","maxLength":120},"phone":{"type":"string","maxLength":30},"region":{"type":"string","maxLength":60,"minLength":1},"country":{"type":"string","pattern":"^[A-Z]{2}$","maxLength":2,"minLength":2},"postal_code":{"type":"string","maxLength":20,"minLength":1}}},"first_name":{"type":"string","pattern":"^[a-zA-Z\\s'-]+$","maxLength":40,"minLength":1}}}],"description":"Who receives the booklet and where to mail it. Pass an inline recipient with a US ship_to, or a saved recipient_id."},"agent_note":{"type":"string","maxLength":500,"description":"Optional note from the agent, stored with the order for support. Never printed in the booklet."},"idempotency_key":{"type":"string","maxLength":64,"minLength":8,"description":"Caller-chosen key that makes this order idempotent for 24 hours. Reuse the same key to retry safely without charging twice."},"preview_before_print":{"type":"boolean","description":"If true, the gift pauses for buyer review before printing instead of printing automatically."},"shared_payment_token":{"type":"string","pattern":"^spt_","description":"Single-use Stripe Shared Payment Token (spt_...) to pay without a stored card. Omit to charge the account default."}}},"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":931,"tokensAfter":931},{"name":"create_setup_link","fixed":{"name":"create_setup_link","description":"Return a hosted Stripe link for the buyer to save a card or wallet to the account. After that, create_gift without a shared_payment_token charges the saved card.","inputSchema":{"type":"object","properties":{"return_url":{"type":"string","format":"uri"}}},"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":84,"tokensAfter":84},{"name":"get_account","fixed":{"name":"get_account","description":"Return this account's spending caps and month-to-date spend. Free. Use it to confirm budget before create_gift.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":55,"tokensAfter":55},{"name":"get_gift","fixed":{"name":"get_gift","description":"Fetch a gift by gift_id and return its full resource: status, voice, format, pricing, the recipient, and fulfillment (Lulu job id, carrier, tracking URL, estimated delivery). Free and read-only. Use it to poll progress after create_gift: status advances through the pipeline to shipped then delivered, or ends at held, refused, cancelled, or failed.","inputSchema":{"type":"object","required":["gift_id"],"properties":{"gift_id":{"type":"string","description":"The gift_id returned by create_gift, identifying the order to fetch."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":158,"tokensAfter":158},{"name":"get_pricing","fixed":{"name":"get_pricing","description":"Compute the exact total for a hypothetical gift (format, voice, image model, ship_to) before you commit. Free, no order is created. Call before create_gift so you know the charge.","inputSchema":{"type":"object","required":["ship_to"],"properties":{"voice":{"enum":["hype_man","best_friend","conspiracy"],"type":"string","description":"Optional comedic voice. It does not change the price; accepted for parity with create_gift."},"format":{"enum":["manual_v1"],"type":"string","description":"Booklet format to price. Only manual_v1 is supported today."},"ship_to":{"type":"object","required":["name","line1","city","region","postal_code","country"],"properties":{"city":{"type":"string","maxLength":60,"minLength":1},"name":{"type":"string","maxLength":100,"minLength":1},"line1":{"type":"string","maxLength":120,"minLength":1},"line2":{"type":"string","maxLength":120},"phone":{"type":"string","maxLength":30},"region":{"type":"string","maxLength":60,"minLength":1},"country":{"type":"string","pattern":"^[A-Z]{2}$","maxLength":2,"minLength":2},"postal_code":{"type":"string","maxLength":20,"minLength":1}},"description":"Destination address. US is supported; the total and tax depend on the destination."},"image_model":{"type":"string","description":"Optional cover image model id. Some models add a small per-call cost."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":380,"tokensAfter":380},{"name":"list_formats","fixed":{"name":"list_formats","description":"List supported booklet formats. There is one today: manual_v1, a 16-page booklet. Free, no side effects.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":54,"tokensAfter":54},{"name":"list_gifts","fixed":{"name":"list_gifts","description":"Paginated list of gifts on the account, with optional status and date filters. Free.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of gifts to return, 1 to 100. Defaults to 50."},"since":{"type":"string","format":"date-time","description":"Only return gifts created at or after this ISO 8601 timestamp."},"cursor":{"type":"string","description":"Opaque pagination cursor from a previous list_gifts response."},"status":{"enum":["created","validating","generating","output_validating","rendering","awaiting_buyer_preview","queued_for_print","printed","shipped","delivered","held","refused","cancelled","failed"],"type":"string","description":"Only return gifts in this status, for example shipped, delivered, or cancelled."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":235,"tokensAfter":235},{"name":"list_image_models","fixed":{"name":"list_image_models","description":"List supported cover image models and their per-call cost. Free, no side effects.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":49,"tokensAfter":49},{"name":"list_recipients","fixed":{"name":"list_recipients","description":"Return the account's saved recipients (address book). Free. Reuse a recipient_id in create_gift instead of re-entering an address.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":62,"tokensAfter":62},{"name":"list_voices","fixed":{"name":"list_voices","description":"List the three comedic voices (Hype Man, Best Friend Roast, Conspiracy Theorist) and the cover image model each prefers. Free, no side effects. Call this first to pick a voice.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":74,"tokensAfter":74},{"name":"validate_brief","fixed":{"name":"validate_brief","description":"Run the content policy on a brief without charging or ordering. Free. Call before create_gift so a refusal surfaces early. A booklet that would wound the recipient is refused here, not at charge time.","inputSchema":{"type":"object","required":["brief"],"properties":{"brief":{"type":"object","required":["recipient_first_name","voice","tone","celebrate"],"properties":{"tone":{"enum":["warm_with_ribbing","warm_only","deep_appreciation"],"type":"string"},"voice":{"enum":["hype_man","best_friend","conspiracy"],"type":"string"},"in_jokes":{"type":"array","items":{"type":"string","maxLength":200,"minLength":4},"maxItems":6,"minItems":0},"celebrate":{"type":"array","items":{"type":"string","maxLength":140,"minLength":4},"maxItems":8,"minItems":2},"image_brief":{"type":"string","maxLength":300},"image_model":{"enum":["flux_2_pro","imagen_4","ideogram_3","recraft_v4","gpt_image_2","nano_banana_2"],"type":"string"},"tease_gently":{"type":"array","items":{"type":"string","maxLength":140,"minLength":4},"maxItems":6,"minItems":0},"do_not_mention":{"type":"array","items":{"type":"string","maxLength":60,"minLength":1},"maxItems":8,"minItems":0},"recipient_first_name":{"type":"string","pattern":"^[a-zA-Z\\s'-]+$","maxLength":40,"minLength":1}},"description":"The same brief you would pass to create_gift. It is checked against the content policy, free, with no order created."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":396,"tokensAfter":396}],"toolsChanged":12,"tokensSaved":0,"todo":[{"tool":"create_setup_link","params":["return_url"]}],"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."}