# Paddock Cards

> Send birthday cards, Christmas cards and postcards, printed and mailed for you.

- name: so.paddock/cards
- version: 0.1.4
- connection class: R0 (autonomous)
- trust: 83/100 flags: no-repository
- quality: 82/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/so.paddock%2Fcards
- tools: https://api.protogrid.dev/v1/servers/so.paddock%2Fcards/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "cards": {
      "type": "http",
      "url": "https://api.paddock.so/agent-commerce/mcp"
    }
  }
}
```


## Trust

- hygiene: 80
- liveness: 100
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-100% +updated-15d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 82/100 (good)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 94 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 13 of 13 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- warn `tools.token_cost`: about 10,376 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump
- pass `tools.hidden_text`: no hidden text in tool names, descriptions, schemas or annotations

### stability: 50 (weight 15)

- warn `stability.changes`: 39 tool changes in 30 days
- fail `stability.rug_pull`: 6 tools kept their name but changed most of their description in 30 days; review before trusting them
- pass `stability.new_links`: no tool change named a new site

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 13, about 10,376 tokens to load them all
- tool set hash: 72117f69d1b2ba99a1a03ce491924688
- tools last changed: 2026-10-29T23:49:50.839Z
- badge: [![protogrid quality](https://protogrid.dev/badge/so.paddock/cards.svg)](https://protogrid.dev/servers/so.paddock/cards)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-29 `list_orders` added
  - Find orders first prepared through this assistant connection with history permission, newest first. Replacements inherit their original order’s history access; revising an unlinked order does not add it. Requires a connected buyer who granted orders:read; the public endpoint returns connection instructions. Returns compact order IDs, dates, totals, card counts and payment/refund states, plus next_cursor. Use read_order with a returned order_id for card details and mailing status; no per-order token is needed with history permission. Excludes expired, erased and revoked orders. Reconnecting starts a separate history. Never use names or addresses to find another buyer’s orders.
- 2026-10-29 `pay_order` changed (description, inputSchema, outputSchema)
  - before: Start or resume payment for this exact prepared order. Show the exact amount and any returned action_url so the buyer can securely connect Link, approve this purchase, or complete bank authentication. Only the buyer can grant permission; do not ask them for card details, wallet credentials or payment tokens in chat. Call again after they complete that step, respecting retry_after_seconds. Report payment complete only when status is paid; processing and requires_action are not payment success. Changing the order requires a new quote and approval. Payment and printing/mailing are separate; use read_order for fulfillment.
  - after: Start or resume payment for this exact prepared order and revision. Show the exact amount and returned action_url for the buyer to connect Link, approve this purchase or complete bank authentication. Only the buyer can approve; never ask for payment credentials in chat. Call again after that step, respecting retry_after_seconds. Confirm payment only when status is paid; processing and requires_action are incomplete. Changing the order requires a new quote and approval. Use read_order for separate printing and mailing progress.
- 2026-10-29 `delete_private_content` changed (description, inputSchema) **meaning changed**
  - before: Request deletion of unused private uploads in this scope at the buyer’s request. Content required by a paid open order is kept until that order is completed or cancelled and refunded.
  - after: Request deletion of unused uploads and compositions in one private scope at the buyer’s request. Returns acceptance and deletion state; it does not cancel an order. Purchased content remains until 90 days after mailing or final cancellation/refund, longer while an order, dispute or legal hold is unresolved.
- 2026-10-29 `compose_private_card` changed (description, inputSchema) **meaning changed**
  - before: Compose an immutable private card face from uploads in this scope and/or a QR link (a QR-only card needs no upload). Generate a UUID composition_id; retry only with the same ID and identical fields. Returns design_key and design_version 1 for prepare_order.
  - after: Create a new immutable card face from this scope’s artwork, logo or QR URL. Requires at least one of those inputs; a QR-only face needs no upload. Returns design_key and design_version for prepare_order or revise_order. Personal message, recipient and mailing details are supplied in the order’s cards array. Reuse an existing composition when no new face is needed.
- 2026-10-29 `read_private_content` changed (description, inputSchema) **meaning changed**
  - before: List what the buyer uploaded and the private cards composed from it. Use each composition’s design_key with design_version 1 in prepare_order with request_id = scope_id and the same order_access_token, or in revise_order for an existing draft from this scope.
  - after: List assets and existing card compositions in one private scope after the buyer uploads. Returns asset IDs with their kinds and each composition’s design_key/version. Reuse an existing composition directly; use compose_private_card only for a new face. For a new purchase, prepare_order uses request_id = scope_id and the same token; existing drafts use revise_order. An empty scope returns empty assets and compositions arrays. An expired scope without checkout or payment returns NOT_FOUND; open a new scope to upload again.
- 2026-10-29 `open_private_content` changed (description, inputSchema)
  - before: Start a card from the buyer’s own photo, artwork, logo or QR link. Returns a private 24-hour upload_url for the buyer to open and choose the file themselves, plus the scope_id and order_access_token to keep for the order. Pass an existing unpaid draft’s order_id and order_access_token together to add a picture to that draft and then revise_order; omit both for a new scope. Assistants cannot upload conversation attachments; send the link. Not needed for catalog cards.
  - after: Open a private upload scope for the buyer’s photo, artwork, logo or QR card. Omit both inputs for a new scope, or pass an unpaid order and its token to reopen that draft’s scope. Returns scope_id, a private token, upload_url and expiry. Assistants cannot upload conversation attachments; send the buyer the link, then use read_private_content when they finish. Catalog cards need no upload scope.
- 2026-10-29 `preview_card` changed (description, inputSchema) **meaning changed**
  - before: Optional, never required to buy. Returns one prepared card exactly as it will print, outside and inside, as images at the current order revision; card_id is required when the order has several cards. If the order changes, preview again. preview_url shows the same images in a browser. Nothing is charged, changed or mailed.
  - after: Show a prepared card’s finished surfaces before payment when preview_available is true. Optional, never required to buy. Returns images and their order revision, plus preview_url for clients that need a browser. Preview again after changes. This does not change, charge or mail the order.
- 2026-10-29 `revise_order` changed (description, inputSchema, outputSchema)
  - before: Replace a prepared order before any payment has started. Send the complete desired cards array, including unchanged cards, with the original order_id, order_access_token, expected_revision and a new request_id. Change artwork, format, message, address, timing, or batch contents. Validation happens before the old draft is cancelled; one atomic operation returns a new order, fresh price, private token and review_url. When preview_available is true, optional preview_card can show the finished card. Prior payment approval does not authorize the replacement. Retain private art or add immutable art using open_private_content for the original draft first. If payment has started or is uncertain, read_order and resolve it before changing anything. Retry the identical request after a lost response; after success use the returned order and token for later edits, previews and payment.
  - after: Replace an unpaid draft before payment starts. Send the complete desired cards array, including unchanged cards. Validation and replacement are atomic: failure leaves the original draft intact; success cancels it and returns a new order, price, private token and review_url. Use that replacement for later edits, previews and payment; prior payment approval does not carry over. To add private artwork, first reopen the original draft with open_private_content; existing private artwork can be retained. If payment has started or is uncertain, use read_order and resolve it before changing anything. Retry an uncertain revision only with the identical request. The replacement inherits its source’s history access; revision does not link a previously unlinked order.
- 2026-10-29 `report_feedback` changed (description, inputSchema)
  - before: Optionally report a technical problem, suggestion category or neutral successful outcome using fixed choices. Never required to buy a card. Do not include personal content, credentials, links, conversations or hidden reasoning. Reports are unverified feedback, not proof of payment or mailing.
  - after: Optionally record a technical problem, suggestion or neutral successful outcome using fixed choices. Use after communicating the outcome to the buyer; never required to buy a card. Reports are stored for 30 days and deduplicated daily. Returns recorded or duplicate; TRY_LATER means the daily limit of 100 new reports per server-assigned scope or 500 overall was reached. Do not include personal content, credentials, links, conversations or hidden reasoning. Reports are unverified feedback, not proof of payment or mailing.
- 2026-10-29 `cancel_order` changed (description, inputSchema, outputSchema)
  - before: 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.
  - after: Cancel an eligible purchase or eligible paid cards at the current order revision. Before payment, omit card_ids for whole-purchase cancellation. After payment, omit them for the whole eligible purchase or select returned card IDs. The service checks ownership and each fulfillment cutoff, then returns the actual cancellation and refund states.

Full history: https://api.protogrid.dev/v1/servers/so.paddock%2Fcards/changes

## Remotes

- https://api.paddock.so/agent-commerce/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (13)

- `cancel_order`: Cancel an eligible purchase or eligible paid cards at the current order revision. Before payment, omit card_ids for whole-purchase cancellation. After payment, omit them for the whole eligible purchase or select returned card IDs. The service checks ownership and each fulfillment cutoff, then returns the actual cancellation and refund states.
- `compose_private_card`: Create a new immutable card face from this scope’s artwork, logo or QR URL. Requires at least one of those inputs; a QR-only face needs no upload. Returns design_key and design_version for prepare_order or revise_order. Personal message, recipient and mailing details are supplied in the order’s cards array. Reuse an existing composition when no new face is needed.
- `delete_private_content`: Request deletion of unused uploads and compositions in one private scope at the buyer’s request. Returns acceptance and deletion state; it does not cancel an order. Purchased content remains until 90 days after mailing or final cancellation/refund, longer while an order, dispute or legal hold is unresolved.
- `list_orders`: Find orders first prepared through this assistant connection with history permission, newest first. Replacements inherit their original order’s history access; revising an unlinked order does not add it. Requires a connected buyer who granted orders:read; the public endpoint returns connection instructions. Returns compact order IDs, dates, totals, card counts and payment/refund states, plus next_cursor. Use read_order with a returned order_id for card details and mailing status; no per-order token is needed with history permission. Excludes expired, erased and revoked orders. Reconnecting starts a separate history. Never use names or addresses to find another buyer’s orders.
- `open_private_content`: Open a private upload scope for the buyer’s photo, artwork, logo or QR card. Omit both inputs for a new scope, or pass an unpaid order and its token to reopen that draft’s scope. Returns scope_id, a private token, upload_url and expiry. Assistants cannot upload conversation attachments; send the buyer the link, then use read_private_content when they finish. Catalog cards need no upload scope.
- `pay_order`: Start or resume payment for this exact prepared order and revision. Show the exact amount and returned action_url for the buyer to connect Link, approve this purchase or complete bank authentication. Only the buyer can approve; never ask for payment credentials in chat. Call again after that step, respecting retry_after_seconds. Confirm payment only when status is paid; processing and requires_action are incomplete. Changing the order requires a new quote and approval. Use read_order for separate printing and mailing progress.
- `prepare_order`: Prepare one unpaid purchase of 1 to 500 cards, with mixed artwork, formats, messages, recipients, occasions and dates in one cards array. Each card is priced for its recipient country. Returns order.cards, the exact total, a private order_access_token and review_url for buyer review and payment. When preview_available is true, optional preview_card can show the finished card; images render only when requested. This authorizes neither a charge nor mailing. Preserve the returned token privately for retries and follow-up tools. If the first response is lost before saving a server-generated token, use a new request_id for another unpaid purchase. The 500-card/4-MiB bounds are technical request limits. Validation issues identify zero-based card indices without copying private content.
- `preview_card`: Show a prepared card’s finished surfaces before payment when preview_available is true. Optional, never required to buy. Returns images and their order revision, plus preview_url for clients that need a browser. Preview again after changes. This does not change, charge or mail the order.
- `read_order`: Read one known private purchase using its order ID and matching capability. Returns the current revision, payment state and order.cards with each card’s production and mailing states. Use it to check progress or refresh a stale revision; it does not change the order.
- `read_private_content`: List assets and existing card compositions in one private scope after the buyer uploads. Returns asset IDs with their kinds and each composition’s design_key/version. Reuse an existing composition directly; use compose_private_card only for a new face. For a new purchase, prepare_order uses request_id = scope_id and the same token; existing drafts use revise_order. An empty scope returns empty assets and compositions arrays. An expired scope without checkout or payment returns NOT_FOUND; open a new scope to upload again.
- `report_feedback`: Optionally record a technical problem, suggestion or neutral successful outcome using fixed choices. Use after communicating the outcome to the buyer; never required to buy a card. Reports are stored for 30 days and deduplicated daily. Returns recorded or duplicate; TRY_LATER means the daily limit of 100 new reports per server-assigned scope or 500 overall was reached. Do not include personal content, credentials, links, conversations or hidden reasoning. Reports are unverified feedback, not proof of payment or mailing.
- `revise_order`: Replace an unpaid draft before payment starts. Send the complete desired cards array, including unchanged cards. Validation and replacement are atomic: failure leaves the original draft intact; success cancels it and returns a new order, price, private token and review_url. Use that replacement for later edits, previews and payment; prior payment approval does not carry over. To add private artwork, first reopen the original draft with open_private_content; existing private artwork can be retained. If payment has started or is uncertain, use read_order and resolve it before changing anything. Retry an uncertain revision only with the identical request. The replacement inherits its source’s history access; revision does not link a previously unlinked order.
- `search_cards`: Find ordinary and artist cards by artwork, occasion, format or budget. Returns matches with exact design keys and versions, images, orderability, destination prices and next_cursor. Pass destination_country when known; read pricing_destination and cents_by_destination. Basic physical specifications appear once in format_specs; include_specs adds published details. Public browsing needs no account or key. If results is empty, inspect unmet, constraints and pagination before adjusting filters. Pass the selected design key and version to prepare_order.
