Skip to main content
Glama

Create a postcard

create_postcard

Create a postcard order (4x6, 6x9 or 6x11) and get a payment link. Front layouts: a big headline on a color, one photo, a photo with a caption, or a collage of 2-4 photos; the back carries the message (handwriting, serif or sans) and addresses. Set express for USPS Priority Mail (2-3 days, tracked). Mails only after the user pays.

Input Schema

NameRequiredDescriptionDefault
toNoRecipient's US mailing address (or use recipients for several people)
fromYesReturn address; printed on the mail piece
sizeNoPostcard size: 4x6, 6x9 or 6x11 (see get_pricing for prices)4x6
contentYesFront (an image URL or a headline) and the message on the back
expressNoSend by express (USPS Priority Mail, usually 2–3 days, with tracking) for an extra charge; see get_pricing. Not available with certified.
recipientsNoSend the same piece to several people: 2-25 US addresses, used INSTEAD of to. Each gets their own order and tracking; one payment covers all.
customer_emailNoWhere to send the receipt and status updates
idempotency_keyNoAny unique string; retrying with the same key returns the original order instead of creating a duplicate

Output Schema

NameRequiredDescriptionDefault
idYesOrder id, ord_…
batchNoPresent when the order was created with recipients: the whole group. The top-level fields describe the first recipient's order; use batch.price and batch.checkout_url for the total and payment.
priceYes
objectYes
ordersNoEvery order in the group, when created with recipients
statusYesawaiting_payment, paid, printing, mailed, cancelled or refunded
productYesProduct id, e.g. postcard_4x6 or letter_certified
discountYesFirst-order discount, already taken off price; null when none applies
trackingYesUSPS tracking, for Certified Mail once printed
certifiedYesnone, certified or certified_return_receipt
order_urlYesOrder status page
preview_urlYesExact print preview
checkout_urlYesWhere the user pays; null once paid or cancelled
product_nameYes
status_detailYesPlain-English status to show the user
preview_image_urlNoPNG picture of the piece (postcard front and back, or the letter's first page) to show the user

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / preview_image_url
      Added value: +{
      +  "description": "PNG picture of the piece (postcard front and back, or the letter's first page) to show the user",
      +  "type": "string"
      +}
  2. Changed16 schema fields changed
    • addedInput schema / properties / content / properties / caption
      Added value: +{
      +  "description": "photo_caption: short text over a band at the bottom of the photo",
      +  "maxLength": 80,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / properties / content / properties / front_headline / description
      Previous value: -"Big text for the front if there is no image, e.g. 'Happy birthday, Sam!'"New value: +"headline layout: big text for the front, e.g. 'Happy birthday, Sam!'"
    • changedInput schema / properties / content / properties / front_image_url / description
      Previous value: -"https URL of a photo or design for the front (JPG or PNG)"New value: +"https URL of a photo or design for the front (JPG or PNG); for photo and photo_caption"
    • addedInput schema / properties / content / properties / front_images
      Added value: +{
      +  "description": "Collage: 2 to 4 https photo URLs, laid out in a grid",
      +  "items": {
      +    "maxLength": 2000,
      +    "type": "string"
      +  },
      +  "maxItems": 4,
      +  "minItems": 2,
      +  "type": "array"
      +}
    • changedInput schema / properties / content / properties / front_theme / description
      Previous value: -"Color theme for a text-only front"New value: +"headline layout: color theme (ink, sky, sunset, forest, rose, sand, night, mint)"
    • changedInput schema / properties / content / properties / front_theme / enum
      Previous value: -[
      -  "ink",
      -  "sky",
      -  "sunset",
      -  "forest"
      -]New value: +[
      +  "ink",
      +  "sky",
      +  "sunset",
      +  "forest",
      +  "rose",
      +  "sand",
      +  "night",
      +  "mint"
      +]
    • addedInput schema / properties / content / properties / headline_font
      Added value: +{
      +  "default": "serif",
      +  "description": "Font for the headline or caption: serif, sans or script (handwritten)",
      +  "enum": [
      +    "serif",
      +    "sans",
      +    "script"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / content / properties / layout
      Added value: +{
      +  "description": "Front layout: headline (big text on a color), photo (one full-bleed photo), photo_caption (photo with a caption band), collage (2-4 photos). Inferred from the fields when omitted.",
      +  "enum": [
      +    "headline",
      +    "photo",
      +    "photo_caption",
      +    "collage"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / content / properties / message / description
      Previous value: -"Handwritten-style message on the back"New value: +"The message on the back"
    • addedInput schema / properties / content / properties / message_font
      Added value: +{
      +  "default": "handwriting",
      +  "description": "Font for the message on the back",
      +  "enum": [
      +    "handwriting",
      +    "serif",
      +    "sans"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / express
      Added value: +{
      +  "default": false,
      +  "description": "Send by express (USPS Priority Mail, usually 2–3 days, with tracking) for an extra charge; see get_pricing. Not available with certified.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / recipients
      Added value: +{
      +  "description": "Send the same piece to several people: 2-25 US addresses, used INSTEAD of to. Each gets their own order and tracking; one payment covers all.",
      +  "items": {
      +    "properties": {
      +      "city": {
      +        "description": "City",
      +        "maxLength": 40,
      +        "minLength": 2,
      +        "type": "string"
      +      },
      +      "company": {
      +        "description": "Company name, printed under the person's name",
      +        "maxLength": 60,
      +        "type": "string"
      +      },
      +      "line1": {
      +        "description": "Street address",
      +        "maxLength": 64,
      +        "minLength": 3,
      +        "type": "string"
      +      },
      +      "line2": {
      +        "description": "Apartment, suite, unit",
      +        "maxLength": 64,
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Recipient or sender full name",
      +        "maxLength": 60,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "state": {
      +        "description": "Two-letter US state code, e.g. NY",
      +        "type": "string"
      +      },
      +      "zip": {
      +        "description": "5-digit US ZIP code, or ZIP+4",
      +        "pattern": "^\\d{5}(-\\d{4})?$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "line1",
      +      "city",
      +      "state",
      +      "zip"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 25,
      +  "minItems": 2,
      +  "type": "array"
      +}
    • changedInput schema / properties / to / description
      Previous value: -"Recipient's US mailing address"New value: +"Recipient's US mailing address (or use recipients for several people)"
    • changedInput schema / required
      Previous value: -[
      -  "to",
      -  "from",
      -  "content"
      -]New value: +[
      +  "from",
      +  "content"
      +]
    • addedOutput schema / properties / batch
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Present when the order was created with recipients: the whole group. The top-level fields describe the first recipient's order; use batch.price and batch.checkout_url for the total and payment.",
      +  "properties": {
      +    "checkout_url": {
      +      "description": "One payment link for every unpaid order in the group",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "count": {
      +      "description": "How many recipients (one order each)",
      +      "type": "number"
      +    },
      +    "discount": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "amount_cents": {
      +              "type": "number"
      +            },
      +            "display": {
      +              "type": "string"
      +            },
      +            "reason": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "amount_cents",
      +            "display",
      +            "reason"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "id": {
      +      "type": "string"
      +    },
      +    "price": {
      +      "additionalProperties": false,
      +      "description": "Total for the whole group",
      +      "properties": {
      +        "amount_cents": {
      +          "type": "number"
      +        },
      +        "currency": {
      +          "type": "string"
      +        },
      +        "display": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "amount_cents",
      +        "currency",
      +        "display"
      +      ],
      +      "type": "object"
      +    },
      +    "url": {
      +      "description": "Group page listing every recipient",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "count",
      +    "url",
      +    "checkout_url",
      +    "price",
      +    "discount"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / orders
      Added value: +{
      +  "description": "Every order in the group, when created with recipients",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "type": "string"
      +      },
      +      "order_url": {
      +        "type": "string"
      +      },
      +      "preview_url": {
      +        "type": "string"
      +      },
      +      "to": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "to",
      +      "order_url",
      +      "preview_url"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  3. Changed5 schema fields changed
    • changedInput schema / properties / size / description
      Previous value: -"Postcard size: 4x6 ($2.99) or 6x9 ($3.99)"New value: +"Postcard size: 4x6, 6x9 or 6x11 (see get_pricing for prices)"
    • changedInput schema / properties / size / enum
      Previous value: -[
      -  "4x6",
      -  "6x9"
      -]New value: +[
      +  "4x6",
      +  "6x9",
      +  "6x11"
      +]
    • addedOutput schema / properties / discount
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "amount_cents": {
      +          "type": "number"
      +        },
      +        "display": {
      +          "type": "string"
      +        },
      +        "reason": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "amount_cents",
      +        "display",
      +        "reason"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "First-order discount, already taken off price; null when none applies"
      +}
    • removedOutput schema / properties / first_postcard_free
      Removed value: -{
      -  "additionalProperties": false,
      -  "description": "Present when the first-postcard-free offer applies",
      -  "properties": {
      -    "applied": {
      -      "type": "boolean"
      -    },
      -    "eligible": {
      -      "type": "boolean"
      -    },
      -    "how": {
      -      "type": "string"
      -    }
      -  },
      -  "type": "object"
      -}
    • changedOutput schema / required
      Previous value: -[
      -  "id",
      -  "object",
      -  "product",
      -  "product_name",
      -  "certified",
      -  "status",
      -  "status_detail",
      -  "price",
      -  "checkout_url",
      -  "order_url",
      -  "preview_url",
      -  "tracking"
      -]New value: +[
      +  "id",
      +  "object",
      +  "product",
      +  "product_name",
      +  "certified",
      +  "status",
      +  "status_detail",
      +  "price",
      +  "checkout_url",
      +  "order_url",
      +  "preview_url",
      +  "tracking",
      +  "discount"
      +]
  4. Changed13 schema fields changed
    • addedInput schema / properties / content / description
      Added value: +"Front (an image URL or a headline) and the message on the back"
    • addedInput schema / properties / from / properties / city / description
      Added value: +"City"
    • addedInput schema / properties / from / properties / company / description
      Added value: +"Company name, printed under the person's name"
    • addedInput schema / properties / from / properties / state / description
      Added value: +"Two-letter US state code, e.g. NY"
    • addedInput schema / properties / from / properties / zip / description
      Added value: +"5-digit US ZIP code, or ZIP+4"
    • addedInput schema / properties / idempotency_key / description
      Added value: +"Any unique string; retrying with the same key returns the original order instead of creating a duplicate"
    • addedInput schema / properties / size / description
      Added value: +"Postcard size: 4x6 ($2.99) or 6x9 ($3.99)"
    • addedInput schema / properties / to / description
      Added value: +"Recipient's US mailing address"
    • addedInput schema / properties / to / properties / city / description
      Added value: +"City"
    • addedInput schema / properties / to / properties / company / description
      Added value: +"Company name, printed under the person's name"
    • addedInput schema / properties / to / properties / state / description
      Added value: +"Two-letter US state code, e.g. NY"
    • addedInput schema / properties / to / properties / zip / description
      Added value: +"5-digit US ZIP code, or ZIP+4"
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": {},
      +  "properties": {
      +    "certified": {
      +      "description": "none, certified or certified_return_receipt",
      +      "type": "string"
      +    },
      +    "checkout_url": {
      +      "description": "Where the user pays; null once paid or cancelled",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "first_postcard_free": {
      +      "additionalProperties": false,
      +      "description": "Present when the first-postcard-free offer applies",
      +      "properties": {
      +        "applied": {
      +          "type": "boolean"
      +        },
      +        "eligible": {
      +          "type": "boolean"
      +        },
      +        "how": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "id": {
      +      "description": "Order id, ord_…",
      +      "type": "string"
      +    },
      +    "object": {
      +      "enum": [
      +        "postcard",
      +        "letter"
      +      ],
      +      "type": "string"
      +    },
      +    "order_url": {
      +      "description": "Order status page",
      +      "type": "string"
      +    },
      +    "preview_url": {
      +      "description": "Exact print preview",
      +      "type": "string"
      +    },
      +    "price": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "amount_cents": {
      +          "type": "number"
      +        },
      +        "currency": {
      +          "type": "string"
      +        },
      +        "display": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "amount_cents",
      +        "currency",
      +        "display"
      +      ],
      +      "type": "object"
      +    },
      +    "product": {
      +      "description": "Product id, e.g. postcard_4x6 or letter_certified",
      +      "type": "string"
      +    },
      +    "product_name": {
      +      "type": "string"
      +    },
      +    "status": {
      +      "description": "awaiting_payment, paid, printing, mailed, cancelled or refunded",
      +      "type": "string"
      +    },
      +    "status_detail": {
      +      "description": "Plain-English status to show the user",
      +      "type": "string"
      +    },
      +    "tracking": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "number": {
      +              "type": "string"
      +            },
      +            "url": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "number",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "USPS tracking, for Certified Mail once printed"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "object",
      +    "product",
      +    "product_name",
      +    "certified",
      +    "status",
      +    "status_detail",
      +    "price",
      +    "checkout_url",
      +    "order_url",
      +    "preview_url",
      +    "tracking"
      +  ],
      +  "type": "object"
      +}
  5. First observed

TDQS

A3.7/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false, destructiveHint=false and openWorldHint=true. The description adds real behavioral value the annotations cannot: the order is created but nothing mails until the user pays, a payment link is returned, and express triggers USPS Priority Mail (2-3 days, tracked). It stops short of covering idempotency behavior or any auth/permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, with the core action and payment-link outcome front-loaded before the layout/size and shipping details. Every sentence carries information, though the layout enumeration is somewhat schema-duplicative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values needn't be explained, and the description covers the create-then-pay lifecycle, sizing, front/back content and express shipping. It omits the multi-recipient path and idempotency nuance, but those are fully described in the schema, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 100%, the schema already documents every parameter and enum, so the baseline is 3. The description restates sizes, layouts and the express trade-off but adds no format or constraint detail (e.g. recipients-vs-to exclusivity, idempotency_key) beyond what the schema already carries.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Create a postcard order') plus the returned artifact ('get a payment link'), and enumerates sizes and layouts. It is clearly distinguishable from siblings in intent, but it never contrasts itself with the very similar create_letter, leaving the agent to infer which to pick.

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

Usage Guidelines3/5

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

Usage is implied through the workflow ('Mails only after the user pays', 'get a payment link'), which hints this runs before pay_order, and it cross-references get_pricing for prices. It never states when to choose this over create_letter or what prerequisites/preconditions apply, so guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.