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.4 - Canonical schema type normalization for sharper NL2KQL accuracy, credential redaction in logs, leaner dependencies, and a single-source package version.
Watch a quick demo of the MCP KQL Server in action:
-
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.
-
kql_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.
graph 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
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.
graph 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
- Python 3.10 or higher
- Azure CLI installed and authenticated (
az login) - Access to Azure Data Explorer cluster(s)
git clone https://github.com/4R9UN/mcp-kql-server.git && cd mcp-kql-server && pip install -e .pip install mcp-kql-serverThat'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
One-time install (any platform):
pip 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.)
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
{
"mcpServers": {
"mcpKqlServer": {
"type": "stdio",
"command": "python",
"args": ["-m", "mcp_kql_server"]
}
}
}Alternatives: platform-stable launchers or the installed console script
Windows (the py launcher is commonly available as py; use Get-Command py if you need its full path):
{
"mcpServers": {
"mcpKqlServer": {
"type": "stdio",
"command": "py",
"args": ["-3", "-m", "mcp_kql_server"]
}
}
}On macOS / Linux replace "py" with "python3" and drop the "-3" arg.
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
{
"servers": {
"mcpKqlServer": {
"type": "stdio",
"command": "py",
"args": ["-3", "-m", "mcp_kql_server", "--transport", "stdio"],
"timeout": 300000,
"env": {
"FASTMCP_TRANSPORT": "stdio",
"MCP_KQL_AUTH_ON_STARTUP": "false",
"MCP_KQL_CHECK_FOR_UPDATES": "false",
"MCP_KQL_DEFER_AUTH": "1",
"MCP_KQL_SKIP_STARTUP_VERSION_CHECK": "1",
"MCP_KQL_AUTH_CHECK_TIMEOUT_SECONDS": "10",
"MCP_KQL_AUTH_LOGIN_TIMEOUT_SECONDS": "120",
"MCP_KQL_SQLITE_BUSY_TIMEOUT_MS": "30000"
}
}
}
}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.
Windows tip: use
py -3 -m mcp_kql_serverso VS Code does not need a user-specific Python path. If you must use a full path locally, keep it in your privatemcp.json, not in shared documentation.
If the server starts but VS Code still shows no tools, run
MCP: Reset Cached Tools, thenMCP: Reset Trust, and restart the server fromMCP: List Servers. VS Code stores trust and cached tools separately frommcp.json, so a previous failed launch can keep the old empty state until you reset it.
Use shared HTTP when VS Code, GitHub Copilot CLI, agents, or other MCP clients should connect to one persistent MCP KQL server process.
Start the server:
python -m mcp_kql_server --transport http --host 127.0.0.1 --port 8000 --http-path /mcp --stateless-httpClient configuration:
{
"servers": {
"mcpKqlServer": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp"
}
}
}| Option or environment variable | Purpose | Default |
|---|---|---|
--transport, FASTMCP_TRANSPORT |
stdio, http, streamable-http, or sse |
stdio |
--host, FASTMCP_HOST |
HTTP bind host | 127.0.0.1 |
--port, FASTMCP_PORT |
HTTP bind port | 8000 |
--http-path, FASTMCP_STREAMABLE_HTTP_PATH |
Streamable HTTP endpoint path | /mcp |
--stateless-http, FASTMCP_STATELESS_HTTP |
Stateless HTTP mode for shared deployments | false |
--auth-on-startup, MCP_KQL_AUTH_ON_STARTUP |
Check Azure CLI auth before startup | false |
--check-updates, MCP_KQL_CHECK_FOR_UPDATES |
Check PyPI for package updates before startup | false |
MCP_KQL_AUTH_CHECK_TIMEOUT_SECONDS |
Azure CLI auth check timeout | 10 |
MCP_KQL_AUTH_LOGIN_TIMEOUT_SECONDS |
Interactive Azure login timeout | 120 |
MCP_KQL_SQLITE_BUSY_TIMEOUT_MS |
SQLite busy timeout for concurrent local MCP instances | 30000 |
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
{
"mcp-kql-server": {
"type": "stdio",
"command": "python",
"args": ["-m", "mcp_kql_server"],
"alwaysAllow": []
}
}For any MCP-compatible application:
# 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
# Shared HTTP mode for multiple clients
python -m mcp_kql_server --transport http --host 127.0.0.1 --port 8000 --http-path /mcp --stateless-http
# Server provides these tools:
# - execute_kql_query: Execute KQL or generate KQL from natural language
# - kql_schema_memory: Discover, cache, and inspect cluster schemasaz loginpython -m mcp_kql_serverTo inspect the installed server version and runtime defaults:
python -m mcp_kql_server --info --jsonThe 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
- β‘ Fast startup: Auth and update checks are deferred unless explicitly enabled
The server provides two main tools:
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 "
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"
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"
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"
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"
- β‘ Faster Query Development: AI-powered autocomplete and suggestions
- π¨ Rich Visualizations: Instant markdown tables for data exploration
- π§ Context Awareness: Understand your data structure without documentation
- π Automated Schema Discovery: Keep schema information up-to-date
- πΎ Smart Caching: Reduce API calls and improve performance
- π Secure Authentication: Leverage existing Azure CLI credentials
- π€ 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
%%{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 or streamable HTTP"| 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
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.
- β 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
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
# 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"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
- 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
-
Authentication Errors
# Re-authenticate with Azure CLI az login --tenant your-tenant-id -
Memory Issues
# 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
We welcome contributions! Please do.
- Issues: GitHub Issues
- PyPI Package: PyPI Project Page
- Author: Arjun Trivedi
- Certified : MCPHub
mcp-name: io.github.4R9UN/mcp-kql-server
Happy Querying! π

