MCP server for the Holded API v2: contacts, sales and purchase documents, payments, treasury, accounting, catalog, team, CRM, projects, calendar, inbox and webhooks, with confirmation gates on every destructive operation.
Critical structural deficiency: 14 of 15 tools use a generic 'action' parameter with minimal schema and vague descriptions. This violates the single-responsibility principle and forces LLMs to guess at valid action values. Tool names (holded_contacts, holded_sales, etc.) are domain nouns, not action verbs, they do not convey what happens when called. The holded_discover tool documents this anti-pattern explicitly: 'call it with no action to see the actions in its error message.' This is a discovery failure, not a feature. Only holded_request has a slightly more specific schema (method, path). Descriptions are generic ('action parameter for managing X') and under 50 chars, providing no guidance on which actions exist, when to use them, or what they return. No output schemas are documented. Error handling relies on runtime discovery via error messages rather than upfront schema clarity.
Accounting domain tool with action parameter
Calendar domain tool with action parameter
Catalog domain tool with action parameter
Contacts domain tool with action parameter for managing contacts
CRM domain tool with action parameter
List the Holded tool domains. Each domain is one tool named holded_<domain> with an `action` parameter; call it with no action to see the actions in its error message, or read the tool description.
Inbox domain tool with action parameter
Generic 'action' parameter anti-pattern: 14 tools accept a single 'action' string with no enum, no valid values documented, no output schema. LLMs must call the tool blindly and parse error messages to discover valid actions. This violates pattern:tool and pattern:constrained-input.
Tool names are domain nouns (holded_contacts, holded_sales), not action verbs. LLMs cannot infer intent from the name alone. Baseline: 90% of A+ tools start with action verbs (get_, create_, list_, search_, update_). These names violate pattern:tool naming conventions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 30 | 2026-07-28+ | v2 |
Payments domain tool with action parameter
Projects domain tool with action parameter
Purchase documents domain tool with action parameter
Gated escape hatch for anything without a dedicated action
Sales documents domain tool with action parameter
Team domain tool with action parameter
Treasury domain tool with action parameter
Webhooks domain tool with action parameter
Descriptions are generic and under 50 characters (e.g., 'Contacts domain tool with action parameter for managing contacts'). They do not explain WHAT the tool does, WHEN to use it, or WHAT it returns. Baseline: A+ tools average 194 chars.
No output schemas documented. LLMs cannot plan downstream tool calls or extract required fields. Baseline: 100% of A+ tools have documented return types. This violates pattern:tool and pattern:response-shaper.
Error handling relies on runtime discovery. holded_discover explicitly documents: 'call it with no action to see the actions in its error message.' This forces LLMs to make blind calls and parse errors instead of consulting upfront schemas. Violates pattern:recovery-guide and pattern:error-classification.