Self-hostable MCP server for Alopeyk (الوپیک), an Iranian on-demand delivery & logistics company (On-Demand + Alonomic).
34 tools with consistent naming (verb_noun pattern: get_, create_, list_, etc.) and complete input schemas. Descriptions present but brief (avg ~60 chars, below 194-char baseline). All parameters have type definitions and descriptions. Output schemas not documented. Error handling minimal, no recovery guidance or actionable error messages. Missing tool annotations (readOnlyHint, destructiveHint). Composition is sound: tools are single-responsibility, chainable via instance parameter. Security: credentials injected via environment, not exposed as parameters. Strengths: comprehensive coverage of Alopeyk/Alonomic APIs, proper parameter typing. Weaknesses: descriptions too terse for LLM selection, no output schema docs, no error recovery patterns.
Save a new pickup address.
Estimate a parcel's price/dimensions by size/value/route.
Cancel a parcel before pickup (gated by enable_ordering).
Create a REAL business parcel (gated by enable_ordering).
Delete a saved pickup address.
Get today/tomorrow working pickup days.
Descriptions too brief (avg ~60 chars vs 194-char baseline). Most lack WHEN to use, prerequisites, or state-change warnings. LLMs cannot reliably select between similar tools (e.g., alopeyk_get_price vs alopeyk_get_batch_price) without richer context.
No output schemas documented. LLMs cannot plan downstream tool calls or extract required fields (e.g., order_id from create_order response). Responses are opaque.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without explicit hints. Agents may retry destructive ops (cancel_order, delete_saved_address) causing duplicate side effects.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | <=2025-11-25 | v2 |
Get the next 7 days with same/next availability.
Get the Alonomic business account profile and credit.
Get one business parcel by id.
List the 12 standard parcel box sizes.
List saved pickup addresses.
Log in to Alonomic (email/password) and cache the token.
List the Alonomic parcel status codes and their Persian labels.
Update a parcel before final send (gated by enable_ordering).
Cancel an order (gated by enable_ordering).
List the cities served by Alopeyk On-Demand.
Create a REAL delivery order (gated by enable_ordering).
Return offline docs about both Alopeyk services and these tools.
Finish/close an order, optionally rating (gated by enable_ordering).
Reverse-geocode a lat/lng to an address.
Calculate prices for up to 15 orders at once.
Get the On-Demand service configuration.
Get one order with rich columns (status, courier, ETA).
Calculate the price for a delivery between stops.
Get the authenticated user's profile and credit.
Autocomplete address suggestions for a query.
List loyalty products, or buy one (buy gated by enable_ordering).
Build a wallet top-up payment route (saman|zarinpal).
Build the printable invoice URL for an order.
Build the public tracking URL for an order token.
List the available transport (vehicle) types.
Validate a discount coupon code.
Check Alopeyk reachability via a lightweight On-Demand call.
List configured instances (env, base URLs, flags, which creds set) — never credential values.
Error handling absent. No recovery guidance, actionable error messages, or error classification (retryable vs user-fixable vs fatal). Agents cannot self-correct on invalid input (e.g., invalid transport_type).
Parameter constraints not enforced in descriptions. E.g., transport_type accepts 'motorbike|motor_taxi|cargo|cargo_s|car' but description does not list valid values. LLMs hallucinate invalid types.