Ship real packages for an organization: quote → buy label → track → void.
endpoint: POST https://app.mailroom.software/mcp (stateless streamable HTTP)
auth: Bearer mk_live_… API key, or OAuth 2.1 (DCR at /oauth/register)
tools: 16 total —
ship: get_shipping_rates · create_shipment · track_shipments
void_shipment · validate_address · search_contacts
billing: get_billing_status · get_billing_setup_link · add_funds
check_top_up · configure_auto_refill · activate_live_key
limits: request_limit_increase · list_limit_requests · reply_to_limit_request
settings: get_settings_link
base: https://app.mailroom.software/api/v1 spec: /.well-known/openapi.json
sandbox: mk_test_ keys run synthetic right here — simulated rates/labels, free.
⚠ Sandbox prices are simulated and do NOT reflect production rates.
# 1. Quote (no side effects)
POST /api/v1/quotes {"shipTo":{...},"package":{"weightLbs":2}}
→ { quoteId, rates:[{ rateId, carrier, amountCents, ... }] }
# 2. Buy (REAL MONEY — Idempotency-Key required)
POST /api/v1/shipments -H "Idempotency-Key: $(uuidgen)" {"quoteId":"…","rateId":"…"}
→ 201 { shipmentId, trackingNumber, labelUrl }
→ 202 { status:"pending_approval" } # a human manager was pinged in Slack — poll
# 3. Track / void
GET /api/v1/shipments/:id
POST /api/v1/shipments/:id/void
code + suggested_action; follow it. Respect 429 Retry-After.