MCP server for e-commerce product catalog ingestion, search, and agent-readable product data extraction from merchant websites using web crawling and AI-powered attribute extraction.
Aeola demonstrates solid definition quality with all 5 tools properly registered in src/mcp/server.ts using the MCP SDK. All tools have clear, action-oriented names following verb_noun conventions (list_, search_, get_, ingest_, get_). Descriptions are well-written (132-186 chars, within the 10-1024 baseline) and explain WHAT each tool does and WHEN to use it. Input schemas are defined using Zod with type information for all parameters. However, there are notable gaps: (1) output schemas are not formally documented, tools return JSON.stringify() of database records without specifying the exact fields agents should expect; (2) parameters lack detailed constraint documentation (e.g., merchantId has no range or validation guidance in the description); (3) error handling is minimal, most tools return generic JSON error objects rather than actionable recovery guidance; (4) no tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present despite the SDK supporting them; (5) the long-running ingest_merchant operation has no progress tracking or timeout specification. The read-only tools (list_products, search_products, get_product, get_ingestion_status) are well-structured, but the write operation (ingest_merchant) lacks the confirmation or dry-run pattern recommended for destructive/resource-heavy operations.
Get the status of an Aeola ingestion job, including progress and any extraction errors encountered during crawling.
Get detailed product data by ID from Aeola's catalog, including dynamically extracted attributes like price, description, and availability.
Ingest a merchant into Aeola — crawls the e-commerce website, extracts product data into agent-readable structured format, and stores it for querying. This is a long-running operation.
List all products for a given merchant from Aeola's catalog. Returns structured product data extracted from the merchant's e-commerce site.
Search Aeola's product catalog across all merchants by keyword. Use this to find, compare, and recommend products from agent-readable catalogs.
Output schemas are not formally documented. Tools return JSON.stringify() of database records, but agents have no specification of what fields to expect, types, or which fields are required for downstream calls. This forces LLMs to infer structure from examples and risks brittle downstream composition.
Parameter descriptions lack constraint information. The 'merchantId' parameter (integer type) has no documented valid range or guidance on how to obtain a valid ID. The 'query' parameter in search_products lacks length/character constraints. These omissions increase the likelihood of invalid input from LLMs.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | A | 80 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 55 | - | v1 |
Error handling is generic and provides no recovery guidance. The get_product and get_ingestion_status tools return {'error': 'Product not found'} / {'error': 'Job not found'} without suggesting what the agent should do next (e.g., 'Try search_products() with a keyword', or 'Check job status with a different ID'). This violates the recovery-guide pattern.
The ingest_merchant tool is a long-running operation (crawls e-commerce sites, extracts data) with no progress tracking, timeout specification, or confirmation step. The description states 'This is a long-running operation' but provides no guidance on expected duration, how to monitor progress, or what happens if the operation hangs. This is a destructive operation (writes to database) that lacks a dry-run or confirmation pattern.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are declared. The MCP SDK supports these annotations, and they would help agents understand which tools are safe to retry (idempotent read tools) vs. which carry side effects (ingest_merchant as destructiveHint). This reduces clarity for agent planning.
The ingest_merchant tool accepts a URL and validates protocol (http/https) but does not document allowed domains, rate limits, or what happens if the merchant site requires authentication. The description says 'crawls the e-commerce website' but does not specify whether private sites or sites behind login are supported.
Result pagination is hardcoded in search_products (limit=100, offset=0) with no agent control. If results exceed 100, agents cannot fetch additional items. There is no 'total_count' returned to signal whether more results exist, and the search_products tool lacks limit/offset parameters to enable proper pagination.