https://mcp.curri.com/mcp

Connect agents to the logistics platform for the built world.

Curri's Model Context Protocol server gives any MCP-aware agent — Claude Desktop, Claude Code, Cursor, your own server-to-server bot — the same delivery, account, and operations tools Curri uses internally.

01

Get Setup with Claude Code

In Claude Code, one command connects Curri MCP and the OAuth flow walks you through sign-in — no token to manage, no config file to edit. Same path works in Cursor and any other MCP client that supports OAuth dynamic client registration.

AITell your AI→ Claude Code
Connect me to the Curri MCP server using OAuth. Run this command, then walk me through the OAuth sign-in in the browser: claude mcp add --transport http curri-api https://mcp.curri.com/mcp --scope user After it completes, verify with `claude mcp list` and confirm "curri-api" appears.
One-liner, plain shell: claude mcp add --transport http curri-api https://mcp.curri.com/mcp --scope user
02

Other agents — Desktop, Cursor, MCP Inspector

Same OAuth flow, different client. Hand this prompt to the agent running on your machine — it knows where its own config file lives and will wire Curri MCP up correctly.

AITell your AI→ any MCP-aware AI
Set me up to use the Curri MCP server at https://mcp.curri.com/mcp. The server uses OAuth 2.1 with auto-discovery, so no auth token is needed up front — sign-in happens in the browser on first connect. Wire it into whichever MCP client I'm running on this machine: • If I'm in Claude Code: `claude mcp add --transport http curri-api https://mcp.curri.com/mcp --scope user` • If I'm in Claude Desktop: edit ~/Library/Application Support/Claude/claude_desktop_config.json and add an "mcpServers" entry that runs `npx -y mcp-remote https://mcp.curri.com/mcp`. Tell me to restart Claude Desktop afterward. • If I'm in Cursor or another MCP client: add an HTTP-transport MCP server with the URL https://mcp.curri.com/mcp. OAuth discovery kicks in on first request. Once configured, I'll be prompted to sign in via Curri's authorization server. After that, you'll have access to Curri's MCP tools.
Heads up: OAuth sign-in is currently gated to @curri.com emails while we ramp the consent flow. External users should use an API key (see section 03).
03

Use an API key instead

For non-Curri-email accounts and for any server-to-server caller. Grab a user ID and API key from your Curri dashboard, then hand them to your AI with the prompt below — it generates the base64-encoded Basic-auth header and writes the right config for whichever client you're running.

AITell your AI→ any MCP-aware AI
Connect me to the Curri MCP server using an API key. My Curri user ID: user_XXXXXXXXXX My Curri API key: 00000000-0000-0000-0000-000000000000 The endpoint: https://mcp.curri.com/mcp Please: 1. Generate the Basic-auth token by base64-encoding "user_id:api_key" (use `echo -n "user_XXXXXXXXXX:00000000-0000-0000-0000-000000000000" | base64`). 2. Configure the MCP client I'm currently running: • Claude Code: `claude mcp add --transport http curri-api https://mcp.curri.com/mcp --header "Authorization: Basic <TOKEN>" --scope user` • Claude Desktop: edit ~/Library/Application Support/Claude/claude_desktop_config.json with an mcpServers entry that runs `npx -y mcp-remote https://mcp.curri.com/mcp --header "Authorization: Basic <TOKEN>"`. Tell me to restart Claude Desktop. • Cursor or other HTTP-MCP client: add the URL https://mcp.curri.com/mcp with the Authorization header set to "Basic <TOKEN>". 3. After writing the config, do NOT echo my API key or the token back into the chat — the credentials live in the config file and nowhere else.
I'd rather set it up by hand

If you'd rather do it without an AI in the loop, here are the steps the prompt above is asking for.

1. Generate the token.

echo -n "user_XXXXXXXXXX:YOUR-API-KEY" | base64

2a. Claude Code:

claude mcp add --transport http curri-api https://mcp.curri.com/mcp \
  --header "Authorization: Basic $TOKEN" --scope user

2b. Claude Desktop — edit ~/Library/Application Support/Claude/claude_desktop_config.json and add:

{
  "mcpServers": {
    "curri-api": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://mcp.curri.com/mcp",
        "--header",
        "Authorization: Basic $TOKEN"
      ]
    }
  }
}
04

Server-to-server

For backend agents, batch jobs, and anything that isn't a local MCP client. Any HTTP library that can POST JSON-RPC 2.0 with a Basic-auth header works.

curl -X POST https://mcp.curri.com/mcp \
  -H "Authorization: Basic $TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }'

The server forwards each tool call to api.curri.com/graphql with your credentials, so resolver-level auth and validation apply just like a normal Curri API client.

05

Tool catalog

5 tools available. Every entry below is the title and name an MCP client sees on tools/list.

quote_delivery

Get a Curri delivery quote

Quote a delivery across one or more stops using the same logged-in pricing flow as the curri-app booking wizard. Returns the per-vehicle price for the requested priority, plus a price comparison across all three priority tiers, plus accessorial and toll breakdowns. Pass the returned quote `id` to `book_delivery` to book.

book_delivery

Book a Curri delivery

Book a delivery using a quote id from `quote_delivery`. Returns the delivery id, external id, tracking URL, and status. For a multi-stop booking, supply `deliveryPayloadInputs` referencing the per-leg quote ids.

quote_and_book_delivery

Quote and book a Curri delivery in one step

Book a delivery without first calling `quote_delivery` — sets `skipQuote: true` on the underlying bookDelivery mutation. Supply the origin, destination, vehicle type, priority, and contacts and the delivery is created in a single round-trip. Use this when your agent already knows the vehicle type and doesn't need to show the caller a quote first.

get_delivery

Fetch a Curri delivery by id

Look up a delivery by any of its identifiers (internal id, external id, hashed public id, or payload external id). Returns status, tracking info, origin/destination, and scheduling fields.

list_deliveries

List Curri deliveries

List deliveries visible to the authenticated API user, with optional filters by free-text query, account, vehicle type, or status. Returns a compact summary of each delivery (ids, status, priority, timestamps, tracking URL, origin/destination city-state). Use `get_delivery` to fetch full details for a specific id.