MCP server for Royal Mail Click & Drop. Book, label, track and cancel UK shipments from any MCP-compatible AI.
Royal Mail MCP demonstrates solid fundamentals with comprehensive parameter schemas and detailed descriptions. All 6 tools are explicitly defined with Zod schemas and descriptions. Tool names follow verb-noun conventions (book_order, get_label, track_order, cancel_order, list_services). Schema quality is strong across all tools with proper typing and enums. Output is returned as JSON with success indicators. However, several quality issues prevent a higher score: (1) Output schemas are not formally documented, responses are hardcoded JSON without declared return types, (2) Error handling lacks recovery guidance, errors return bare error messages without actionable next steps or error categorization, (3) Tool dependencies are not documented (e.g., book_order returns orderIdentifier which get_label requires, but this dependency chain is not explicit in descriptions), (4) No batch/pagination support, (5) Risk annotations (WRITE, READ_ONLY, REVERSIBLE) exist informally but are not integrated into MCP's destructiveHint/readOnlyHint/idempotentHint pattern.
Book multiple Royal Mail orders at once and return a single merged PDF containing every label, ready to print. Use this when the user pastes a list of orders/addresses. All orders share the same service, package format and sender. Saves the merged PDF to ~/Downloads/parcel-toolkit/ (overridable via PARCEL_TOOLKIT_LABELS_DIR).
Book a Royal Mail shipment via Click & Drop. Returns an orderIdentifier used to retrieve the label.
Cancel a Royal Mail shipment by orderIdentifier. The order must not yet be manifested. Returns success status and confirmation message.
Get the shipping label for a Royal Mail Click & Drop order and save it to disk. Works for any order you have previously booked — pass its orderIdentifier. Default save location is ~/Downloads/parcel-toolkit/, overridable via the PARCEL_TOOLKIT_LABELS_DIR env var.
List all available Royal Mail and Parcelforce services supported by this MCP server. Returns service codes, descriptions, availability by package format, and typical pricing ranges.
Output schemas are not formally documented. Tools return JSON objects (success, orderIdentifier, status, etc.) but the schema structure is not declared in the tool definition. LLMs cannot reliably parse undocumented response fields or plan downstream tool calls.
Error handling returns bare error messages without recovery guidance or error classification. Example: 'Error booking Royal Mail order: {err.message}' tells the LLM nothing about whether to retry, ask the user, or give up. No distinction between retryable (network timeout), user-fixable (invalid postcode), or fatal (invalid API key) errors.
Tool dependencies are implicit rather than explicit. book_order returns orderIdentifier which get_label requires, but this dependency is not documented in parameter descriptions. No 'If you have an order ID, call get_label to download the label' guidance in book_order's description.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 75 | 2026-07-28+ | v2 |
Track a Royal Mail shipment by orderIdentifier. Returns current status, location, and estimated delivery date if available.
Tool annotations (destructiveHint, readOnlyHint, idempotentHint) are not integrated into MCP schema. Risk labels exist in metadata (WRITE, READ_ONLY, REVERSIBLE) but are not present in the server.tool() registration, preventing proper client-side indication of operation side effects.
list_services lacks pagination and result limit documentation. Description does not state how many services are returned or whether results are paginated. For large service catalogues, this could overflow the context window.
No dry-run or confirmation pattern for destructive operations. cancel_order is immediately destructive with no confirm-before-execute step. Agents may cancel orders by accident.