Read-only MCP server for Snowflake databases
Single tool 'query' has a clear verb-noun name and basic description, but critical gaps undermine quality. The input schema is visible with a 'sql' parameter (string type), but lacks validation constraints in the schema itself, validation happens only at runtime via validate_sql_query(). Parameter description is minimal (18 chars: 'SQL query string to execute'). No output schema is documented; the tool returns a formatted string but LLMs cannot predict structure. Error handling is absent, no guidance on what to do if validation fails or query times out. The tool does not follow the pattern:tool-description baseline (194 chars avg; this is ~60). No pagination, no result limits documented. Security validation is present (read-only check, SQL injection prevention) but not exposed in the schema or description, leaving LLMs unaware of constraints.
Executes a read-only SQL query against the Snowflake database.
No output schema documented. Tool returns 'formatted table string' but LLMs cannot predict structure, field names, or data types. Violates pattern:tool requirement for documented return types.
Parameter description is 18 characters ('SQL query string to execute'). Baseline is 72 chars avg. Missing format constraints, examples of valid queries, and explicit statement that comments are forbidden. Violates pattern:tool-description.
No error handling guidance. If validation fails (forbidden keywords detected, comments present, query times out), tool raises generic Exception. LLM receives no actionable recovery path. Violates pattern:recovery-guide.
Input schema lacks constraints. 'sql' parameter is bare string type with no maxLength, pattern, or enum. Runtime validation (validate_sql_query) is not exposed to LLM. LLM cannot self-correct before calling tool.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | <=2025-11-25 | v2 |
No result limits or pagination documented. Tool can return unbounded result sets, risking context window exhaustion. Violates mxe:enforce-result-limits.