From shippo
Purchase domestic and international shipping labels, handle customs declarations, return labels, and void/refund labels via the Shippo API
How this skill is triggered — by the user, by Claude, or both
Slash command
/shippo:label-purchaseThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
<!--
Label purchases charge the authorized Shippo account for real. Before purchasing, explicitly state "this will charge your Shippo account" with the carrier, service, and cost, and require the user to acknowledge. Do not purchase without that confirmation.
Before every call to CreateTransaction, summarize the following and ask the user for explicit confirmation:
Do not proceed without explicit user confirmation.
ValidateAddress (see Address Validation).CreateShipment with address_from, address_to (as inline address objects using v1 field names -- street1, city, state, zip, country), parcels, and async: false.CreateTransaction with: rate (selected rate object_id), label_file_type (default PDF_4x6), async: false.status:
SUCCESS: return tracking_number, label_url (display the COMPLETE URL -- S3 signed URLs break if truncated), and tracking_url_provider.QUEUED/WAITING: poll GetTransaction until resolved.ERROR: report messages from the messages array.All domestic steps apply, plus customs handling before shipment creation. See references/customs-guide.md for the full customs workflow.
ValidateAddress. Sender must include email and phone. Ask if missing.CreateCustomsItem per item (description, quantity, net_weight, mass_unit, value_amount, value_currency, origin_country, tariff_number). Alternatively, you can skip this step and pass inline item objects directly in the declaration (step 3).CreateCustomsDeclaration with contents_type, non_delivery_option, certify: true, certify_signer, and the items (either object_ids from step 2, or inline item objects). See references/customs-guide.md for field details.CreateShipment with all standard fields plus customs_declaration (the declaration object_id).Use this to determine the correct contents_type value:
| Scenario | Value |
|---|---|
| Selling to the recipient (commercial sale) | MERCHANDISE |
| Sending a free gift | GIFT |
| Sending a product sample | SAMPLE |
| Paper documents only | DOCUMENTS |
| Customer returning a purchased item | RETURN_MERCHANDISE |
| Charitable donation | HUMANITARIAN_DONATION |
| None of the above | OTHER (requires contents_explanation) |
The incoterm field on the customs declaration controls who pays duties and taxes:
DDU (Delivered Duty Unpaid) -- recipient pays duties at delivery.DDP (Delivered Duty Paid) -- seller covers all duties and taxes.FCA (Free Carrier) is available for advanced trade scenarios.If the user does not specify, default to DDU for standard e-commerce shipments.
To generate a return label, swap address_from and address_to so the original recipient becomes the sender and the original sender becomes the recipient. All other steps (shipment creation, rate selection, label purchase) remain the same.
Default to PDF_4x6 unless the user specifies otherwise. Supported formats: PDF_4x6, PDF_4x8, PDF_A4, PDF_A5, PDF_A6, PDF, PDF_2.3x7.5, PNG, PNG_2.3x7.5, ZPLII.
When purchasing a label via CreateTransaction, the following options may be set on the shipment or rate:
signature_confirmation on the shipment's extra field. Values: STANDARD, ADULT, CERTIFIED, INDIRECT, CARRIER_CONFIRMATION.insurance on the shipment's extra field with amount, currency, and provider.saturday_delivery to true in the shipment's extra field. Only supported by certain carriers and service levels.metadata on the transaction for order numbers or internal references.If the user already has a rate object_id: optionally call GetRate to confirm details, then confirm purchase (see Purchase Confirmation Gate), then call CreateTransaction directly.
Call CreateRefund with the transaction object_id.
Refund limitations: Void/refund eligibility depends on carrier and timing. Not all labels can be refunded after purchase. If CreateRefund fails, advise the user to contact Shippo support.
Domestic label:
(optional) ValidateAddress (x2) -> CreateShipment (with inline addresses) -> user picks rate -> confirm -> CreateTransaction
International label:
(optional) ValidateAddress (x2) -> CreateCustomsItem (per item) -> CreateCustomsDeclaration -> CreateShipment (with inline addresses + customs_declaration) -> user picks rate -> confirm -> CreateTransaction
Return label:
Same as domestic/international, but swap address_from and address_to.
Order-to-label:
CreateOrder -> CreateShipment (using order address/item data) -> user picks rate -> confirm -> CreateTransaction -> packing slip (REST fallback, see below)
Use orders to represent e-commerce fulfillment requests. An order captures the shipping address, line items, and totals -- then feeds into the standard label purchase workflow.
CreateOrder: Create an order with line items, shipping address, and order details.GetOrder: Retrieve an order by its object_id.ListOrders: List all orders.GET /orders/{ORDER_ID}/packingslip/ (returns a 24-hour S3 PDF link). Fall back to a direct REST call, or advise the user to use the Shippo dashboard until the MCP gap is closed.CreateOrder with the shipping address, line items (title, quantity, sku, total_price, etc.), and order-level fields.CreateShipment, then follow the standard label purchase flow (rate selection, confirmation, CreateTransaction).Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub goshippo/ai --plugin shippo