MCP KQL Server
mcp-name: io.github.4R9UN/mcp-kql-server
AI-Powered KQL Query Execution with Natural Language to KQL (NL2KQL) Conversion and Execution
A Model Context Protocol (MCP) server that transforms natural language questions into optimized KQL queries with intelligent schema discovery, AI-powered caching, and seamless Azure Data Explorer integration. Simply ask questions in plain English and get instant, accurate KQL queries with context-aware results.
Latest Version: v2.1.2 - Hardcoded 10-minute Kusto servertimeout, ADX-side dry-run validation for generated queries, schema-drift recovery loop, and fully schema-driven NL2KQL with no hardcoded table or column names.
š¬ Demo
Watch a quick demo of the MCP KQL Server in action:
š Features
-
execute_kql_query:- Natural Language to KQL: Generate KQL queries from natural language descriptions.
- Direct KQL Execution: Execute raw KQL queries.
- Multiple Output Formats: Supports JSON, CSV, and table formats.
- Strict Schema Validation: Uses discovered schema memory and validation before execution.
- Schema-Grounded Repair: Repairs invalid columns only when a valid table schema can prove the replacement.
-
schema_memory:- Schema Discovery: Discover and cache schemas for tables.
- Database Exploration: List all tables within a database.
- AI Context: Get ranked CAG context for tables, with optional table-scoped strict schema output.
- Analysis Reports: Generate reports with visualizations.
- Cache Management: Clear or refresh the schema cache.
- Memory Statistics: Get statistics about the memory usage.
š MCP Tools Execution Flow
mermaidgraph TD A[š¤ User Submits KQL Query] --> B{š Query Validation} B -->|ā Invalid| C[š Syntax Error Response] B -->|ā Valid| D[š§ Load Schema Context] D --> E{š¾ Schema Cache Available?} E -->|ā Yes| F[ā” Load from Memory] E -->|ā No| G[š Discover Schema] F --> H[šÆ Execute Query] G --> I[š¾ Cache Schema + AI Context] I --> H H --> J{šÆ Query Success?} J -->|ā Error| K[šØ Enhanced Error Message] J -->|ā Success| L[š Process Results] L --> M[šØ Generate Visualization] M --> N[š¤ Return Results + Context] K --> O[š” AI Suggestions] O --> N style A fill:#4a90e2,stroke:#2c5282,stroke-width:2px,color:#ffffff style B fill:#7c7c7c,stroke:#4a4a4a,stroke-width:2px,color:#ffffff style C fill:#e74c3c,stroke:#c0392b,stroke-width:2px,color:#ffffff style D fill:#8e44ad,stroke:#6a1b99,stroke-width:2px,color:#ffffff style E fill:#7c7c7c,stroke:#4a4a4a,stroke-width:2px,color:#ffffff style F fill:#27ae60,stroke:#1e8449,stroke-width:2px,color:#ffffff style G fill:#f39c12,stroke:#d68910,stroke-width:2px,color:#ffffff style H fill:#2980b9,stroke:#1f618d,stroke-width:2px,color:#ffffff style I fill:#f39c12,stroke:#d68910,stroke-width:2px,color:#ffffff style J fill:#7c7c7c,stroke:#4a4a4a,stroke-width:2px,color:#ffffff style K fill:#e74c3c,stroke:#c0392b,stroke-width:2px,color:#ffffff style L fill:#27ae60,stroke:#1e8449,stroke-width:2px,color:#ffffff style M fill:#8e44ad,stroke:#6a1b99,stroke-width:2px,color:#ffffff style N fill:#27ae60,stroke:#1e8449,stroke-width:2px,color:#ffffff style O fill:#f39c12,stroke:#d68910,stroke-width:2px,color:#ffffff
Schema Memory Discovery Flow
The schema memory flow is integrated into query execution, but it now reuses existing cached schema before attempting live discovery. If a table schema is already available in CAG/schema memory, the server will use that cached schema instead of re-indexing it.
mermaidgraph TD A[š¤ User Requests Schema Discovery] --> B[š Connect to Cluster] B --> C[š Enumerate Databases] C --> D[š Discover Tables] D --> E[š Get Table Schemas] E --> F[š¤ AI Analysis] F --> G[š Generate Descriptions] G --> H[š¾ Store in Memory] H --> I[š Update Statistics] I --> J[ā Return Summary] style A fill:#4a90e2,stroke:#2c5282,stroke-width:2px,color:#ffffff style B fill:#8e44ad,stroke:#6a1b99,stroke-width:2px,color:#ffffff style C fill:#f39c12,stroke:#d68910,stroke-width:2px,color:#ffffff style D fill:#2980b9,stroke:#1f618d,stroke-width:2px,color:#ffffff style E fill:#7c7c7c,stroke:#4a4a4a,stroke-width:2px,color:#ffffff style F fill:#e67e22,stroke:#bf6516,stroke-width:2px,color:#ffffff style G fill:#8e44ad,stroke:#6a1b99,stroke-width:2px,color:#ffffff style H fill:#f39c12,stroke:#d68910,stroke-width:2px,color:#ffffff style I fill:#2980b9,stroke:#1f618d,stroke-width:2px,color:#ffffff style J fill:#27ae60,stroke:#1e8449,stroke-width:2px,color:#ffffff
š Prerequisites
- Python 3.10 or higher
- Azure CLI installed and authenticated (
az login) - Access to Azure Data Explorer cluster(s)
š One-Command Installation
Quick Install (Recommended)
From Source
bashgit clone https://github.com/4R9UN/mcp-kql-server.git && cd mcp-kql-server && pip install -e .
Alternative Installation Methods
bashpip install mcp-kql-server
That's it! The server automatically:
- ā
Sets up memory directories in
%APPDATA%\KQL_MCP(Windows) or~/.local/share/KQL_MCP(Linux/Mac) - ā Configures optimal defaults for production use
- ā Suppresses verbose Azure SDK logs
- ā No environment variables required
š± MCP Client Configuration
One-time install (any platform):
bashpip install --upgrade mcp-kql-serverAfter install, configure your MCP client to launch the server via the Python module entry point:
python -m mcp_kql_server. This works on every platform where Python is onPATHand does not depend on the location of themcp-kql-serverconsole script. (The console script is still installed bypipand remains supported for backward compatibility ā see the alternative snippets below.)
Claude Desktop
Add to your Claude Desktop MCP settings file (mcp_settings.json):
Location:
- Windows:
%APPDATA%\Claude\mcp_settings.json - macOS:
~/Library/Application Support/Claude/mcp_settings.json - Linux:
~/.config/Claude/mcp_settings.json
json{ "mcpServers": { "mcp-kql-server": { "type": "stdio", "command": "python", "args": ["-m", "mcp_kql_server"] } } }
Windows (the py launcher always lives at C:\Windows\py.exe):
json{ "mcpServers": { "mcp-kql-server": { "type": "stdio", "command": "py", "args": ["-3", "-m", "mcp_kql_server"] } } }
On macOS / Linux replace "py" with "python3" and drop the "-3" arg.
Or use the console script that pip install drops on PATH:
json{ "mcpServers": { "mcp-kql-server": { "type": "stdio", "command": "mcp-kql-server", "args": [] } } }
VSCode (with MCP Extension)
Add to your VSCode MCP configuration:
Settings.json location:
- Windows:
%APPDATA%\Code\User\mcp.json - macOS:
~/Library/Application Support/Code/User/mcp.json - Linux:
~/.config/Code/User/mcp.json
json{ "servers": { "mcp-kql-server": { "type": "stdio", "command": "python", "args": ["-m", "mcp_kql_server"] } } }
If VS Code logs
spawn ...PythonNNN/python.exe ENOENT, the Python extension is substituting a cached interpreter path for"python". Switch to"py"(Windows) /"python3"(macOS/Linux), or to the"mcp-kql-server"console script thatpip installdrops onPATH. See docs/troubleshooting.md for full details.
Roo-code Or Cline (VS-code Extentions)
Ask or Add to your Roo-code Or Cline MCP settings:
MCP Settings location:
- All platforms: Through Roo-code extension settings or
mcp_settings.json
json{ "mcp-kql-server": { "type": "stdio", "command": "python", "args": ["-m", "mcp_kql_server"], "alwaysAllow": [] } }
Generic MCP Client
For any MCP-compatible application:
bash# Preferred: invoke as a Python module (cross-platform) python -m mcp_kql_server # Platform-stable launchers (recommended if `python` is ambiguous on PATH) py -3 -m mcp_kql_server # Windows python3 -m mcp_kql_server # macOS / Linux # Equivalent console script installed by pip mcp-kql-server # Server provides these tools: # - execute_kql_query: Execute KQL or generate KQL from natural language # - schema_memory: Discover, cache, and inspect cluster schemas
š§ Quick Start
1. Authenticate with Azure (One-time setup)
bashaz login
2. Start the MCP Server (Zero configuration)
bashpython -m mcp_kql_server
The server starts immediately with:
- š Auto-created memory path:
%APPDATA%\KQL_MCP\cluster_memory - š§ Optimized defaults: No configuration files needed
- š Secure setup: Uses your existing Azure CLI credentials
3. Use via MCP Client
The server provides two main tools:
execute_kql_query- Execute KQL queries or generate KQL from natural language
schema_memory- Discover, refresh, and inspect cached cluster schemas
š” Usage Examples
Basic Query Execution
Ask your MCP client (like Claude):
"Execute this KQL query against the help cluster:
cluster('help.kusto.windows.net').database('Samples').StormEvents | take 10and summarize the result and give me high level insights "
Complex Analytics Query
Ask your MCP client:
"Query the Samples database in the help cluster to show me the top 10 states by storm event count, include visualization"
Schema Discovery
Ask your MCP client:
"Discover and cache the schema for the help.kusto.windows.net cluster, then tell me what databases and tables are available"
Data Exploration with Context
Ask your MCP client:
"Using the StormEvents table in the Samples database on help cluster, show me all tornado events from 2007 with damage estimates over $1M"
Time-based Analysis
Ask your MCP client:
"Analyze storm events by month for the year 2007 in the StormEvents table, group by event type and show as a visualization"
šÆ Key Benefits
For Data Analysts
- ā” Faster Query Development: AI-powered autocomplete and suggestions
- šØ Rich Visualizations: Instant markdown tables for data exploration
- š§ Context Awareness: Understand your data structure without documentation
For DevOps Teams
- š Automated Schema Discovery: Keep schema information up-to-date
- š¾ Smart Caching: Reduce API calls and improve performance
- š Secure Authentication: Leverage existing Azure CLI credentials
For AI Applications
- š¤ Intelligent Query Assistance: AI-generated table descriptions and suggestions
- š Structured Data Access: Clean, typed responses for downstream processing
- šÆ Context-Aware Responses: Rich metadata for better AI decision making
šļø Architecture
mermaid%%{init: {'theme':'dark', 'themeVariables': { 'primaryColor':'#1a1a2e', 'primaryTextColor':'#00d9ff', 'primaryBorderColor':'#00d9ff', 'secondaryColor':'#16213e', 'secondaryTextColor':'#c77dff', 'secondaryBorderColor':'#c77dff', 'tertiaryColor':'#0f3460', 'tertiaryTextColor':'#ffaa00', 'tertiaryBorderColor':'#ffaa00', 'lineColor':'#00d9ff', 'textColor':'#ffffff', 'mainBkg':'#0a0e27', 'nodeBorder':'#00d9ff', 'clusterBkg':'#16213e', 'clusterBorder':'#9d4edd', 'titleColor':'#00ffff', 'edgeLabelBackground':'#1a1a2e', 'fontFamily':'Inter, Segoe UI, sans-serif', 'fontSize':'16px', 'flowchart':{'nodeSpacing':60, 'rankSpacing':80, 'curve':'basis', 'padding':20} }}}%% graph LR Client["š„ļø MCP Client<br/><b>Claude / AI / Custom</b><br/>āāāāāāāāā<br/>Natural Language<br/>Interface"] subgraph Server["š MCP KQL Server"] direction TB FastMCP["ā” FastMCP<br/>Framework<br/>āāāāāāāāā<br/>MCP Protocol<br/>Handler"] NL2KQL["š§ NL2KQL<br/>Engine<br/>āāāāāāāāā<br/>AI Query<br/>Generation"] Executor["āļø Query<br/>Executor<br/>āāāāāāāāā<br/>Validation &<br/>Execution"] Memory["š¾ Schema<br/>Memory<br/>āāāāāāāāā<br/>AI Cache"] FastMCP --> NL2KQL NL2KQL --> Executor Executor --> Memory Memory --> Executor end subgraph Azure["āļø Azure Services"] direction TB ADX["š Azure Data<br/>Explorer<br/>āāāāāāāāā<br/><b>Kusto Cluster</b><br/>KQL Engine"] Auth["š Azure<br/>Identity<br/>āāāāāāāāā<br/>Device Code<br/>CLI Auth"] end %% Client to Server Client ==>|"š” MCP Protocol<br/>STDIO/SSE"| FastMCP %% Server to Azure Executor ==>|"š Execute KQL<br/>Query & Analyze"| ADX Executor -->|"š Authenticate"| Auth Memory -.->|"š„ Fetch Schema<br/>On Demand"| ADX %% Styling - Using cyberpunk palette style Client fill:#1a1a2e,stroke:#00d9ff,stroke-width:4px,color:#00ffff style FastMCP fill:#16213e,stroke:#c77dff,stroke-width:3px,color:#c77dff style NL2KQL fill:#1a1a40,stroke:#ffaa00,stroke-width:3px,color:#ffaa00 style Executor fill:#16213e,stroke:#9d4edd,stroke-width:3px,color:#9d4edd style Memory fill:#0f3460,stroke:#00d9ff,stroke-width:3px,color:#00d9ff style ADX fill:#1a1a2e,stroke:#ff6600,stroke-width:4px,color:#ff6600 style Auth fill:#16213e,stroke:#00ffff,stroke-width:2px,color:#00ffff style Server fill:#0a0e27,stroke:#9d4edd,stroke-width:3px,stroke-dasharray: 5 5 style Azure fill:#0a0e27,stroke:#ff6600,stroke-width:3px,stroke-dasharray: 5 5
Report Generated by MCP-KQL-Server | ā Star this repo on GitHub
š Production Deployment
Ready to deploy MCP KQL Server to Azure for production use? We provide comprehensive deployment automation for Azure Container Apps with enterprise-grade security and scalability.
š Features
- ā Serverless Compute: Azure Container Apps with auto-scaling
- ā Managed Identity: Passwordless authentication with Azure AD
- ā Infrastructure as Code: Bicep templates for reproducible deployments
- ā Monitoring: Integrated Log Analytics and Application Insights
- ā Secure by Default: Network isolation, RBAC, and least-privilege access
- ā One-Command Deploy: Automated PowerShell and Bash scripts
š Deployment Guide
For complete deployment instructions, architecture details, and troubleshooting:
š View Production Deployment Guide
The guide includes:
- šļø Detailed architecture diagrams
- āļø Step-by-step deployment instructions (PowerShell & Bash)
- š Security configuration best practices
- š Troubleshooting common issues
- š¦ Docker containerization details
Quick Deploy
bash# PowerShell (Windows) cd deployment .\deploy.ps1 -SubscriptionId "YOUR_SUB_ID" -ResourceGroupName "mcp-kql-prod-rg" -ClusterUrl "https://yourcluster.region.kusto.windows.net" # Bash (Linux/Mac/WSL) cd deployment ./deploy.sh --subscription "YOUR_SUB_ID" --resource-group "mcp-kql-prod-rg" --cluster-url "https://yourcluster.region.kusto.windows.net"
š Project Structure
mcp-kql-server/ āāā mcp_kql_server/ ā āāā __init__.py # Package initialization ā āāā mcp_server.py # Main MCP server implementation ā āāā execute_kql.py # KQL query execution logic ā āāā memory.py # Advanced memory management ā āāā kql_auth.py # Azure authentication ā āāā utils.py # Utility functions ā āāā constants.py # Configuration constants āāā docs/ # Documentation āāā Example/ # Usage examples āāā pyproject.toml # Project configuration āāā README.md # This file
š Security
- Azure CLI Authentication: Leverages your existing Azure device login
- No Credential Storage: Server doesn't store authentication tokens
- Local Memory: Schema cache stored locally, not transmitted
š Troubleshooting
Common Issues
-
Authentication Errors
bash# Re-authenticate with Azure CLI az login --tenant your-tenant-id -
Memory Issues
bash# The memory cache is now managed automatically. If you suspect issues, # you can clear the cache directory, and it will be rebuilt on the next query. # Windows: rmdir /s /q "%APPDATA%\KQL_MCP\unified_memory.json" # macOS/Linux: rm -rf ~/.local/share/KQL_MCP/cluster_memory -
Connection Timeouts
- Check cluster URI format
- Verify network connectivity
- Confirm Azure permissions
š¤ Contributing
We welcome contributions! Please do.
š Support
- Issues: GitHub Issues
- PyPI Package: PyPI Project Page
- Author: Arjun Trivedi
- Certified : MCPHub
š Star History
mcp-name: io.github.4R9UN/mcp-kql-server
Happy Querying! š





