Send personalized greeting cards through your AI assistant. Paddock prints and mails them.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Cancel an eligible purchase at its current revision. Before payment, only whole-purchase cancellation is supported: omit card_ids. After payment, supply returned card_ids to cancel only eligible items, or omit them for the whole eligible purchase. The service verifies ownership and each fulfillment cutoff, and returns actual refund state. Requires the parent order_id and private order_access_token.
Private purchase capability. Keep it secret; never put it in a public URL or log.
Omit to cancel the whole eligible purchase. For a paid purchase, list the returned card IDs to cancel only those eligible items. The service verifies every ID belongs to this order.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Cancel an eligible purchase at its current revision. Before payment, only whole-purchase cancellation is supported: omit card_ids. After payment, supply returned card_ids to cancel only eligible items, or omit them for the whole eligible purchase. The service verifies ownership and each fulfillment cutoff, and returns actual refund state. Requires the parent order_id and private order_access_token.
| Argument | Type | Description |
|---|---|---|
| card_ids | array | Omit to cancel the whole eligible purchase. For a paid purchase, list the returned card IDs to cancel only those eligible items. The service verifies every ID belongs to this order. |
| order_id* | string | |
| expected_revision* | integer | |
| order_access_token* | string | Private purchase capability. Keep it secret; never put it in a public URL or log. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order_id",
"order_access_token",
"expected_revision"
],
"properties": {
"card_ids": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
},
"maxItems": 500,
"minItems": 1,
"description": "Omit to cancel the whole eligible purchase. For a paid purchase, list the returned card IDs to cancel only those eligible items. The service verifies every ID belongs to this order."
},
"order_id": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
},
"expected_revision": {
"type": "integer",
"maximum": 2147483646,
"exclusiveMinimum": 0
},
"order_access_token": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{43}$",
"description": "Private purchase capability. Keep it secret; never put it in a public URL or log."
}
},
"additionalProperties": false
}Prepare one unpaid purchase of 1–500 cards, mixed across any occasions, designs, formats, messages, recipients and dates. One card uses the same cards array. Return per-card previews, the exact sum of current per-card prices, one human review/payment URL and a private order_access_token. No charge or mailing is authorized here. The 500-card/4-MiB bounds are technical request limits. Use a caller-generated UUID request_id; for recoverable first requests, generate and privately store a fresh cryptographically random 43-character base64url order_access_token before calling. Retry that ID only with the same token and unchanged cards. If omitted, the server generates the token; losing that response requires a new ID for another unpaid purchase. Validation issues identify zero-based card indices without copying private content.
| Argument | Type | Description |
|---|---|---|
| cards* | array | One purchase containing 1–500 explicit card compositions in their supplied order. Mix any supported designs, formats, messages, recipients, occasions and dates. Do not group purchases by occasion. One card uses this same array. |
| request_id* | string | |
| order_access_token | string | Optionally generate and privately store 32 cryptographically random bytes encoded as 43 base64url characters before the first request. Reuse that token with the same request_id and unchanged cards to recover a lost response. If omitted, the server generates and returns the capability. Existing purchase capabilities cannot be replaced. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"request_id",
"cards"
],
"properties": {
"cards": {
"type": "array",
"items": {
"type": "object",
"required": [
"design_key",
"design_version",
"message",
"recipient"
],
"properties": {
"format": {
"enum": [
"postcard",
"flat_card_in_envelope",
"folded_card_in_envelope"
],
"type": "string"
},
"message": {
"type": "string",
"maxLength": 4000,
"description": "Personal message, at most 2000 Unicode characters. Printed artwork wording is separate."
},
"occasion": {
"type": "object",
"required": [
"kind",
"calendar"
],
"properties": {
"day": {
"type": "integer",
"maximum": 31,
"minimum": 1
},
"kind": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"month": {
"type": "integer",
"maximum": 12,
"minimum": 1
},
"send_on": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"calendar": {
"type": "string",
"const": "us-western-v1"
}
},
"description": "Optional occasion and timing context, independent of the selected artwork. Omit for an ordinary just-because card.",
"additionalProperties": false
},
"recipient": {
"type": "object",
"required": [
"display_name",
"mailing_address",
"address_confirmed",
"origin"
],
"properties": {
"origin": {
"type": "string",
"const": "manual"
},
"birthday_day": {
"type": "integer",
"default": 0,
"maximum": 31,
"minimum": 0
},
"display_name": {
"type": "string",
"maxLength": 240
},
"birthday_year": {
"anyOf": [
{
"type": "integer",
"maximum": 9999,
"minimum": 1
},
{
"type": "null"
}
]
},
"greeting_name": {
"type": "string",
"maxLength": 240
},
"birthday_month": {
"type": "integer",
"default": 0,
"maximum": 12,
"minimum": 0
},
"anniversary_day": {
"type": "integer",
"maximum": 31,
"minimum": 0
},
"mailing_address": {
"type": "object",
"required": [
"line1",
"line2",
"locality",
"region",
"postal_code",
"country_code"
],
"properties": {
"line1": {
"type": "string",
"maxLength": 320
},
"line2": {
"type": "string",
"maxLength": 320
},
"region": {
"type": "string",
"maxLength": 160
},
"locality": {
"type": "string",
"maxLength": 320
},
"postal_code": {
"type": "string",
"maxLength": 48
},
"country_code": {
"type": "string",
"pattern": "^[A-Z]{2}$"
}
},
"additionalProperties": false
},
"address_confirmed": {
"type": "boolean",
"const": true
},
"anniversary_month": {
"type": "integer",
"maximum": 12,
"minimum": 0
}
},
"additionalProperties": false
},
"design_key": {
"type": "string",
"maxLength": 160,
"minLength": 1
},
"message_font": {
"enum": [
"serif",
"sans_serif",
"old_school"
],
"type": "string"
},
"design_version": {
"type": "integer",
"maximum": 2147483646,
"exclusiveMinimum": 0
},
"return_address": {
"type": "object",
"required": [
"display_name",
"mailing_address",
"source_kind"
],
"properties": {
"source_kind": {
"type": "string",
"const": "manual"
},
"display_name": {
"type": "string",
"maxLength": 240
},
"mailing_address": {
"type": "object",
"required": [
"line1",
"line2",
"locality",
"region",
"postal_code",
"country_code"
],
"properties": {
"line1": {
"type": "string",
"maxLength": 320
},
"line2": {
"type": "string",
"maxLength": 320
},
"region": {
"type": "string",
"maxLength": 160
},
"locality": {
"type": "string",
"maxLength": 320
},
"postal_code": {
"type": "string",
"maxLength": 48
},
"country_code": {
"type": "string",
"pattern": "^[A-Z]{2}$"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"include_paddock_gift": {
"type": "boolean"
}
},
"description": "One manual guest card. Each card may have its own artwork, format, message, recipient, optional occasion and timing. Existing destination/calendar rules apply. No member, Property, recipient, card or calendar-event IDs.",
"additionalProperties": false
},
"maxItems": 500,
"minItems": 1,
"description": "One purchase containing 1–500 explicit card compositions in their supplied order. Mix any supported designs, formats, messages, recipients, occasions and dates. Do not group purchases by occasion. One card uses this same array."
},
"request_id": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
},
"order_access_token": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{43}$",
"description": "Optionally generate and privately store 32 cryptographically random bytes encoded as 43 base64url characters before the first request. Reuse that token with the same request_id and unchanged cards to recover a lost response. If omitted, the server generates and returns the capability. Existing purchase capabilities cannot be replaced."
}
},
"additionalProperties": false
}Read a private purchase and its order.cards using the parent order_id and order_access_token. Payment, per-card production and mailing are distinct states.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | |
| order_access_token* | string | Private purchase capability. Keep it secret; never put it in a public URL or log. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order_id",
"order_access_token"
],
"properties": {
"order_id": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
},
"order_access_token": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{43}$",
"description": "Private purchase capability. Keep it secret; never put it in a public URL or log."
}
},
"additionalProperties": false
}Find currently available ordinary and artist cards by occasion, tone, format, artist or budget. Public browsing needs no account or key.
| Argument | Type | Description |
|---|---|---|
| kind | string | |
| tone | string | |
| humor | string | |
| limit | integer | |
| query | string | |
| artist | string | |
| cursor | string | |
| format | string | |
| occasion | string | |
| max_price_cents | integer | |
| require_printed_text | string | Filter verified wording already printed in the artwork. Unknown wording does not match absent or present. |
| printed_text_contains | string | Required phrase in verified artwork lettering, matched without case sensitivity. This does not search the customizable message. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"kind": {
"enum": [
"any",
"standard",
"artist"
],
"type": "string"
},
"tone": {
"type": "string",
"maxLength": 40
},
"humor": {
"enum": [
"any",
"none",
"light",
"playful",
"funny"
],
"type": "string"
},
"limit": {
"type": "integer",
"default": 12,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 300
},
"artist": {
"type": "string",
"maxLength": 120
},
"cursor": {
"type": "string",
"pattern": "^(?:\\d{1,6})?$"
},
"format": {
"enum": [
"postcard",
"flat_card_in_envelope",
"folded_card_in_envelope"
],
"type": "string"
},
"occasion": {
"type": "string",
"maxLength": 100
},
"max_price_cents": {
"type": "integer",
"maximum": 1000000,
"minimum": 0
},
"require_printed_text": {
"enum": [
"any",
"absent",
"present"
],
"type": "string",
"description": "Filter verified wording already printed in the artwork. Unknown wording does not match absent or present."
},
"printed_text_contains": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Required phrase in verified artwork lettering, matched without case sensitivity. This does not search the customizable message."
}
},
"additionalProperties": false
}