Skip to content
TrackJet
MCP server · read-only · public

Developers

TrackJet exposes its tracking-number detection, carrier-metadata lookup, and routing logic as a Model Context Protocol (MCP) server. Connect from any MCP-compatible client — Claude Desktop, Cursor, ChatGPT, or your own agent — and query in real time. No PII, no scraping, no resale concerns: every output is either TrackJet's own routing logic or already-public carrier metadata.

Carrier counts explained

Production routing directory
326
Active public tracking surfaces
290
Air cargo airlines (active)
202
Research catalog (long-tail)
1,669
Licensed live-event feeds today
DHL UTAPI

All figures are read live from our directory and catalog — never hardcoded. "Live events" means real carrier events from a licensed feed; for every other carrier TrackJet routes you to the official tracking surface and labels the source. We never fabricate carrier events.

Quick start

A minimal end-to-end probe with curl:

# 1. initialize
curl -X POST https://trackjet.world/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

# 2. list tools
curl -X POST https://trackjet.world/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

# 3. call a tool
curl -X POST https://trackjet.world/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"detect_tracking_number","arguments":{"number":"RR008310255CN"}}}'

Claude Desktop config

Add to your claude_desktop_config.json under mcpServers:

{
  "mcpServers": {
    "trackjet": {
      "url": "https://trackjet.world/mcp"
    }
  }
}

Tools (12)

  • detect_tracking_number

    read-only

    Detect tracking number format

    Given a raw tracking number, identify the shipment format (IATA MAWB, ISO 6346 ocean container, UPU S10 postal, UPS 1Z parcel, FedEx, DHL, etc.) and the public TrackJet vertical that owns the lookup. Returns the normalized number, the primary detection match with its confidence flag, all candidate matches sorted by priority, and any catalog-curated carrier match (Cainiao LP, Evri GB10, J&T Express JT12, etc.). Use BEFORE asking the user to clarify — most numbers resolve unambiguously. The response contains no PII and no live shipment events; this is a format identifier, not a tracker.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {
            "number": {
                "type": "string",
                "description": "Raw tracking number as the user typed it. Whitespace and dashes are tolerated and stripped during normalization.",
                "minLength": 1,
                "maxLength": 80,
                "examples": [
                    "RR008310255CN",
                    "020-12345678",
                    "MAEU209915846",
                    "1Z999AA10123456784",
                    "LP00123456789CN"
                ]
            }
        },
        "required": [
            "number"
        ]
    }
  • get_carrier_info

    read-only

    Get carrier metadata by slug

    Look up a carrier in TrackJet's catalog by its URL-safe slug (e.g. "cainiao", "evri", "maersk-bol", "royal-mail"). Returns canonical name, category (parcel / post_ems / air_cargo / ocean / freight), country of registration when known, official tracking URL with link type (deep_link / search_page / b2b_only / unknown), and any number-format regex used for auto-detection. Production-table rows take precedence over catalog rows when both exist. Use this when you already know which carrier the user is asking about and need authoritative metadata.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {
            "slug": {
                "type": "string",
                "description": "URL-safe carrier slug (lowercase, hyphen-separated). Match the slug TrackJet uses in /airline/<slug>, /parcel/carrier/<slug>, /post/country/<code>, etc.",
                "pattern": "^[a-z0-9][a-z0-9\\-]{0,148}[a-z0-9]$",
                "minLength": 2,
                "maxLength": 150,
                "examples": [
                    "cainiao",
                    "evri",
                    "maersk-bol",
                    "royal-mail",
                    "china-post",
                    "aramex"
                ]
            }
        },
        "required": [
            "slug"
        ]
    }
  • get_tracking_url

    read-only

    Get the tracking URL for a number

    Given a raw tracking number, return the single best URL to send the user to for live tracking. The URL is one of: (a) the carrier's official tracking page directly (deep link or search page) when TrackJet has a curated mapping for that carrier, or (b) a TrackJet vertical route that resolves the carrier on landing (e.g. /post/RR008310255CN routes through TrackJet which then forwards to the postal operator). Always returns at least the /track universal landing as a safe fallback. The response includes the resolved vertical, the carrier slug if known, and a `confidence` flag.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {
            "number": {
                "type": "string",
                "description": "Raw tracking number. Whitespace and dashes tolerated.",
                "minLength": 1,
                "maxLength": 80,
                "examples": [
                    "RR008310255CN",
                    "LP00123456789CN",
                    "1Z999AA10123456784",
                    "020-12345678"
                ]
            }
        },
        "required": [
            "number"
        ]
    }
  • list_supported_carriers

    read-only

    List supported carriers by category

    Enumerate the carriers TrackJet knows about. Filter by `category` (parcel, post_ems, air_cargo, ocean, freight) to scope the list, or omit it to get the production directory across all categories. Each entry includes slug, display name, category, country (when known), and whether a curated tracking URL is available. Combine with `get_carrier_info` to fetch full metadata for a specific carrier. The catalog includes 1,669 carriers; default `limit` is 50 — use pagination via `offset` to walk the long tail.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {
            "category": {
                "type": "string",
                "description": "Optional category filter.",
                "enum": [
                    "parcel",
                    "post_ems",
                    "air_cargo",
                    "ocean",
                    "freight"
                ],
                "examples": [
                    "parcel",
                    "post_ems"
                ]
            },
            "limit": {
                "type": "integer",
                "description": "Max rows to return (default 50, hard cap 200).",
                "minimum": 1,
                "maximum": 200,
                "default": 50
            },
            "offset": {
                "type": "integer",
                "description": "Pagination offset for walking the long tail.",
                "minimum": 0,
                "default": 0
            },
            "include_catalog": {
                "type": "boolean",
                "description": "Include the research catalog alongside the production directory. Default: true.",
                "default": true
            }
        },
        "required": []
    }
  • get_shipment_events

    read-only

    Get live shipment events (DHL Group)

    Fetch live tracking events for a DHL Group shipment number (DHL Express, DHL Paket, DHL eCommerce, DHL Freight, DHL Global Forwarding) via the official DHL Unified Tracking API. Returns timestamped events with status, status code, and location when DHL provides them. Each response carries the canonical attribution "Tracking data provided by Deutsche Post DHL Group" and a resale_allowed=false flag — display these to your end user; do not store, resell, or redistribute the events. For non-DHL carriers, fall back to get_tracking_url (TrackJet's routing logic). Errors are returned as structured payloads (number_not_found, rate_limited, key_rejected) rather than exceptions.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {
            "number": {
                "type": "string",
                "description": "DHL Group tracking number. Examples: DHL Express (10 digits), DHL Paket (12-20 digits, often starting 0034 or JD/GM), DHL Freight, DHL Global Forwarding. UTAPI accepts the broadest range across DHL services.",
                "minLength": 6,
                "maxLength": 40,
                "pattern": "^[A-Z0-9]{6,40}$",
                "examples": [
                    "0034123456789012",
                    "JD0002214567890123"
                ]
            }
        },
        "required": [
            "number"
        ]
    }
  • get_trackjet_capabilities

    read-only

    Get TrackJet capabilities snapshot

    Returns a live snapshot of what TrackJet can do RIGHT NOW. Includes the number of carriers in the production catalog vs. the catalog overlay, the list of tracking-number formats the detector recognises, the set of carriers for which TrackJet pulls real events from a licensed API (today: DHL UTAPI), the available MCP tools, and the current production data volume (shipments tracked, delivery observations recorded, routes with a mature ETA model). Includes an explicit list of things TrackJet does NOT do — read this BEFORE describing TrackJet to a user, so the description matches reality. No PII, read-only, cached 5 minutes server-side. Call this once per session to ground subsequent answers.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {},
        "additionalProperties": false
    }
  • estimate_carbon

    read-only

    Estimate shipment CO2e (GLEC / ISO 14083)

    Estimate the carbon footprint (kg CO2e) of a shipment from its transport mode, weight and distance, using GLEC Framework / ISO 14083 default modal intensity factors — the same factors trackjet.world's on-page calculator and REST API use. This is an ESTIMATE based on modal defaults (the response carries is_estimate=true and the methodology string); actual emissions depend on vehicle, load factor, fuel and routing. Valid modes: air, ocean, road, rail. Typical mapping from TrackJet verticals: air_cargo→air, container/bol→ocean, parcel/post_ems→road.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {
            "mode": {
                "type": "string",
                "enum": [
                    "air",
                    "road",
                    "rail",
                    "sea",
                    "inland"
                ],
                "description": "Transport mode the factor is taken from."
            },
            "weight_kg": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 100000000,
                "description": "Shipment weight in kilograms."
            },
            "distance_km": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 100000,
                "description": "Transport distance in kilometres."
            }
        },
        "required": [
            "mode",
            "weight_kg",
            "distance_km"
        ]
    }
  • verify_timeline

    read-only

    Verify a shipment timeline (tamper-evidence)

    Check whether a tracked shipment's event history is intact. TrackJet seals every recorded event into a SHA-256 hash-chain at ingest time (spec tjvt2, see trackjet.world/standards/verifiable-timeline); this tool re-verifies the chain and reports the chain digest plus one of: valid, event_mismatch (the stored events differ from what was sealed — actual tampering), events_unavailable (the seal chain is intact but the events it covers were deleted by data retention, so it cannot be re-derived — NOT tampering, do not report it as such), seal_chain_corrupted, or not_sealed. A valid result proves the stored history was not edited, reordered or truncated after recording — it does NOT certify the carrier's original data. Accepts a tracking number or a chain UUID. Returns integrity metadata only, never event contents.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {
            "query": {
                "type": "string",
                "minLength": 4,
                "maxLength": 128,
                "description": "Tracking number or chain UUID."
            }
        },
        "required": [
            "query"
        ]
    }
  • get_distance

    read-only

    Great-circle distance between two locations

    Resolve two location identifiers (IATA code, UN/LOCODE, ICAO code, or an unambiguous "City, CC") against TrackJet's locally imported UN/LOCODE 2025-1 + OurAirports data and return the great-circle (haversine) distance in km. IMPORTANT: this is the shortest path on the sphere — NOT the sailed ocean route, flown airway or driven road (e.g. Rotterdam–Singapore is ~10,500 km great-circle but ~15,000 km sailed via Suez); every response carries is_great_circle=true. Ambiguous names refuse to resolve rather than guess.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {
            "from": {
                "type": "string",
                "minLength": 2,
                "maxLength": 120,
                "description": "IATA / UN/LOCODE / ICAO / \"City, CC\"",
                "examples": [
                    "FRA",
                    "DEHAM",
                    "Hamburg, DE"
                ]
            },
            "to": {
                "type": "string",
                "minLength": 2,
                "maxLength": 120,
                "description": "Same forms as `from`.",
                "examples": [
                    "JFK",
                    "SGSIN"
                ]
            }
        },
        "required": [
            "from",
            "to"
        ]
    }
  • get_transit_stats

    read-only

    Typical route transit time (TrackJet own data)

    p50/p90 transit duration for a (vertical, origin country, destination country[, carrier]) route, computed exclusively from TrackJet's own anonymous observations of completed tracked shipments. A route answers ONLY when mature (>=10 real observations) — otherwise matured=false with no numbers: do not invent transit times from an immature answer. Verticals: parcel, post_ems, air_cargo, container, bol. Countries are ISO 3166-1 alpha-2.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {
            "vertical": {
                "type": "string",
                "enum": [
                    "parcel",
                    "post_ems",
                    "air_cargo",
                    "container",
                    "bol"
                ]
            },
            "origin_country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "description": "ISO 3166-1 alpha-2"
            },
            "destination_country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "description": "ISO 3166-1 alpha-2"
            },
            "carrier_slug": {
                "type": "string",
                "maxLength": 150,
                "description": "Optional carrier filter."
            }
        },
        "required": [
            "vertical",
            "origin_country",
            "destination_country"
        ]
    }
  • assess_shipment_truth

    read-only

    Shipment time-truth assessment (TrackJet own data)

    Assess the time-consistency of a shipment's carrier history that TrackJet has already observed. Returns truth_score (0..1), consistent (bool), observation_latency_hours (how late we recorded it vs the carrier's latest event), freshness_hours, and counts of chronology_out_of_order / future_dated_events / status_regressions, plus human-readable flags. This is a factual per-shipment check, NOT a statistic and NOT a delivery prediction. Returns found=false when TrackJet has no stored events for the number — do not fabricate an assessment from that.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {
            "tracking_number": {
                "type": "string",
                "minLength": 4,
                "maxLength": 128,
                "description": "A tracking number TrackJet has already observed."
            }
        },
        "required": [
            "tracking_number"
        ]
    }
  • forecast_delivery

    read-only

    Delivery probability forecast (TrackJet own data)

    Probability that a shipment is delivered within 1/2/3/5/7/10/14 days, plus remaining-time p50/p90, from a Monte-Carlo + Markov model over TrackJet's own observed transit times for the (vertical, origin country, destination country[, carrier]) route, conditioned on current_status and elapsed_hours. Answers ONLY for mature routes (>= 8 real observations) — otherwise matured=false with no numbers: do not fabricate a probability. This is probabilistic, NOT a delivery guarantee. Verticals: parcel, post_ems, air_cargo, container, bol. Countries are ISO 3166-1 alpha-2.

    Input schema (JSON Schema 2020-12)
    {
        "type": "object",
        "properties": {
            "vertical": {
                "type": "string",
                "enum": [
                    "parcel",
                    "post_ems",
                    "air_cargo",
                    "container",
                    "bol"
                ]
            },
            "origin_country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2
            },
            "destination_country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2
            },
            "current_status": {
                "type": "string",
                "description": "e.g. pre-transit, in_transit, out_for_delivery, delivered, exception"
            },
            "elapsed_hours": {
                "type": "number",
                "minimum": 0,
                "description": "Hours since the shipment was first seen in transit."
            },
            "carrier_slug": {
                "type": "string",
                "maxLength": 150,
                "description": "Optional carrier filter."
            }
        },
        "required": [
            "vertical",
            "origin_country",
            "destination_country",
            "current_status",
            "elapsed_hours"
        ]
    }

Independence & resale

  • Detection + routing is 100% TrackJet's own logic. UniversalDetector, CrossVerticalRouter, CatalogDetector — all TrackJet-authored. Output of those tools is resaleable without third-party-data restrictions.
  • Catalog metadata. Names, slugs, categories published in our public directories (/post/countries, /bol/carriers, /parcel/carriers). Tracking URLs are the carriers' own public pages — pointing an agent there is the same as pointing a browser there.
  • What this MCP server does NOT serve. Live shipment events, PII, scraped third-party tracking data, or anything from a carrier feed under restrictive ToS. When TrackJet ships its first own event source (DHL official API), adding an MCP tool for it will respect that source's attribution + retention contract.

Commercial tier — coming

The current MCP surface is free and public. An optional X-Api-Key header is reserved for the commercial tier (higher rate limits, priority routing, SLA, optional delivery-event tools when those land). Today the key is not enforced — the read-only contract makes abuse low-risk. Email to be on the early-access list.

Are you a carrier?

We add new carrier integrations continuously (latest: Royal Mail). If you run a tracking API and want your customers to track inside TrackJet, request an integration — it takes a minute and we review every request honestly.

Open specs

Discovery