🤖MCP server

Connect Claude or any MCP client to your Shippified workspace with mcp-shippified and its 49 tools.

Written for
Developers and power users connecting AI assistants
Applies to
All plans
AdminUpdated Sep 26, 2026

mcp-shippified is a Model Context Protocol server that exposes the Shippified API as tools. Once it's connected, Claude Desktop, Claude Code or any other MCP client can list and create orders, check tracking, manage bots and email sources, and set up webhooks in your workspace.

It's a thin layer over the TypeScript SDK: each tool call becomes one REST request authenticated with your API key. It talks over stdio, so the MCP client starts it as a local program. The current version is 0.2.0.

mcp-shippified is not published to npm. npx mcp-shippified and npm install mcp-shippified fail or fetch something unrelated. You need a copy of the package source (the mcp-shippified folder, next to shippified-sdk) or a tarball packed from it.

Before you start

  • Node 18 or newer.

  • A Shippified API key made for this purpose. Create it under Settings → Developer (see Authentication) and name it after the client, such as Claude Desktop, so you can revoke it on its own.

The key gives the assistant full access to your workspace, including tools that delete orders, revoke API keys and create webhook subscriptions. Keys have no scopes and the server has no read-only mode. Connect only clients you trust, and review tool calls before approving them.

Install

The build bundles the SDK source from the neighbouring shippified-sdk folder into one executable file, dist/index.js, so you don't build the SDK separately. The MCP protocol library (@modelcontextprotocol/sdk) is a normal dependency that npm install fetches.

cd mcp-shippified
npm install
npm run build            # type-checks, then bundles to dist/index.js
./dist/index.js --help

dist/index.js is executable and accepts two flags: --help / -h (usage and environment variables) and --version / -v (prints 0.2.0). With no flags it waits for JSON-RPC on stdin; run by hand it looks like it hangs, which is expected.

Configure

Variable

Required

Default

Description

SHIPPIFIED_TOKEN

For every tool except get_landing_stats, get_health and get_public_profile

none

Your API key (sk_…). A session token also works but expires after 14 days.

SHIPPIFIED_BASE_URL

No

https://shippified.net

Instance origin, without /api.

In the examples, replace /absolute/path/to/mcp-shippified with where the folder is. After a global tarball install, use the command mcp-shippified with no arguments instead.

claude mcp add shippified \
  -e SHIPPIFIED_TOKEN="$SHIPPIFIED_API_KEY" \
  -- node /absolute/path/to/mcp-shippified/dist/index.js

Run claude mcp list to check it connects.

Use absolute paths. Desktop clients often start servers with a minimal PATH and an unexpected working folder; if the client can't find node, give the full path to your Node binary.

To debug outside a client, run the official MCP Inspector:

SHIPPIFIED_TOKEN="$SHIPPIFIED_API_KEY" \
  npx @modelcontextprotocol/inspector \
  node /absolute/path/to/mcp-shippified/dist/index.js

For development, npm run dev runs the server straight from TypeScript without building.

Tools

The server exposes 49 tools. Each returns the API's JSON response as formatted text.

Public and status (4)

Tool

Arguments

API call

get_landing_stats

none

GET /api/landing-stats (no token)

get_health

none

GET /api/healthz (no token)

get_public_profile

username

GET /api/profile/:username (no token)

get_carrier_status

none

GET /api/carrier-status (needs a token)

Workspace and orders (10)

Tool

Arguments

API call

get_state

none

GET /api/state

list_orders

status (ordered, canceled, shipped, delivered, issue), store, source, carrier, hasTracking, from, to, q, limit, offset

GET /api/orders

get_order

id

GET /api/orders/:id

create_order

itemSummary (required), store, storeLabel, orderNumber, trackingNumber, carrier, total, costCents, salePriceCents, quantity, productUrl, imageUrl, sku, size, receivedAt, emailSourceId, eventType

POST /api/orders

update_order

id, plus salePriceCents (a number, or null to clear), costCents, estimatedDelivery, trackingNumber, carrier, orderNumber, itemSummary, quantity

PATCH /api/orders/:id

delete_order

id

DELETE /api/orders/:id

get_order_tracking

id

GET /api/orders/:id/tracking

refresh_order_tracking

id

POST /api/orders/:id/tracking/refresh

sync_tracking

none

POST /api/orders/sync-tracking

reparse_orders

none

POST /api/orders/reparse

Bots (5)

Tool

Arguments

API call

list_bots

limit, offset

GET /api/bots

get_bot

id

GET /api/bots/:id

create_bot

name (required), templateId, avatar, templateHint, outputWebhook, samplePayload, type (monitor, dropship, generic)

POST /api/bots

update_bot

id, name, slug, avatar, templateId, templateHint, outputWebhook, samplePayload, type

PATCH /api/bots/:id

delete_bot

id

DELETE /api/bots/:id

Email (5)

Tool

Arguments

API call

list_email_sources

limit, offset

GET /api/email-sources

get_email_source

id

GET /api/email-sources/:id

poll_email_source

id

POST /api/email-sources/:id/poll

rebuild_email_source

id (required), sinceDays (1 to 365, default 30)

POST /api/email-sources/:id/rebuild

import_email

raw, emailSourceId (both required), from

POST /api/email/import

Templates (3)

Tool

Arguments

API call

list_templates

none

GET /api/templates (built-in shapes only)

list_custom_templates

none

GET /api/templates/custom

detect_template

source (email or webhook) and sample (both required), draft

POST /api/templates/custom/detect

Recurring costs (4)

Tool

Arguments

API call

list_subscriptions

limit, offset

GET /api/subscriptions

create_subscription

name, costCents (required), currency, frequency (weekly, monthly, quarterly, yearly), startDate (defaults to today), endDate, category, notes, active

POST /api/subscriptions

update_subscription

id, plus any of the fields above

PATCH /api/subscriptions/:id

delete_subscription

id

DELETE /api/subscriptions/:id

Share cards (3)

Tool

Arguments

API call

list_shares

none

GET /api/shares

create_share

timeframe (7d, 30d, 90d, ytd, all; default 30d), includeStats, includeCheckouts

POST /api/shares

delete_share

slug

DELETE /api/shares/:slug

Billing and account settings (4)

Tool

Arguments

API call

get_billing_usage

none

GET /api/billing/usage

create_billing_checkout

plan (monthly, yearly), successUrl, cancelUrl

POST /api/billing/checkout

create_billing_portal

returnUrl

POST /api/billing/portal

set_timezone

timezone (IANA name, such as America/New_York)

POST /api/account/timezone

API keys (3)

Tool

Arguments

API call

list_api_keys

none

GET /api/account/api-keys

create_api_key

name

POST /api/account/api-keys (the response has the raw key)

revoke_api_key

id

DELETE /api/account/api-keys/:id

Outbound webhooks (6)

Tool

Arguments

API call

list_webhook_subscriptions

limit, offset

GET /api/webhook-subscriptions

create_webhook_subscription

url, eventTypes (required), active

POST /api/webhook-subscriptions (the response has the secret)

update_webhook_subscription

id, url, eventTypes, active

PATCH /api/webhook-subscriptions/:id

delete_webhook_subscription

id

DELETE /api/webhook-subscriptions/:id

test_webhook_subscription

id, eventType (default order.created)

POST /api/webhook-subscriptions/:id/test

rotate_webhook_secret

id

POST /api/webhook-subscriptions/:id/rotate-secret

Intake log (2)

Tool

Arguments

API call

list_webhook_logs

limit (1 to 500, default 100)

GET /api/webhook-logs

clear_webhook_logs

none

DELETE /api/webhook-logs

How the tools behave

The tool descriptions give the assistant these rules, so it can explain them to you:

  • Status can't be set. It comes from parsing and carrier tracking. list_orders offers only the real status values, so a status filter always filters.

  • update_order is fill-missing-only. salePriceCents can always change (null clears it). Every other field is written only if empty, and itemSummary only while the order is "Unparsed order". Adding a tracking number to an ordered order moves it to shipped.

  • reparse_orders re-runs parsing on stored messages with the current shapes and your templates, keeping hand-entered values and carrier data, and returns { reparsed, changed, merged, removed, skipped }. Use it after changing a template.

  • rebuild_email_source is destructive. It re-reads the mailbox and replaces the orders that source produced in the window. It refuses up front, changing nothing, for forwarding sources and for sources that need reconnecting or are paused. It returns immediately; check rebuilding and lastRebuild with get_email_source. Edited orders and ones that also came from Discord or manual entry are kept.

  • detect_template is read-only. It shows which template would win, whether an email would be ignored, and the order it would produce. Pass draft to test an unsaved template.

  • import_email creates real orders, through the same pipeline as live mail (allowed senders, Message-ID dedup, plan limit).

  • sync_tracking refreshes up to 50 in-flight orders on carriers with live tracking and uses carrier quota. A background tracker already does this, so it's rarely needed.

  • create_webhook_subscription rejects private or internal URLs. The secret is in the response once. A subscription listed with needsSecretRotation: true gets no deliveries until rotate_webhook_secret runs.

What the tools don't cover

These need the REST API or the dashboard:

  • Saving custom templates (create, update, delete) and the preview / match-preview helpers. The assistant can dry-run with detect_template but not save.

  • Creating, editing or deleting email sources, and connecting Gmail or Microsoft.

  • One bot's log (GET /api/bots/:id/logs), the inbox, insights (profitability, calendar, leaderboard), workspace settings, username and profile visibility.

  • Account export and deletion, which need a signed-in session and refuse API keys.

Errors

API errors come back as tool errors (isError: true) with the text Shippified API <status>: <message>, followed by the full JSON error body when there is one, so fields such as blockedSender or reason reach the assistant. A missing or revoked key gives Shippified API 401: Not authenticated. If SHIPPIFIED_TOKEN isn't set, authenticated tools fail before sending anything, with ShippifiedClient: token required for ….

The client says the server failed to start

Run the same command in a terminal with --version. If node isn't found, use its absolute path. If dist/index.js is missing, run npm run build in the mcp-shippified folder.

Every tool returns 401

The key in SHIPPIFIED_TOKEN is wrong, revoked, or an expired session token. Create a fresh API key and restart the client.

Example prompts

  • "List my orders from the last 7 days that still have no tracking number."

  • "Add a manual order: Example Console Bundle from Best Buy, order BBY01-000000000001, cost $499.99."

  • "Refresh tracking on order ord_mpvu9uim_aeh5t and tell me the latest carrier scan."

  • "I just fixed my Hayha template. Re-parse my orders and tell me what changed."

  • "Which template would parse this email? Don't import it."

  • "Create a webhook subscription to https://hooks.example.com/shippified for order.shipped and order.delivered, then send it a test event."

Was this page helpful?