CarrierScrub

Docs · MCP server

Connect an AI assistant to CarrierScrub

CarrierScrub runs a Model Context Protocol (MCP) server at https://carrierscrub.com/mcp. Connect Claude Code, Cursor, VS Code or Claude Desktop to it and your assistant can check a carrier's FMCSA record by USDOT or MC number, or find the number from a company name. It uses the same verdicts, limits and audit log as the rest of your account, and needs an API key from the Agency plan.

Before you start

  1. Your brokerage needs the Agency plan. Keys stop working if the plan lapses, and start again when it is active.
  2. An owner or admin opens Admin, then API keys, and clicks New key.
  3. Name the key after the assistant and the person using it, for example “Claude Code, Dana”. One key per assistant means the audit log shows which one ran each check, and you can revoke one without breaking the others.
  4. Copy the key when it appears. It starts with cs_live_. CarrierScrub stores only a hash of it, so it can't be shown again; if you lose it, revoke it and make a new one.
SettingValue
Server URLhttps://carrierscrub.com/mcp
TransportStreamable HTTP (sometimes listed as “HTTP”). Not SSE and not stdio.
AuthenticationHeader Authorization: Bearer cs_live_…. OAuth is not supported.
Toolslookup_carrier and search_carriers, both read-only

In every example below, replace cs_live_YOUR_KEY with your key.

Claude Code

Run this once in a terminal:

claude mcp add --transport http carrierscrub https://carrierscrub.com/mcp \
  --header "Authorization: Bearer cs_live_YOUR_KEY"

That adds the server for the current project only. Add --scope user to make it available in every project. Run claude mcp list to confirm it connected, then ask something like “Check USDOT 8893375 with CarrierScrub.”

Cursor

Add this to ~/.cursor/mcp.json for every project, or to .cursor/mcp.json inside one project:

{
  "mcpServers": {
    "carrierscrub": {
      "url": "https://carrierscrub.com/mcp",
      "headers": {
        "Authorization": "Bearer ${env:CARRIERSCRUB_API_KEY}"
      }
    }
  }
}

Set CARRIERSCRUB_API_KEY to your key in the environment Cursor starts from. That keeps the key out of the file, which matters most for a project file that could be committed to a repository.

VS Code

Add this to .vscode/mcp.json in your workspace. VS Code asks for the key the first time the server starts and masks it as you type, so it is never written into the file:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "carrierscrub-key",
      "description": "CarrierScrub API key (cs_live_...)",
      "password": true
    }
  ],
  "servers": {
    "carrierscrub": {
      "type": "http",
      "url": "https://carrierscrub.com/mcp",
      "headers": {
        "Authorization": "Bearer ${input:carrierscrub-key}"
      }
    }
  }
}

Claude Desktop

Custom connectors won't work yet. Claude's “Add custom connector” setting only supports OAuth, and CarrierScrub's server uses API keys. That also means claude.ai in a browser and the Claude mobile apps can't connect for now. Claude Desktop can, through a small bridge called mcp-remote that runs on your computer.

  1. Install Node.js version 18 or later.
  2. In Claude Desktop, open Settings, then Developer, then Edit Config. That opens claude_desktop_config.json.
  3. Add the server below, save, and restart Claude Desktop.
{
  "mcpServers": {
    "carrierscrub": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://carrierscrub.com/mcp",
        "--transport",
        "http-only",
        "--header",
        "Authorization:${CARRIERSCRUB_AUTH}"
      ],
      "env": {
        "CARRIERSCRUB_AUTH": "Bearer cs_live_YOUR_KEY"
      }
    }
  }
}

Keep Authorization:${CARRIERSCRUB_AUTH} exactly as written, with no space after the colon. On some systems Claude Desktop mangles spaces inside args, so the space belongs in the env value instead.

Other clients

Any MCP client that supports Streamable HTTP and lets you set a request header will work. Give it the server URL and the Authorization header from the table above. The server is stateless: every request is one JSON-RPC message sent as a POST, with a JSON reply and no session to keep.

To test a key without an assistant, send an initialize request. A working key returns "serverInfo" with the name carrierscrub:

curl -s https://carrierscrub.com/mcp \
  -H "Authorization: Bearer cs_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{}}}'

Tools

lookup_carrier

Checks one carrier. The query argument takes a USDOT number such as USDOT 8893375 or just 8893375, or an MC number such as MC 123456. Bare digits are read as a USDOT number.

It returns the same result as a lookup in the app:

search_carriers

Finds carriers by legal name, so the assistant can get a USDOT number to check. The name argument needs at least three characters. It returns up to 25 matches with the USDOT number, legal name, city, state, whether the carrier has active operating authority, and whether it holds broker authority only. A match is not a verdict; the assistant should run lookup_carrier on the one you mean.

Limits and errors

Problems with the connection itself come back as HTTP errors before any tool runs:

StatusWhat it meansWhat to do
401No key was sent, or the key is not valid or was revoked.Check the header is Authorization: Bearer cs_live_…, or make a new key in Admin.
403The key is valid but the brokerage isn't on the Agency plan.Upgrade in Admin, then Billing. The key works again as soon as the plan is active.
405The client used GET or DELETE.Set the transport to Streamable HTTP, not SSE.
411The request had no Content-Length.Send each message as a normal JSON body rather than a chunked upload. Standard MCP clients already do.
413The request was larger than 64KB.A real MCP message is far smaller; check what the client is sending.

Keeping keys safe

Setup questions go to CarrierScrub support.

Related