MCP server for managing database operations, including ticket management, loan processing, and agent seniority tracking for the Xpress system
This MCP server exhibits significant quality gaps across naming, descriptions, parameters, and schema documentation. While tool definitions are visible in the source code (tickets-client.ts), they lack the rigor expected of production-grade agent tools. Naming is inconsistent (getAll vs changeStatus mixing camelCase conventions without verb prefixes in some cases). Descriptions are present but generic and lack context for LLM decision-making. Parameters have type definitions but lack depth in descriptions explaining constraints, dependencies, and valid ranges. Output schemas are undocumented, the LLM cannot see what fields to expect from responses. Error handling is minimal; the code throws raw HTTP errors without actionable recovery guidance. The server exposes database credentials in plaintext within source code, a critical security violation. Most tools are READ_ONLY, which is appropriate for discovery, but WRITE tools (changeStatus, sendMessage) lack confirmation steps or dry-run support, inviting agent mistakes. Overall, this reads like an internal prototype rather than a public-facing tool set.
Cambiar el status de un ticket
Obtener todos los tickets (vista optimizada, sin base64)
Obtener ticket completo con mensajes
Obtener tickets por PIN de usuario
Obtener solo los mensajes de un ticket
Marcar ticket como completado
Marcar ticket como en proceso
Marcar ticket como pendiente
Output schemas completely undocumented. LLMs cannot see what fields (id, status, createdAt, etc.) are returned by any tool. This violates the pattern:tool and pattern:response-shaper guidance and forces LLMs to guess field names for chaining calls.
Database credentials (COUCHDB_USER, COUCHDB_PASS with plaintext password 'cGw9Km4ejuyqn9eca7J*') hardcoded in source. This is a critical security breach. Violates pattern:secret-injection. Credentials must be injected via environment variables or vault at runtime, never in source.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 32 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 25 | - | v1 |
Enviar mensaje a un ticket
Enviar mensaje como sistema/soporte
Parameter descriptions lack constraint specifications. E.g., 'pin' is described as 'Usuario PIN number' but missing: required type confirmation, valid range (1 - 999999?), what happens on invalid PIN (empty result or error?).
WRITE tools (changeStatus, markPending, markInProgress, markCompleted, sendMessage, sendSystemMessage) lack confirmation or dry-run support. Per pattern:confirmation-request, irreversible operations should support a preview step to prevent agent-initiated mistakes. A single malformed call could change dozens of ticket statuses.
Error handling is minimal. The TicketsClient.request() method throws raw HTTP errors ('HTTP 409: Conflict') without actionable recovery hints. Per pattern:recovery-guide, errors must tell the LLM what to do next (retry? user-fix? fatal?). A 409 conflict (document revision mismatch) should suggest retrying or querying for the latest state.
Tool descriptions are generic and lack context for LLM decision-making. E.g., 'Obtener todos los tickets (vista optimizada, sin base64)' tells what it does but not when to use it (discovery? initial load?), how many results to expect, or whether pagination is needed.
No pagination support on getAll(). For a system potentially containing thousands of tickets, returning all results in one call will exhaust context and invite hallucination. Per pattern:paginated-result, list tools must support limit/offset and return a total count or next_cursor.
Naming inconsistency: tools mix verb-first patterns (getAll, changeStatus) without clear verb prefixes. Per Arcade pattern:tool and naming baseline, 90% of A+ tools start with an action verb (get_, list_, create_, update_, search_). The pattern is mostly present here but not consistently emphasized in descriptions.