Shippo MCP server for AI agents

Live

API KEY

SHIPPING

Automation

Shippo gives your agent shipping operations in each user's Shippo account: compare carrier rates, buy labels, track packages, validate addresses, prepare customs declarations, and run batches and manifests.

  • Per-user credentials: each call uses the actual user's API key, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Shippo
agent · Acme Q3
Run
Where is the package for order 1042?
S
shippo_get_tracking_status
127ms
Shipping agent
The package is in transit and was last scanned in Memphis, TN this morning. Estimated delivery is Thursday.
Sources: Shippo tracking, 1 package
shippo
1 package
18:29
Message Claude...

Tools your shipping agent reaches for on Shippo, scoped per user.

CALL ANY TOOL
63 tools for shipping in Shippo: create shipments and compare rates, buy labels, track packages, validate addresses, prepare customs, and run batches, manifests, and pickups.
shippo_add_shipments_to_batch
Batch add shipments to
Add batch shipments to an existing batch. Returns the updated batch with its batch_shipments. Use before purchasing. The batch must not have been purchased yet.
Parameters
Name
Type
Required
Description
batch_id
string
Required
Object ID of the batch to extend.
batch_shipments
array
Required
List of batch shipment objects to add. Each has a shipment object (address_from, address_to, parcels) plus optional carrier_account, servicelevel_token and metadata.
shippo_create_address
Create address
shippo_create_batch
Batch create
shippo_create_customs_item
Create customs item
shippo_create_label_from_rate
Create label from rate
shippo_create_manifest
Create manifest
shippo_create_parcel
Create parcel
shippo_create_service_group
Create service group
shippo_delete_address_book_entry
Delete address book entry
shippo_get_address
Get address
shippo_get_batch
Batch get
shippo_get_carrier_parcel_template
Get carrier parcel template
shippo_get_customs_item
Get customs item
shippo_get_manifest
Get manifest
shippo_get_parcel
Get parcel
shippo_get_refund
Refund get
shippo_get_tracking_status
Get tracking status
shippo_list_address_book_entries
List address book entries
shippo_list_carrier_accounts
List carrier accounts
shippo_list_customs_declarations
List customs declarations
shippo_list_labels
List labels
shippo_list_orders
List orders
shippo_list_refunds
List refunds
shippo_list_shipment_rates
List shipment rates
shippo_list_shipments
List shipments
shippo_parse_address
Parse address
shippo_remove_shipments_from_batch
Batch remove shipments from
shippo_update_address_book_entry
Update address book entry
shippo_update_service_group
Update service group
shippo_validate_address
Validate address

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Shippo tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["shippo"], toolNames: [
    "shippo_create_shipment",
    "shippo_create_label_from_rate",
    "shippo_get_tracking_status"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Buy the cheapest label for a 2 lb parcel from Austin to Denver" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["shippo"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Buy the cheapest label for a 2 lb parcel from Austin to Denver" }],
  tools,
});

// Execute the tool call with the user's vaulted Shippo API key
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["shippo"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Buy the cheapest label for a 2 lb parcel from Austin to Denver" }],
  tools,
});

// Tool call runs with the user's vaulted Shippo API key
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["shippo"] }, pageSize: 100,
});

const agent = new Agent({
  name: "shipping_agent",
  model: "gemini-2.5-pro",
  instruction: "Shippo tools scoped to this user",
  tools,
});

await agent.run("Buy the cheapest label for a 2 lb parcel from Austin to Denver");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Shippo tool. Click to copy, paste into your agent, done.
Rates and labels
Copy the prompt
Copied
Get rates for a 2 lb parcel from Austin to Denver.
Copy the prompt
Copied
Buy a label with the cheapest rate on that shipment.
Copy the prompt
Copied
Request a refund for the unused label on order 1042.
Tracking and addresses
Copy the prompt
Copied
What is the tracking status of this USPS package?
Copy the prompt
Copied
Validate this address: 1 Main St, Springfield, IL.
Copy the prompt
Copied
Parse this pasted address into fields.
Bulk and international
Copy the prompt
Copied
Create a batch for today's 40 orders.
Copy the prompt
Copied
Create a customs declaration for 3 T-shirts shipping to Canada.
Copy the prompt
Copied
Schedule a USPS pickup for today's labels.
SEE HOW AUTH WORKS
Each user connects their own Shippo API key once, and Scalekit sends it with every call. Keys stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Shippo
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Shippo
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Shippo
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Shippo
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other automation and commerce connectors.
Support and Ops Teams
Support ticket automation agent
Fetches new Zendesk tickets, drafts a reply from Notion knowledge base articles, digests what it cannot answer to Slack, and archives the rest, acting as the support agent rather than a shared API key.
GTM and RevOps Teams
CRM AI agent
Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's own delegated OAuth.
Test other agents
See the same per-user auth pattern across other automation and commerce connectors.
SUPPORT
Support ticket automation (Google ADK)
Fetch, annotate, and archive Zendesk tickets with Notion context, digesting anything it cannot answer to Slack.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Shippo API key looks fine in a demo. In production every label purchase and refund looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Shippo today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Shippo as the user or through a shared key?
As the user. Each user connects their own Shippo API key once, and Scalekit sends it with every call. Audit logs attribute every label purchase and refund to that user, not a shared service account.
Where is the Shippo API key stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new API key. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Shippo?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example rate and tracking tools without shippo_create_label_from_rate or shippo_purchase_batch, which buy labels. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Shippo access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Can the agent buy shipping labels?
Yes, if you expose those tools. shippo_create_label_from_rate buys a label from a rate you already fetched, shippo_create_label_from_shipment creates and buys a label in one call, and shippo_purchase_batch buys every label in a valid batch. shippo_create_refund requests a refund for an unused label.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""shippo"": {
""url"": ""https://mcp.scalekit.com/shippo"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.shippo]
url = ""https://mcp.scalekit.com/shippo""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""shippo"": {
""url"": ""https://mcp.scalekit.com/shippo"",
""type"": ""http""
}
}
}