mcp-yuntrack
mcp-parceltrack
MCP server (stdio transport) for parcel tracking, supporting YunTrack (YunExpress) and 4PX. You do not pick a carrier — the server works it out from the tracking number.
How it works
Each carrier is a provider behind a common interface, and a router chooses per
tracking number: a recognised prefix (4PX…, or YT/UJ/BCM/0099) goes straight to
its carrier, while an unrecognised one is probed cheapest-carrier-first.
The two carriers could hardly be less alike. 4PX is a plain open endpoint (~200 ms,
no browser, no signature) — but it only ever reads the first entry of its
queryCodes array, so it cannot batch: each parcel is its own request, fanned out
a few at a time.
YunTrack is the opposite. It batches 100 numbers per call, but its provider has to
call services.yuntrack.com/Track/Query with a signed POST request (HMAC-SHA256,
key found in the page bundle). Because Alibaba Cloud WAF blocks
requests that lack Chrome's TLS fingerprint, a headless Chromium browser is kept alive
in the background and all API calls are made via page.evaluate() — the browser's
own fetch() — rather than loading the full tracking page each time. This keeps
response times around 400 ms per query.
A shared browser context is reused across all calls so warm-up only happens once, and it is started lazily — a 4PX-only lookup never launches Chromium at all. The raw JSON from each API is returned as-is — no field interpretation.
Build
npm install
npx playwright install chromium
npm run buildDevelopment & testing
npm run inspect # opens MCP Inspector in the browser — lets you call tools interactively
npm run dev # watch mode (tsc + node --watch)Installing in Claude Desktop
Open (or create)
~/Library/Application Support/Claude/claude_desktop_config.jsonAdd the server under
mcpServers:
{
"mcpServers": {
"parceltrack": {
"command": "/absolute/path/to/mcp-parceltrack/node_modules/.bin/tsx",
"args": ["/absolute/path/to/mcp-parceltrack/src/index.ts"]
}
}
}Restart Claude Desktop — the
track_parceltool is now available.
Installing in Claude Code (CLI)
Run once from any directory:
claude mcp add parceltrack /absolute/path/to/mcp-parceltrack/node_modules/.bin/tsx /absolute/path/to/mcp-parceltrack/src/index.tsRestart Claude Code. The tool is available in every project.
To confirm it loaded:
claude mcp listInstalling in Claude Code via project config
Add a .claude/mcp.json (or mcp.json) in your project root:
{
"mcpServers": {
"parceltrack": {
"command": "/absolute/path/to/mcp-parceltrack/node_modules/.bin/tsx",
"args": ["/absolute/path/to/mcp-parceltrack/src/index.ts"]
}
}
}This makes the server available to everyone who opens the project in Claude Code.
Tool: track_parcel
Single tracking number:
{ "trackingId": "UJ123456789SE" }Batch — carriers may be mixed freely:
{ "trackingIds": ["UJ123456789SE", "4PX3003133457168CN"] }Forcing a carrier (rarely needed; only when auto-detection is known to be wrong):
{ "trackingId": "1234567890", "provider": "4px" }Result
One entry per tracking number, in the order you gave them:
[
{
"trackingId": "4PX3003133457168CN",
"provider": "4px",
"found": true,
"result": { "queryCode": "4PX3003133457168CN", "tracks": [ ... ] }
}
]provider— which carrier answered.found— whether that carrier actually has a record of the parcel. Check this, notresult: both carriers reply to numbers they have never heard of (4PX with an empty stub, YunTrack by echoing the number back with zeroed fields), so a payload alone proves nothing.result— the carrier's raw JSON, unmodified. Shapes differ per carrier.error— present only when the request itself failed, never for a simple miss.
Checking the routing
npm run check:routingHits both carriers live and asserts the routing rules (correct carrier per prefix, input order preserved, no browser launched for a 4PX-only lookup).
The structural checks run on throwaway numbers. To also prove that a real parcel
comes back as found, pass tracking numbers of your own — none are committed:
PARCELTRACK_TEST_4PX=4PX…CN PARCELTRACK_TEST_YUNTRACK=YT… npm run check:routingLatest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/waldell/mcp-parceltrack'
If you have feedback or need assistance with the MCP directory API, please join our Discord server