MCP server that exposes a Supabase + pgvector knowledge base to Claude Desktop / Cursor / Claude Code. Spanish-first, multi-tenant aware (RLS). Ships with an in-memory demo KB so the server runs with zero external setup.
Three tools with complete schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. Tool names follow verb_noun convention (kb_search, kb_get_document, kb_list_tenants). Descriptions are present (avg 180 chars) and explain purpose, but lack actionable guidance on when to use each tool vs. alternatives. Parameters have types but lack detailed constraints (e.g., no limit bounds on kb_search, no format guidance for tenant_id). Output schemas are not documented, LLMs must infer structure from examples. Error handling is basic (generic try-catch with message only). No parameter descriptions for kb_list_tenants (empty properties). Security is reasonable (read-only operations, no secrets exposed), but tenant isolation is mentioned only in description, not enforced at schema level.
Fetch one full document by id, scoped to a tenant. Returns null if the document doesn't exist in that tenant.
List the tenant ids known to this KB. Useful in a demo / discovery flow -- in production this tool should usually be disabled and the tenant_id should come from the auth context.
Search the tenant's knowledge base for passages relevant to a natural-language query. Returns the top N hits with title, snippet, and score. Always filter by tenant_id -- there is no 'search across all tenants' mode (that's the point).
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting). kb_search returns array of {id, title, score, snippet}; kb_get_document returns Document or null; kb_list_tenants returns string[]. None of this is declared in tool definitions.
Parameter constraints missing. kb_search 'limit' has no min/max (default 5, but unbounded). 'query' and 'tenant_id' lack format guidance (length, character restrictions, case sensitivity). LLMs may pass invalid values.
kb_list_tenants has empty inputSchema.properties, no parameter descriptions at all. While the tool takes no required params, the schema should document this explicitly (e.g., 'This tool accepts no parameters').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
Error handling is generic. Catch-all try-catch returns 'Error handling {name}: {message}' with no recovery guidance. If tenant_id is invalid or query is empty, LLM gets no hint on what to do next (e.g., 'Call kb_list_tenants to discover valid tenant IDs').
Tool descriptions lack dependency hints. kb_search says 'Use kb_list_tenants if unknown' for tenant_id, but kb_get_document does not. No guidance on when to call kb_list_tenants first or how tools chain together.