MCP server for the Yango Delivery B2B API (international Yandex Delivery) — express-courier price checks, delivery claims, courier tracking and confirmation codes for AI agents.
This is a well-structured MCP server for the Yango Delivery API with 13 tools covering claims, tracking, and raw API access. Strengths: comprehensive parameter schemas with proper type definitions and descriptions, clear tool naming following verb_noun convention (create_claim, get_claim, accept_claim, etc.), detailed descriptions that explain what each tool does and when to use it, explicit error handling with recovery guidance (e.g., 'Errors: 404, claim or courier not found'). The descriptions are notably LLM-friendly, ranging 150-500 chars and covering prerequisites, common failures, and how to interpret responses. Tool composition is clean, each tool does one thing. Weaknesses: output schemas are documented in prose descriptions but not formally in JSON Schema; idempotency handling for create_claim is mentioned but not systematized; raw_request tool is a power-user escape hatch that could encourage misuse; some error codes are listed but recovery guidance could be more explicit (e.g., 'call search_claims to verify' rather than just '404, not found'). The server correctly avoids exposing the OAuth token as a parameter (server-side injection via YANGO_DELIVERY_TOKEN). Overall, this is production-grade definition quality with room for formalized output schemas.
Confirms an estimated claim (starts the courier search). Not retried on 5xx.
Cancels a claim. `cancel_state` must come from cancel_info.
Cancellation terms for a claim: free, paid or unavailable.
Preliminary delivery cost estimate WITHOUT creating a claim — the pricing method for countries outside Russia. Returns price (a decimal STRING, not a number!), currency_rules {code, sign, template}, distance_meters, eta (minutes) and zone_id. Route points take [longitude, latitude] coordinates and/or a full address string. Typical errors: 400 address_not_found (address not recognized), 409 estimating.cant_construct_route (no route between the points), 409 estimating.requirement_unavailable.
Creates a delivery claim. IMPORTANT: the claim is NOT dispatched immediately — it goes through estimation (status: new → estimating → ready_for_approval) and must then be confirmed with accept_claim, or pass auto_accept=true. Returns id (claim_id), status, version, route_points, pricing, created_ts. Verify success via get_claim: estimation errors can arrive as an error_messages array inside a 200 response. request_id makes the call idempotent: a retry with the same request_id returns the same claim, not a duplicate.
Output schemas are documented only in prose descriptions, not in formal JSON Schema. Tools should declare their output structure (e.g., {claim_id: string, status: string, pricing: {price: string, currency_rules: {code: string, sign: string, template: string}}} for create_claim). This forces LLMs to parse unstructured text and wastes tokens on schema inference.
raw_request tool is a powerful escape hatch but lacks safeguards. Description says 'CAUTION: this tool can perform state-changing operations' but does not guide the LLM on when to use it, what alternatives exist, or how to validate its inputs. This invites misuse, e.g., an LLM calling raw_request with a malformed path or destructive payload without checking safety first.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 74 | 2026-07-28+ | v2 |
Full claim info: status, courier, pricing. The body is empty by contract.
Pickup/delivery confirmation code for the current point of the claim (when a code applies). Returns code (string) and attempts (remaining code entry attempts). 404 — claim not found or issuing a confirmation code via the API is prohibited.
Temporary forwarded phone number to call the courier of an active claim: phone (e.g. "+79099999998"), ext (extension, e.g. "0163") and ttl_seconds (how long the number stays operational). Errors: 400 invalid_point_phone; 404 — claim or courier not found; 409 inappropriate_status (the order is already completed).
Current courier geoposition for an active claim: position {lat, lon, timestamp (unix), accuracy, speed (m/s), direction (0–360°, clockwise from north)} and route_points with sharing_link. Errors: 404 — claim or courier position not found, 409 — the claim is not active or no courier is assigned.
Expected arrival times per route point plus the current courier position. Works only while the claim is active and a courier is assigned. Returns route_points [{id, address, type, visit_order, visit_status (pending|arrived|visited|skipped), visited_at {expected, expected_waiting_time_sec, actual}}] and performer_position. Errors: 404 not_found; 409 — the claim is inactive, has no courier, or the courier position is unknown.
Public courier tracking links — safe to share with the recipient. Returns route_points [{id, type, visit_order, sharing_link}]; sharing_link is available only for type=destination points. 409 errors: inappropriate_status, unknown_tracking_links.
Escape hatch: a direct call to any method of the Yango Delivery claims B2B API — for endpoints without a dedicated tool (tariffs, delivery-methods, claims/proof-of-delivery/info, claims/edit, claims/apply-changes, claims/return, claims/bulk_info, claims/journal, …). Paths are relative to the API root, e.g. "b2b/cargo/integration/v2/tariffs". query becomes the query string, body is sent as JSON. CAUTION: this tool can perform state-changing operations; 5xx/network errors are retried only for GETs.
Searches claims by filters with offset/limit or cursor pagination. Returns an array of claim summaries matching the filters, with pagination cursors for efficient large-result traversal.
Error recovery guidance is implicit rather than explicit. Errors like '404, claim or courier not found' do not tell the LLM what to do next (e.g., 'Verify the claim_id by calling search_claims' or 'Create a new claim with create_claim'). This delays agent self-correction.
The idempotency mechanism (request_id in create_claim) is documented in the description but not enforced at the schema level. A generated UUID is mentioned as optional but the parameter itself is not marked as optional or given a default. This could confuse LLMs about when to pass request_id.
Tool descriptions use example values in error lists (e.g., 'Errors: 400 address_not_found, 409 estimating.cant_construct_route'). While these are error codes (not data), they could be clarified with inline recovery hints (e.g., 'Errors: 400 address_not_found, try a more specific address or coordinates').