Local-first MCP server that lets LLM agents inspect, analyze, and manage e-commerce data (products, inventory, orders) over stdio. Zero-config mock data engine included, with a clean interface to swap in live Shopify/Stripe APIs.
Project Tango demonstrates solid tool design with clear naming conventions (verb_noun pattern), comprehensive parameter descriptions, and well-structured schemas using Zod validation. All four tools follow consistent patterns and include actionable descriptions. However, output schemas are not formally documented in the tool definitions, they are only visible in the implementation (jsonResult helper). Parameter validation is present but error messages lack recovery guidance. No tool annotations (readOnlyHint, idempotentHint) are declared despite all tools being read-only. Descriptions average ~180 chars, within the 10-1024 baseline, but could be more concise for LLM parsing efficiency.
Calculates gross revenue, average order value (AOV), the top-selling products by units sold, and a breakdown of orders by fulfillment status (pending / shipped / delivered), based on current order history.
Scans the entire inventory and returns InventoryAlert objects for every product at or below a stock threshold. Products under 3 units are flagged 'critical'; everything else at or under the threshold is flagged 'low'. Results are sorted by current stock ascending (most urgent first).
Returns the full product catalog, optionally filtered by category and/or a min/max price range. Use this to browse or search inventory before recommending, restocking, or drafting copy for products.
Evaluates every low-stock item and recommends an exact reorder quantity. The recommendation is derived from each product's demand velocity (units sold per day over recent order history), projected demand across an assumed 14-day supplier lead time plus a 7-day safety buffer, minus current stock on hand. Items with no recent sales history fall back to a conservative flat restock quantity.
Output schemas not formally documented in tool definitions. Responses are returned as JSON text via jsonResult() helper, but the structure is not declared in the tool registration. LLMs cannot plan downstream operations without knowing what fields to expect.
No tool annotations (readOnlyHint, idempotentHint, destructiveHint) declared. All four tools are read-only and idempotent, but this is not signaled to the client. Clients cannot optimize caching or retry strategies without explicit hints.
Error handling returns generic error messages without recovery guidance. errorResult() helper returns isError=true with plain text, but does not categorize errors as retryable, user-fixable, or fatal, nor suggest next steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
analyze_sales_metrics has no input schema declared (empty inputSchema object). While the tool takes no parameters, an explicit empty schema {} should be registered for clarity.
No pagination support for list_all_products. If the product catalog grows large, returning all filtered results could exhaust context. Should accept limit and offset/cursor parameters and return total count.