Tiny MCP server for Databricks (Azure Databricks) over stdio with read-only SQL query execution and warehouse discovery.
The server provides 8 well-scoped tools for Databricks SQL access with consistent security controls. Tool naming follows verb_noun conventions (list_*, describe_*, query). All tools have non-empty descriptions (range 52 - 178 chars, well within the 10 - 1024 baseline). Input schemas are present and typed for all tools. However, output schemas are NOT documented, callers cannot see what fields to expect from responses. Error handling exists but lacks LLM-actionable recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite the framework supporting them. The query tool has strong input validation (blocklist regex, prefix enforcement) but this is implementation detail, not exposed to the LLM in descriptions.
Describe the schema of a table. Full name: catalog.schema.table or db.schema.table. Enforces allowlist.
Detect Unity Catalog (SHOW CATALOGS) vs legacy metastore (SHOW DATABASES). Returns basic info and a small sample list.
Check environment readiness and optional connection probe. Set probe=True to attempt a lightweight SELECT 1.
List schemas in a given catalog (UC) or database (legacy). Enforces allowlist.
List tables in a given schema. Full name format: catalog.schema or db.schema. Enforces allowlist.
Sanity check that the MCP server is running.
Output schemas not documented. Callers cannot see what fields responses contain (columns, rows, row_count, etc.). LLMs cannot infer downstream tool compatibility or plan chained calls.
Error handling lacks actionable recovery guidance. The code validates inputs (empty SQL, invalid identifiers, blocklist violations) but error messages are user-facing strings, not LLM-optimized recovery hints. E.g., 'Blocked: query contains a non-read-only keyword' does not tell the LLM what to try next.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being READ_ONLY. FastMCP supports tool annotations, adding them would improve LLM planning and safety.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | 2026-07-28+ | v2 |
Execute a read-only SQL query. Enforces prefix allowlist and keyword blocklist. Only SELECT, WITH, SHOW, DESCRIBE, DESC, EXPLAIN are allowed.
Trigger a background connection to wake the SQL warehouse. Returns immediately so clients don't time out on cold start.
Parameter descriptions lack format/constraint details. E.g., 'catalog_or_db' does not state expected format (e.g., 'alphanumeric, dash-separated'). 'sql' parameter does not explicitly list allowed keywords (SELECT, WITH, SHOW, DESCRIBE, DESC, EXPLAIN) even though the tool enforces this.
query tool lacks max_rows constraints in description. While code clamps between 1 and HARD_MAX_ROWS, the description does not state the allowed range. LLMs cannot infer upper bounds and may request excessive rows.
No pagination support despite data discovery tools (list_schemas, list_tables). If a catalog has thousands of schemas, the entire list is returned, risking context window exhaustion. Tools should support limit/offset.