# Have It Printed

> Print and mail physical documents in the US via USPS, with quotes, agent payment and tracking.

- name: com.haveitprinted/print-and-mail
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 78/100 flags: no-repository
- quality: 86/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.haveitprinted%2Fprint-and-mail
- tools: https://api.protogrid.dev/v1/servers/com.haveitprinted%2Fprint-and-mail/tools

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

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "print-and-mail": {
      "type": "http",
      "url": "https://agents.haveitprinted.com/mcp"
    }
  }
}
```


## Trust

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

## Quality 86/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### 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: 100 (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`: 11 of 11 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 1,844 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 75 (weight 15)

- warn `stability.changes`: 18 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

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

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

- tools: 11, about 1,844 tokens to load them all
- tool set hash: df7dde277c14a39a662a1e4bb539a486
- tools last changed: 2026-10-20T16:26:31.711Z
- badge: [![protogrid quality](https://protogrid.dev/badge/com.haveitprinted/print-and-mail.svg)](https://protogrid.dev/servers/com.haveitprinted/print-and-mail)
- 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-20 `hip_prepare_payment` changed (description, inputSchema)
  - before: Resolve the EXACT amount HIP will charge, before any payment authorization is obtained or spent. This does NOT charge anything. Returns subtotal_cents, tax_cents, total_cents, currency, a pricing fingerprint and the authorization types HIP accepts. Tax is calculated by Stripe from the destination, so hip_quote alone is not the payable amount. The returned total is bound to this job's documents, options and recipient: change any of them and payment is refused with QUOTE_STALE until you prepare again. Use this when paying autonomously with a delegated payment authorization; a human paying in a browser does not need it. Commits the job to the autonomous payment rail. The recipient's address is checked with USPS first: ADDRESS_UNVERIFIED (with a hint) means correct it with hip_update_job, or set address_confirmed if the person confirms it is right as it is.
  - after: Resolve the EXACT amount HIP will charge, before any payment authorization is obtained or spent. This does NOT charge anything. Returns subtotal_cents, tax_cents, total_cents, currency, a pricing fingerprint and the authorization types HIP accepts. Tax is calculated by Stripe from the destination, so hip_quote alone is not the payable amount. The returned total is bound to this job's documents, options and recipient: change any of them and payment is refused with QUOTE_STALE until you prepare again. Use this when paying autonomously with a delegated payment authorization; a human paying in a browser does not need it. Commits the job to the autonomous payment rail.
- 2026-10-10 `hip_prepare_payment` changed (description, inputSchema)
  - before: Resolve the EXACT amount HIP will charge, before any payment authorization is obtained or spent. This does NOT charge anything. Returns subtotal_cents, tax_cents, total_cents, currency, a pricing fingerprint and the authorization types HIP accepts. Tax is calculated by Stripe from the destination, so hip_quote alone is not the payable amount. The returned total is bound to this job's documents, options and recipient: change any of them and payment is refused with QUOTE_STALE until you prepare again. Use this when paying autonomously with a delegated payment authorization; a human paying in a browser does not need it. Commits the job to the autonomous payment rail.
  - after: Resolve the EXACT amount HIP will charge, before any payment authorization is obtained or spent. This does NOT charge anything. Returns subtotal_cents, tax_cents, total_cents, currency, a pricing fingerprint and the authorization types HIP accepts. Tax is calculated by Stripe from the destination, so hip_quote alone is not the payable amount. The returned total is bound to this job's documents, options and recipient: change any of them and payment is refused with QUOTE_STALE until you prepare again. Use this when paying autonomously with a delegated payment authorization; a human paying in a browser does not need it. Commits the job to the autonomous payment rail. The recipient's address is checked with USPS first: ADDRESS_UNVERIFIED (with a hint) means correct it with hip_update_job, or set address_confirmed if the person confirms it is right as it is.
- 2026-10-07 `hip_get_order` changed (annotations)
- 2026-10-07 `hip_get_checkout_status` changed (annotations)
- 2026-10-07 `hip_quote` changed (annotations)
- 2026-10-07 `hip_update_job` changed (inputSchema)
- 2026-10-07 `hip_add_text_document` added
  - Add a letter or document whose text you wrote with the person. Have It Printed typesets it on US Letter paper in a clean serif font, in black and white, and counts its pages. Plain text only: separate paragraphs with a blank line; no images, tables or formatting. Call once per document.
- 2026-10-05 `hip_get_order` changed (title, description, annotations)
  - before: Status and USPS tracking for the paid order belonging to this job.
  - after: Status and tracking number for the paid order belonging to this job.
- 2026-10-05 `hip_complete_payment` changed (title, annotations)
- 2026-10-05 `hip_prepare_payment` changed (title, annotations)

Full history: https://api.protogrid.dev/v1/servers/com.haveitprinted%2Fprint-and-mail/changes

## Remotes

- https://agents.haveitprinted.com/mcp (streamable-http, auth none, reachable true, uptime30d 0.9009009)

## Packages

_none_

## Tools (11)

- `hip_add_text_document`: Add a letter or document whose text you wrote with the person. Have It Printed typesets it on US Letter paper in a clean serif font, in black and white, and counts its pages. Plain text only: separate paragraphs with a blank line; no images, tables or formatting. Call once per document.
- `hip_complete_payment`: Pay for the job with a delegated payment authorization, with no browser and no human step. payment_authorization must be a Stripe shared payment token (spt_...) granted to Have It Printed whose maximum is at least the total from hip_prepare_payment; HIP charges exactly that total and never more. NEVER send a card number, expiry, CVV or any reusable credential to this tool. If the cardholder's bank requires authentication, this returns payment_status=requires_user_action rather than bypassing it.
- `hip_create_checkout`: Create a Stripe Checkout session for the job and return its URL. This does NOT take payment: the customer completes payment at that URL. Show them the quote first.
- `hip_create_job`: Start a print-and-mail job. Returns an opaque job_handle used by every later call. Creates nothing chargeable.
- `hip_get_checkout_status`: Whether the customer has paid yet. Payment truth comes from the order record Stripe's webhook creates, never from a browser redirect.
- `hip_get_order`: Status and tracking number for the paid order belonging to this job.
- `hip_get_service_info`: What Have It Printed does, what it costs, what file types and sizes are accepted, and how mailing works. Needs a Bearer API key, like every tools/call (POST /v1/onboard to get one).
- `hip_get_upload_target`: Get a short-lived upload URL for the customer's document. PUT the bytes to it. File type and size limits are the same as the website.
- `hip_prepare_payment`: Resolve the EXACT amount HIP will charge, before any payment authorization is obtained or spent. This does NOT charge anything. Returns subtotal_cents, tax_cents, total_cents, currency, a pricing fingerprint and the authorization types HIP accepts. Tax is calculated by Stripe from the destination, so hip_quote alone is not the payable amount. The returned total is bound to this job's documents, options and recipient: change any of them and payment is refused with QUOTE_STALE until you prepare again. Use this when paying autonomously with a delegated payment authorization; a human paying in a browser does not need it. Commits the job to the autonomous payment rail.
- `hip_quote`: Exact price for the job, computed by the same pricing the website checkout uses. Tax, if any, is added by Stripe at payment.
- `hip_update_job`: Set the documents, print options and US mailing recipient on a job. Price fields are rejected: the server computes all amounts.
