execute_queryLABSCO SUMMARY
Discovery tools first, so the agent writes KQL against a schema it has actually read.
Listing tables, reading a schema and sampling rows are the three calls that stop a model from inventing column names, and they are all here alongside the raw query tool. Access is whatever your Azure identity already has — there is no separate key to scope, so the cluster's own permissions on that identity are the boundary worth checking before you connect it.
What it is
A Python MCP server for Azure Data Explorer and Microsoft Fabric Eventhouse clusters. It signs in with your existing Azure identity and returns query results as structured JSON.
What you get
execute_query— any KQL query against the configured databaselist_tables— every table in that databaseget_table_schema— the columns and types of one tablesample_table_data— a preview of a table's rows, with a sample size you setget_table_details— table statistics and metadata including row counts and storage size- A configurable tool list, so you can leave out the ones you never use and keep the context smaller
Requirements
ADX_CLUSTER_URL and ADX_DATABASE are required. Authentication uses DefaultAzureCredential, so signing in with the Azure CLI is enough on a workstation; on AKS it prefers workload identity when AZURE_TENANT_ID and AZURE_CLIENT_ID are present, with the token file at ADX_TOKEN_FILE_PATH. ADX_MCP_SERVER_TRANSPORT selects stdio, http or sse, bound by ADX_MCP_BIND_HOST and ADX_MCP_BIND_PORT.
Setup effort
Run a container — build the image from the repository, then point your client at it
USE CASES
Answering an operational question from telemetry
Sample the table to see what the rows look like, then write the KQL that actually answers the question.
Getting oriented in an unfamiliar database
List the tables, then read the schema of the two or three that look relevant.
Working out which tables are worth querying
Pull row counts and storage size so you can tell the live tables from the leftovers.
Running it inside a cluster instead of on a laptop
Deploy the container with workload identity set and switch the transport to http so other services can reach it.
5 tools
Listed in project docs. Your client may show a different list.
list_tablesget_table_schemasample_table_dataget_table_detailsBEFORE YOU INSTALL
What to know first
Tools you get
5 tools named in the project's documentation.
Requires
- docker on PATH
- ADX_CLUSTER_URL in your environment
- ADX_DATABASE in your environment
INSTALLATION
Connect your client
Build the image from the repository, then point your client at it.
Server setup
git clone https://github.com/pab1it0/adx-mcp-server.git
cd adx-mcp-server
docker build -t adx-mcp-server .MCP Clients
Claude Desktop
Without Docker: clone the repository and install it with uv:
git clone https://github.com/pab1it0/adx-mcp-server.git
cd adx-mcp-server
uv venv
uv pip install -e .Then add this block, with <YOUR_FULL_PATH_TO_ADX_MCP> set to the clone:
{
"mcpServers": {
"adx": {
"command": "uv",
"args": [
"--directory",
"<YOUR_FULL_PATH_TO_ADX_MCP>",
"run",
"src/adx_mcp_server/main.py"
],
"env": {
"ADX_CLUSTER_URL": "https://<YOUR_CLUSTER>.region.kusto.windows.net",
"ADX_DATABASE": "<YOUR_ADX_DATABASE>"
}
}
}
}Claude Desktop — Docker
{
"mcpServers": {
"adx": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"ADX_CLUSTER_URL",
"-e",
"ADX_DATABASE",
"-e",
"AZURE_TENANT_ID",
"-e",
"AZURE_CLIENT_ID",
"-e",
"ADX_TOKEN_FILE_PATH",
"adx-mcp-server"
],
"env": {
"ADX_CLUSTER_URL": "https://<YOUR_CLUSTER>.region.kusto.windows.net",
"ADX_DATABASE": "<YOUR_ADX_DATABASE>",
"AZURE_TENANT_ID": "<YOUR_AZURE_TENANT_ID>",
"AZURE_CLIENT_ID": "<YOUR_AZURE_CLIENT_ID>",
"ADX_TOKEN_FILE_PATH": "/var/run/secrets/azure/tokens/azure-identity-token"
}
}
}
}