MCP Server for Fabric SQL Assistant with Dynamic Configuration - enables natural language queries against Microsoft Fabric SQL databases with automatic schema discovery and Azure AD authentication
The Fabric SQL Assistant server registers 6 tools with explicit schemas and descriptions visible in mcp_server.py. All tools have basic name-verb patterns (configure_, discover_, ask_, get_, execute_, get_) and input schemas with JSON types. However, several definition quality gaps prevent a higher score: (1) Output schemas are completely undocumented, tools return TextContent but the actual data structure (field names, types, pagination) is unknown; (2) Error handling descriptions are absent, tools catch exceptions but don't guide LLM recovery; (3) Some parameter descriptions lack constraint information (e.g., 'sql' parameter has no length limits, SQL injection warnings, or expected result bounds); (4) Tool descriptions lack dependency hints and composition guidance; (5) Parameter relationships are undocumented (e.g., ask_database with use_auto_schema=true depends on discover_schema being called first, but this is not stated). Average tool description length is ~100 chars, within the acceptable range (p10=34, p90=392), but descriptions omit WHEN and WHY to use tools. All 6 tools have input schemas with types present, but 2 tools (get_current_config, discover_schema) have zero or minimal required parameters, which is appropriate but underscore simple behavior. Per-tool scores below reflect individual gaps.
Ask natural language questions about the Fabric SQL database
Configure the Fabric SQL database connection
Automatically discover database schema including all tables and columns
Execute a specific SQL query directly
Get current database configuration
Get detailed information about a specific table
Output schemas completely undocumented. All 6 tools return list[types.TextContent] but the actual response structure (fields, types, pagination) is unknown. LLMs cannot plan downstream calls or extract structured data.
execute_sql_query accepts 'sql' parameter as free-form string with no validation guidance, injection warnings, or constraint documentation. Risk: LLM passes arbitrary SQL including drops/deletes. Missing: length limits, example patterns, SQL injection notes.
No error recovery guidance. Catch-all exception handler returns raw error text ('Error in {name}: {str(e)}') without actionable hints. LLM cannot determine if error is retryable, user-fixable, or fatal.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 50 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 35 | - | v1 |
Tool composition dependencies undocumented. ask_database with use_auto_schema=true requires discover_schema to be called first, but this prerequisite is not mentioned in either tool's description. Agents may call tools in wrong order.
Parameter constraints missing. 'table_name' parameter (get_table_details, ask_database) has no validation rules (allowed characters, max length, case sensitivity). 'limit_rows' (execute_sql_query) has no min/max bounds documented in description.
Secrets via environment variables. configure_database sets FABRIC_SQL_SERVER and FABRIC_DATABASE as environment variables, which may be visible in process listings or logs. No evidence of secure secret storage (vault, k8s secrets).
No permission checks. Tools do not verify user/agent authorization before allowing database writes (configure_database, execute_sql_query). Any agent can reconfigure connections or run arbitrary SQL.
Pagination and result limits not enforced. execute_sql_query defaults to limit_rows=100 but ask_database (natural language) has no documented limit. Large result sets blow context windows.