MCP server that exposes a real sales CRM (Supabase) as tools for AI agents, plus a CLI that works without a model.
Nexus-mcp demonstrates solid fundamentals: all 5 tools have clear descriptions (avg 180 chars, within 10-1024 baseline), verb-noun naming (buscar_, resumen_, seguimientos_, cambiar_, agregar_), and complete input schemas with Zod validation. However, output schemas are undocumented, responses are free-text wrapped in MCP content blocks, forcing LLMs to parse unstructured text. Parameter descriptions are good but lack format guidance (e.g., 'UUID' mentioned but not validated in schema). Error handling returns plain text errors without recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear read/write semantics.
Suma una entrada al historial de seguimiento de un prospecto, con la fecha de hoy. Respeta el formato del CRM, así que la nota aparece en el panel de historial como una más.
Busca prospectos en el CRM por texto libre (nombre del negocio, contacto o notas) y/o por estado, rubro y zona. Devuelve una lista con el id de cada uno, que es lo que necesitan las herramientas de cambiar_estado y agregar_nota.
Mueve un prospecto de estado en el pipeline. El id sale de buscar_prospectos.
Foto general del pipeline de ventas: cuántos prospectos hay en cada estado, cuántos seguimientos están vencidos, cuántos quedaron abandonados y cuánta plata hay en juego.
A quién hay que seguir. Devuelve tres grupos: los seguimientos vencidos, los que vencen en los próximos días, y los prospectos abandonados (mostraron interés, nadie los descartó y no tienen fecha de seguimiento cargada). El tercer grupo es el que no aparece en ninguna planilla.
Output schemas undocumented. All tools return free-text responses wrapped in MCP content blocks. LLMs must parse unstructured text (e.g., 'VENCIDOS (3):\n...' from seguimientos_pendientes) instead of structured JSON. This wastes tokens, increases hallucination risk, and breaks downstream tool chaining.
No tool annotations. Tools cambiar_estado and agregar_nota are destructive (WRITE risk), but lack destructiveHint annotation. resumen_pipeline and seguimientos_pendientes are read-only but lack readOnlyHint. Agents cannot distinguish safe from risky tools without reading descriptions.
Error handling lacks recovery guidance. fallo() returns 'Error: <message>' with isError=true but no actionable next steps. E.g., if buscar_prospectos finds no matches, it says 'No hay prospectos...' but doesn't suggest refining filters or checking estado enum values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Parameter format constraints missing from schema. 'id' parameter described as 'UUID' in text but not validated in Zod schema (z.string() with no pattern). 'limite' has min/max but no description of default behavior (25). Agents cannot infer valid formats.
No pagination support. buscar_prospectos accepts 'limite' (max 100) but no offset/cursor. If a search returns 100 results, agent cannot fetch the next batch. Large result sets risk context window exhaustion.