Shippit MCP by usefulapi
Get Shippit quotes, track and manage orders; create, label, book and cancel shipments on approval.
Should I use this
Quality & Safety
Findings (1)
- LOWin shippit_estimate_delivery_dates
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"shippit": {
"url": "https://shippit.usefulapi.io/mcp"
}
}
}Remote endpoints
https://shippit.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (12)
🟢shippit_get_merchant
The Shippit merchant account behind this API key: store and company name, contact, preparation time, website and the home (pickup) address with country. GET /merchant.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢shippit_get_operating_hours
The store operating hours per weekday (open flag, start and end of the working day) that Shippit uses for pickup and delivery estimates. GET /merchants/settings/locations/operating_hours.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢shippit_list_webhooks
The tracking webhooks configured on the account (at most 6): url, the order states that trigger each, whether address or receiver details are hidden, enabled flag. Custom header values are masked by Shippit. GET /merchants/webhooks.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢shippit_get_quotes(dropoff_suburb, dropoff_postcode, dropoff_state, dropoff_country_code, dropoff_address, ...)
Ask the carriers enabled on the account for a price and delivery estimate to a destination, for given parcels. Nothing is booked and nothing is charged. Set return_all_quotes to see every carrier instead of only the cheapest or fastest. A 200 can hold per-carrier errors (success false) and a quote of 0 means that carrier cannot take the parcel. Dangerous goods cannot be quoted. POST /quotes.
Input Schema
{
"type": "object",
"properties": {
"dropoff_suburb": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"dropoff_postcode": {
"type": "string",
"minLength": 2,
"maxLength": 12
},
"dropoff_state": {
"type": "string",
"minLength": 2,
"maxLength": 40,
"description": "State. Australian orders use NSW, VIC, QLD, WA, SA, TAS, ACT or NT."
},
"dropoff_country_code": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Two-letter country code (default: the merchant's home country, usually AU)."
},
"dropoff_address": {
"description": "Street address (required for on-demand quotes).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"parcels": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"qty": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000,
"description": "Number of parcels of this kind."
},
"weight": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000,
"description": "Weight of one parcel in kilograms."
},
"length": {
"description": "Length in metres.",
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100
},
"width": {
"description": "Width in metres.",
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100
},
"depth": {
"description": "Depth (height) in metres.",
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"required": [
"qty",
"weight"
]
},
"description": "The parcels to quote."
},
"service_levels": {
"description": "Only quote these service levels.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"enum": [
"standard",
"express",
"priority",
"on_demand",
"click_and_collect"
]
}
},
"return_all_quotes": {
"description": "Return the quotes of all carriers (default: only the cheapest or fastest).",
"type": "boolean"
},
"order_date": {
"description": "Delivery date, yyyy-mm-dd (required for priority quotes).",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"dutiable_amount": {
"description": "Declared customs value (required for international quotes).",
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"product_currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"authority_to_leave": {
"description": "Whether the parcel may be left unattended.",
"type": "string",
"enum": [
"Yes",
"No"
]
},
"features": {
"description": "Carrier add-on services, e.g. white_glove.",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"enum": [
"white_glove",
"book_in_required",
"call_before_collection",
"call_before_delivery",
"driver_assist",
"two_person_lift",
"tail_lift_truck_delivery",
"tail_lift_truck_pickup",
"alcohol",
"pharmaceutical",
"id_check",
"tobacco",
"identity_on_delivery",
"pin_on_delivery"
]
}
}
},
"required": [
"dropoff_suburb",
"dropoff_postcode",
"parcels"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢shippit_estimate_delivery_dates(from_postcode, to_postcode, couriers, service_levels, preparation_time)
Estimated delivery window (earliest, latest, confidence and a ready-to-show text) per service level (standard, express) between two postcodes, optionally limited to some carriers. Returns an empty list if no carrier is enabled. POST /estimated_delivery_dates.
Input Schema
{
"type": "object",
"properties": {
"from_postcode": {
"type": "string",
"minLength": 2,
"maxLength": 12,
"description": "Origin (pickup) postcode."
},
"to_postcode": {
"type": "string",
"minLength": 2,
"maxLength": 12,
"description": "Destination postcode."
},
"couriers": {
"description": "Carrier keywords to estimate for, e.g. CouriersPlease (default: all enabled).",
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
}
},
"service_levels": {
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"enum": [
"standard",
"express"
]
}
},
"preparation_time": {
"description": "Lead time before pickup as DD:HH:MM, e.g. 01:05:30.",
"type": "string",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$"
}
},
"required": [
"from_postcode",
"to_postcode"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢shippit_get_order(tracking_number)
One Shippit order by tracking number: state, courier and price allocated, delivery address, receiver, parcels, products, references and (once booked) manifest id and number. There is no list-orders endpoint in the Shippit API. GET /orders/{tracking_number}.
Input Schema
{
"type": "object",
"properties": {
"tracking_number": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{3,64}$",
"description": "The Shippit tracking number of the order (returned by shippit_create_order; usually starts with PP)."
}
},
"required": [
"tracking_number"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢shippit_get_tracking(tracking_number)
The status history of an order (status, date, time, who changed it) and the public tracking page URL to give the recipient. GET /orders/{tracking_number}/tracking.
Input Schema
{
"type": "object",
"properties": {
"tracking_number": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{3,64}$",
"description": "The Shippit tracking number of the order (returned by shippit_create_order; usually starts with PP)."
}
},
"required": [
"tracking_number"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢shippit_get_manifest_document(manifest_id)
The booking manifest document for a manifest id (from shippit_book_orders or shippit_get_order): carrier, order count, tracking numbers and a pre-signed PDF URL valid for 7 days. A 422 means the manifest is still generating: retry shortly. GET /book/{manifest_id}/document.
Input Schema
{
"type": "object",
"properties": {
"manifest_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The Shippit manifest id (not the carrier's manifest number)."
}
},
"required": [
"manifest_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴shippit_create_order(courier_type, courier_allocation, delivery_address, delivery_suburb, delivery_state, ...)
WRITE: create a domestic shipping order in Shippit. Shippit then allocates a carrier (your account rules, or the carrier named in courier_allocation) and, unless suppress_communications is true, emails the recipient tracking notifications. Requires confirm: true. Standard, express and click-and-collect orders are only booked with the carrier later, by shippit_label_order and shippit_book_orders (priority and on-demand orders, which book inside the create request, are not supported here). validate defaults to true: the order is not saved when the suburb and postcode do not match (a suggested address is returned instead). Creating twice creates two orders. International orders (customs data) are not supported here. POST /orders.
Input Schema
{
"type": "object",
"properties": {
"courier_type": {
"description": "Service level (default standard). Give this or courier_allocation.",
"type": "string",
"enum": [
"standard",
"express",
"click_and_collect"
]
},
"courier_allocation": {
"description": "A specific carrier keyword, e.g. CouriersPlease (see the Shippit carriers list). Instead of courier_type.",
"type": "string",
"minLength": 1,
"maxLength": 60
},
"delivery_address": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"delivery_suburb": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"delivery_state": {
"type": "string",
"minLength": 2,
"maxLength": 40,
"description": "State. Australian orders use NSW, VIC, QLD, WA, SA, TAS, ACT or NT."
},
"delivery_postcode": {
"type": "string",
"minLength": 2,
"maxLength": 12
},
"delivery_country_code": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Two-letter country code (default: the merchant's home country, usually AU)."
},
"delivery_company": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"delivery_instructions": {
"description": "Instructions for the driver, at most 55 characters.",
"type": "string",
"minLength": 1,
"maxLength": 55
},
"authority_to_leave": {
"description": "Whether the parcel may be left unattended.",
"type": "string",
"enum": [
"Yes",
"No"
]
},
"receiver_name": {
"description": "Name of the person receiving it, if different from the customer.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"receiver_contact_number": {
"type": "string",
"minLength": 3,
"maxLength": 30
},
"customer_email": {
"type": "string",
"maxLength": 200,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "The customer's email (Shippit sends tracking notifications here unless suppressed)."
},
"customer_first_name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"customer_last_name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"customer_mobile": {
"type": "string",
"minLength": 3,
"maxLength": 30
},
"parcels": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"qty": {
"description": "Number of parcels of this kind (required unless products are given).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"weight": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000,
"description": "Weight of one parcel in kilograms."
},
"length": {
"description": "Length in metres.",
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100
},
"width": {
"description": "Width in metres.",
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100
},
"depth": {
"description": "Depth (height) in metres.",
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"required": [
"weight"
]
},
"description": "The parcels (qty and weight are the minimum; leave qty out when you also send products)."
},
"products": {
"description": "Optional line items for the packing slip.",
"maxItems": 200,
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"description": "Product title (needed for international orders; shown on the packing slip).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"sku": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"quantity": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"price": {
"description": "Unit price (used for the packing slip, customs and transit protection).",
"type": "number",
"minimum": 0,
"maximum": 10000000
}
},
"required": [
"quantity"
]
}
},
"retailer_invoice": {
"description": "Your order number, printed on the label and packing slip.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"retailer_reference": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"features": {
"description": "Carrier add-on services; some need prior approval from Shippit.",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"enum": [
"white_glove",
"book_in_required",
"call_before_collection",
"call_before_delivery",
"driver_assist",
"two_person_lift",
"tail_lift_truck_delivery",
"tail_lift_truck_pickup",
"alcohol",
"pharmaceutical",
"id_check",
"tobacco",
"identity_on_delivery",
"pin_on_delivery"
]
}
},
"tags": {
"description": "Your own labels for filtering.",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"validate": {
"description": "Reject the order if suburb and postcode do not match (default true).",
"type": "boolean"
},
"suppress_communications": {
"description": "true = Shippit sends no tracking notifications to the customer for this order (default false: it does).",
"type": "boolean"
},
"confirm": {
"type": "boolean",
"description": "Must be true. The order is real: it can email the customer and, for a named on-demand carrier, book it at once. Ask the user to confirm first."
}
},
"required": [
"delivery_address",
"delivery_suburb",
"delivery_state",
"delivery_postcode",
"customer_email",
"customer_first_name",
"parcels",
"confirm"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢shippit_label_order(tracking_number)
WRITE: confirm an order for shipping and fetch its label. This is the Shippit 'label' step: it finalises the carrier and price (the order moves to Ready to Ship) and returns the carrier, tracking and consignment details plus pre-signed PDF URLs (valid 7 days) for the shipping label, packing slip and any customs documents. A 422 means the order is still processing or has no valid carrier or quote: retry shortly or read the error. Labelling is the step before shippit_book_orders. GET /orders/{tracking_number}/label.
Input Schema
{
"type": "object",
"properties": {
"tracking_number": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{3,64}$",
"description": "The Shippit tracking number of the order (returned by shippit_create_order; usually starts with PP)."
}
},
"required": [
"tracking_number"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴shippit_book_orders(tracking_numbers, confirm)
WRITE: book labelled orders with their carriers for pickup (the Shippit 'book' step). Shippit returns one manifest per carrier; the carrier then collects and bills the parcels. Orders must have been labelled first (shippit_label_order). The call fails as a whole when a tracking number is unknown; otherwise each manifest reports success or an error per order. Booked orders can no longer be edited. Requires confirm: true. A reply where every manifest failed is an error. POST /book.
Input Schema
{
"type": "object",
"properties": {
"tracking_numbers": {
"minItems": 1,
"maxItems": 200,
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{3,64}$",
"description": "The Shippit tracking number of the order (returned by shippit_create_order; usually starts with PP)."
},
"description": "Tracking numbers of the labelled orders to book."
},
"confirm": {
"type": "boolean",
"description": "Must be true. Booking commits the orders to carrier pickup and charges; ask the user to confirm first."
}
},
"required": [
"tracking_numbers",
"confirm"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴shippit_cancel_order(tracking_number, confirm)
WRITE: cancel a Shippit order by tracking number (the order ends in state cancelled and cannot be revived; for some carriers Shippit also sends a cancellation request to the carrier). Shippit refuses with a 422 and the reason when the order can no longer be cancelled, for example once the carrier has it. Requires confirm: true. DELETE /orders/{tracking_number}.
Input Schema
{
"type": "object",
"properties": {
"tracking_number": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{3,64}$",
"description": "The Shippit tracking number of the order (returned by shippit_create_order; usually starts with PP)."
},
"confirm": {
"type": "boolean",
"description": "Must be true. A cancelled order cannot be recovered; ask the user to confirm first."
}
},
"required": [
"tracking_number",
"confirm"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence