MCP Server for VTEX APIs - Comprehensive integration with VTEX e-commerce platform providing 163+ API endpoints
This server has critical definition quality issues. It registers only ONE tool ('vtex_*') with a generic, catch-all pattern rather than exposing 163+ individual tools with distinct names, schemas, and descriptions. The tool name 'vtex_*' is a wildcard that violates naming conventions, it does not start with a clear action verb, making it impossible for LLMs to infer intent from the name alone. The input schema is severely underspecified: path parameters, query parameters, and request bodies are all collapsed into three generic object properties without per-parameter type constraints, descriptions, or enums. The description mentions '163+ API endpoints' but provides no guidance on WHEN to use this tool, what specific endpoints it can call, or how to structure inputs correctly. Parameters lack individual descriptions, 'pathParams' and 'queryParams' are just generic objects with no indication of valid keys, types, or formats. The factory pattern in VtexToolFactory.ts generates schemas with only type:'string' for all parameters and minimal descriptions ('Path parameter: {param}', 'Query parameter: {param}'). There is no documented output schema, callers have no way to know what fields to expect from different endpoints. The tool requires users/LLMs to know VTEX API internals (endpoint paths, valid parameters) rather than exposing a clean, discoverable interface. Error handling in VtexToolHandler returns a generic {success, error} structure without recovery guidance. No idempotency hints, no rate limit warnings, no dependency documentation.
[POST] Associate SKU service | Category: SKU service | Path: /api/catalog/pvt/skuservice | Path params: (none)
[POST] Associate SKU service attachment | Category: SKU service attachment | Path: /api/catalog/pvt/skuservicetypeattachment | Path params: (none)
[POST] Create category | Category: Category | Path: /api/catalog/pvt/category | Path params: (none)
[POST] Create SKU service type | Category: SKU service type | Path: /api/catalog/pvt/skuservicetype | Path params: (none)
[POST] Create SKU service value | Category: SKU service value | Path: /api/catalog/pvt/skuservicevalue | Path params: (none)
[DELETE] Delete SKU service type | Category: SKU service type | Path: /api/catalog/pvt/skuservicetype/:skuServiceTypeId | Path params: skuServiceTypeId
[DELETE] Delete SKU service value | Category: SKU service value | Path: /api/catalog/pvt/skuservicevalue/:skuServiceValueId | Path params: skuServiceValueId
Single catch-all tool 'vtex_*' instead of 163+ named tools. LLMs cannot infer action intent from 'vtex_*' and must guess parameter structure for each endpoint.
Input schema uses generic object properties without per-parameter type constraints, descriptions, or enums. pathParams and queryParams are undescribed, untyped buckets.
Tool description is 110 characters but lacks WHEN to use it, WHAT specific endpoints it calls, or HOW to structure parameters. Minimal usage guidance.
No documented output schema. Callers have no way to know what fields different VTEX endpoints return, blocking downstream tool chaining and context planning.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 12 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 14 | - | v1 |
[DELETE] Dissociate attachment by attachment ID or SKU service type ID | Category: SKU service attachment | Path: /api/catalog/pvt/skuservicetypeattachment | Path params: (none)
[DELETE] Dissociate attachment from SKU service type | Category: SKU service attachment | Path: /api/catalog/pvt/skuservicetypeattachment/:skuServiceTypeAttachmentId | Path params: skuServiceTypeAttachmentId
[DELETE] Dissociate SKU service | Category: SKU service | Path: /api/catalog/pvt/skuservice/:skuServiceId | Path params: skuServiceId
[GET] Get brand list | Category: Brand | Path: /api/catalog_system/pvt/brand/list | Path params: (none)
[GET] Get category by ID | Category: Category | Path: /api/catalog/pvt/category/:categoryId | Path params: categoryId
[GET] Get category tree | Category: Category | Path: /api/catalog_system/pub/category/tree/:categoryLevels | Path params: categoryLevels
[GET] Get paginated brand list | Category: Brand | Path: /api/catalog_system/pvt/brand/pagedlist | Path params: (none)
[GET] Get SKU service | Category: SKU service | Path: /api/catalog/pvt/skuservice/:skuServiceId | Path params: skuServiceId
[GET] Get SKU service type | Category: SKU service type | Path: /api/catalog/pvt/skuservicetype/:skuServiceTypeId | Path params: skuServiceTypeId
[GET] Get SKU service value | Category: SKU service value | Path: /api/catalog/pvt/skuservicevalue/:skuServiceValueId | Path params: skuServiceValueId
[PUT] Update category | Category: Category | Path: /api/catalog/pvt/category/:categoryId | Path params: categoryId
[PUT] Update SKU service | Category: SKU service | Path: /api/catalog/pvt/skuservice/:skuServiceId | Path params: skuServiceId
[PUT] Update SKU service type | Category: SKU service type | Path: /api/catalog/pvt/skuservicetype/:skuServiceTypeId | Path params: skuServiceTypeId
[PUT] Update SKU service value | Category: SKU service value | Path: /api/catalog/pvt/skuservicevalue/:skuServiceValueId | Path params: skuServiceValueId
Parameter descriptions are trivial ('Path parameter: id', 'Query parameter: limit'). No guidance on valid values, ranges, formats, or why each parameter exists.
All parameters forced to type:string with no enums, patterns, or min/max constraints. LLMs can pass invalid values (e.g. 'page_size: 999999') without client-side validation.
Error responses return generic {success, error} without recovery guidance. No categorization of retryable vs fatal errors. LLM has no direction on next action.
No idempotency hints. LLMs do not know which endpoints are safe to retry (read-only) vs have side effects (create, update, delete). Risk of duplicate POST submissions on retry.