An e-commerce MCP server for querying products and affiliate stores from a PostgreSQL database
This e-commerce MCP server presents 16 well-structured read-only tools with consistent naming patterns and documented schemas. However, the tool definitions reveal moderate gaps in parameter descriptions, missing output schema documentation, and inconsistent depth across tools. The server demonstrates competent implementation of basic patterns but falls short of production-grade quality expected at 70+. Parameter descriptions are present but often terse (e.g., 'product availability filter' lacks format/constraint detail). Output schemas are inferred from code but never explicitly documented in tool definitions. Error handling is minimal, tools return empty objects or bare errors with no recovery guidance. Tool naming follows verb_noun conventions well (list_, search_, products_by_), but some tools could be more discoverable with better descriptions. The server is suitable for internal/demo use but needs refinement for production agent deployment.
Produtos associados a uma determinada loja afiliada.
Lista todas as lojas afiliadas.
Lista lojas afiliadas ativas ou inativas.
Quantidade de lojas por plataforma.
Lista todas as marcas distintas dos produtos.
Lista todas as categorias distintas entre os produtos.
Lista todos os produtos, com paginação.
Output schemas are not documented. Tool descriptions omit what fields the LLM should expect in responses. The code returns dictionaries (via as_dict()) but tool registrations do not declare the return schema structure, forcing LLMs to infer field names and types.
Parameter descriptions are terse and lack constraint detail. Examples: 'product availability filter' does not state that it is a boolean; 'maximum number of products to return' lacks the implied upper bound of 50 or enforcement range; 'brand name to filter by' does not explain if matching is case-sensitive or substring-based (code uses ilike, which should be documented).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 47 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
Produtos de uma loja afiliada (por id ou nome).
Retorna produtos de uma determinada marca.
Produtos de uma categoria específica.
Recupera detalhes de um produto pelo ID interno ou externo.
Lista produtos com preço promocional (sale_price < price).
Retorna menor e maior preço dos produtos.
Pesquisa flexível em produtos: filtra por nome, plataforma, faixa de preço, disponibilidade, categoria, marca e loja.
Retorna resumo de produtos: total, média de preços, total de categorias, total de marcas e produtos disponíveis.
Categorias mais usadas entre os produtos.
Error handling is minimal and non-actionable. products_detail returns {'error': 'Informe product_id ou external_id'} in Portuguese (inconsistent with English tool descriptions), and other tools silently return empty lists on failure (e.g., products_by_affiliate returns [] if store not found). LLMs receive no guidance on whether to retry, ask the user, or abandon the operation.
Mutually exclusive parameters lack documentation. products_detail accepts product_id OR external_id but does not state in parameter descriptions that only one should be provided; products_by_affiliate accepts affiliate_store_id OR affiliate_store_name but does not warn against ambiguity if both are passed.
No pagination support on tools returning large result sets. products_search, products_by_brand, products_by_category, and affiliate_store_products accept no limit/offset parameters and may return hundreds of items, exhausting context windows and degrading LLM reasoning.
Some tool names could be more discoverable. 'products_summary' and 'products_price_range' are clear, but 'categories' and 'brands' lack the 'list_' or 'products_' prefix, making them less obvious as e-commerce-specific discovery tools. Agents may not recognize them as relevant.
No tool annotations for safety/semantics. Tools lack readOnlyHint (all are read-only), idempotentHint (which tools are safe to retry?), or destructiveHint (none are destructive, but annotation would be clearer).