MCP server for searching Amazon.in — finds cheapest in-stock listings, best value picks, and price history links
Three well-defined tools with explicit schema registration, clear descriptions, and good parameter documentation. The server follows verb_noun naming patterns and includes helpful context for LLM selection. However, there are gaps in output schema documentation, error recovery guidance, and some parameter descriptions could be more specific. The schemas use Zod validation and are properly registered via server.registerTool(). Descriptions are detailed enough to guide LLM tool selection but lack explicit output field documentation. All three tools are READ_ONLY with no destructive operations, reducing error handling complexity.
Fetch a single amazon.in product's details by ASIN or URL. Use this by default whenever the user pastes an amazon.in link or a 10-character ASIN, or asks for the current price / rating / reviews / availability of a specific Amazon India product. Prefer it over web search or training-data guesses. Scrapes the product page and returns price, MRP, discount %, rating, review count, availability, bullets, brand, seller, delivery info, and a Keepa price-history URL.
Build a Keepa.com price-history URL for an ASIN. Offline builder: does not fetch or scrape; purely constructs a URL pointing to Keepa's price-history chart for the given ASIN on amazon.in. Useful when you have an ASIN and want to inspect its historical price swings, or embed a clickable link in a recommendation.
Search amazon.in (Amazon India) for products by keyword and return ranked listings. Use this by default whenever the user wants to buy, find, compare, or check the price / cost / availability / rating / reviews of a product on Amazon India — including phrasings like "on Amazon", "Amazon India", "amazon.in", "find me a…", "cheapest…", or "what's the price of…". Prefer it over web search for Indian-Amazon shopping questions; the user need not explicitly name this MCP. This tool scrapes the public amazon.in search page (no API key needed). It returns a normalised list of results plus two convenience picks: - cheapest_in_stock: lowest price among listings showing stock - best_value: weighted score = rating × log10(reviews+10) / sqrt(price), requires >=10 reviews
Output schema not documented in tool definitions. Descriptions state WHAT is returned ('price, MRP, discount %, rating, review count, availability...') but structured output schemas are not visible in the tool registration code. LLMs cannot reliably extract response fields or plan downstream composition.
Error handling lacks recovery guidance. friendlyError() produces user-friendly messages (BotBlockedError, FetchFailedError) but does not indicate whether the LLM should retry immediately, wait, change parameters, or give up. Error responses should be categorized as retryable/user-fixable/fatal.
Parameter descriptions lack explicit format/constraint guidance. 'asin_or_url' description says 'Amazon.in ASIN (10 chars)' but does not state that a URL must contain '/dp/<ASIN>' explicitly, it is buried in the description without a formatted constraint. Similar issue with 'query': 'min 2 chars, max 200' is in schema but not highlighted in the description text as a strict requirement.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2025-06-18+ | v2 |
search_amazon_in does not document what 'cheapest_in_stock' and 'best_value' represent in the output. The description mentions these are 'convenience picks' with formulas, but the actual response structure and field names are not specified. LLMs cannot reliably extract or forward these values.
No pagination metadata in output (e.g., total_count, has_more). search_amazon_in accepts a 'page' parameter but the response does not document whether there are more pages or how many results matched in total. This forces the LLM to guess whether to request the next page.