MCP server that provides secure, tool-based access to Snowflake Gold-layer curated business data for natural language querying of sales, customer, and product analytics
This server has three tools with mixed quality. All tool names follow verb-noun conventions (query_*, list_*, get_*), which is good. However, critical issues undermine the overall score: (1) Input schemas lack type definitions for some parameters and descriptions are present but generic; (2) Output schemas are not explicitly documented in the code, returns are inferred from docstrings; (3) Error handling is minimal, errors are returned as dict keys but lack structured categorization or recovery guidance; (4) Parameter descriptions exist but are brief and lack constraints (e.g., 'limit' has no min/max bounds); (5) The 'question' parameter in query_snowflake_gold accepts free-form text with no enum/validation constraints, risking hallucinated queries. Tool definitions appear to be directly in agent/core.py (not inferred), so per-tool caps don't apply, but the implementation quality is below production baseline.
Get help information about available data and question formats. Returns: Dictionary with help information and guidance for users
List available Gold-layer views and supported question types. Returns: Dictionary containing available views and example questions for Milestone 1
Query Snowflake Gold-layer views using natural language. For Milestone 1, supports: - Daily sales analysis: "What were daily sales this week?" - Customer segment analysis: "Which customer types spend the most?" - Product performance: "What are the top selling products?" Args: question: Natural language question about business data limit: Maximum number of rows to return (uses config default if not specified) Returns: Dictionary containing query results, metadata, and success status
Output schemas not documented. Tool descriptions mention 'returns Dict' but do not specify field names, types, or structure. LLMs cannot infer downstream chaining fields or know what to expect.
Input parameter 'limit' in query_snowflake_gold has no min/max bounds. Default is null (falls back to config DEFAULT_QUERY_LIMIT=10). Unbounded parameter lets LLM pass absurd values (e.g., limit=999999), risking API overload or timeout.
Parameter 'question' in query_snowflake_gold accepts any free-form string with no validation or enum constraints. The tool uses keyword matching internally ('daily sales', 'customer segment', etc.) but the schema does not declare these as valid patterns. LLMs may pass unsupported questions, triggering fallback error messages.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 31 | - | v1 |
Error handling is unstructured. Errors are returned as dict keys ('success': False, 'error': string) with no recovery guidance or actionable next steps. Missing pattern: recovery-guide. LLMs cannot distinguish retryable errors from user-fixable errors.
Parameter descriptions are generic and lack format/constraint details. E.g., 'limit' says 'Maximum number of rows' but does not state min=1, max=100 (MAX_QUERY_LIMIT). 'question' says 'Natural language question' without hinting at supported question types.
list_available_data and get_data_help have empty input schemas ({}) but their docstrings do not explain what structure they return. Discovery tools should document what fields are in the response (e.g., 'Returns dict with keys: views (list of str), example_questions (list of str)').