sql-server-mcp
A local MCP server for read-only SQL Server / MS Fabric queries. Runs as a single-user process over stdio, authenticated as you (delegated Entra ID identity, not a service principal) — one server process per tenant.
Prerequisites
- Python 3.14+ and uv
- Either the Azure CLI logged in to the target tenant (
az login --tenant <tenant-id>), or just a browser available — the server falls back to an interactive browser login if there's no CLI session - An Entra ID account in the target tenant with read access to the target database (e.g.
db_datareader)
Configuration
Each tenant gets its own set of environment variables:
| Variable | Required | Description |
|---|---|---|
MCP_SQL_SERVER_NAME |
yes | SQL Server / Fabric SQL endpoint hostname, e.g. xyz-xyz.datawarehouse.fabric.microsoft.com |
MCP_SQL_DATABASE_NAME |
yes | Default database to connect to |
MCP_AZURE_TENANT_ID |
yes, unless using SQL login | The Entra ID tenant ID — pins auth to this directory even if your machine has other az login sessions active |
MCP_SQL_USERNAME |
no | SQL login username. If set, the server uses username + password authentication instead of Entra ID (and MCP_AZURE_TENANT_ID is not needed) |
MCP_SQL_PASSWORD |
with username | SQL login password. Must be set together with MCP_SQL_USERNAME |
MCP_SQL_TRUST_SERVER_CERTIFICATE |
no | Set to true to skip server certificate validation (needed for servers with self-signed or otherwise untrusted certificates, e.g. older on-prem SQL Server). Default: false |
MCP_MAX_ROWS |
no | Max rows returned per tool call (default: 25) |
Running it
The server is a uvx-runnable console script (sql-server-mcp), no
manual install step needed - uvx builds an isolated environment for it
on first run and reuses it afterwards:
uvx sql-server-mcp
To run from a local checkout instead (e.g. during development), point
--from at the path:
uvx --from /path/to/sql-server-mcp sql-server-mcp
On startup it acquires a token (via az login if available, otherwise an
interactive browser prompt) and runs over stdio. Database connectivity uses
mssql-python, which bundles
its own driver — no separate ODBC driver install is required.
Example MCP client config
One block per tenant:
{
"mcpServers": {
"tenant-a-sql": {
"command": "uvx",
"args": ["sql-server-mcp"],
"env": {
"MCP_SQL_SERVER_NAME": "tenant-a.datawarehouse.fabric.microsoft.com",
"MCP_SQL_DATABASE_NAME": "wh_silver",
"MCP_AZURE_TENANT_ID": "<tenant-a-tenant-id>"
}
},
"tenant-b-sql": {
"command": "uvx",
"args": ["sql-server-mcp"],
"env": {
"MCP_SQL_SERVER_NAME": "tenant-b.datawarehouse.fabric.microsoft.com",
"MCP_SQL_DATABASE_NAME": "wh_gold",
"MCP_AZURE_TENANT_ID": "<tenant-b-tenant-id>"
}
}
}
}
Tools
query(sql)— run a single read-onlySELECT. Table references must be fully qualified asdatabase.schema.table; there's no mutable "active database". Returns at mostMCP_MAX_ROWSrows, as a Markdown table.list_databases()— list user databases with status/metadata.search_schema(target, name, databases?, schema?, use_wildcard?)— search table or column metadata viaINFORMATION_SCHEMAacross one or more databases (all of them ifdatabasesis omitted).export_query(sql, path, format?)— run a single read-onlySELECTand write the full, uncapped result to a local Parquet or CSV file instead of returning it. For large results or when the output feeds into other local tools (pandas, DuckDB, etc.).
Development
uv run pytest # unit tests, no network/DB/Azure required
uv run python scripts/manual_smoke_test.py # real end-to-end check against a live database
Metadata
Release files for sql-server-mcp 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sql_server_mcp-0.5.0.tar.gz | 118.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sql_server_mcp-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 133.0 kB
Release files / sql_server_mcp-0.5.0.tar.gz
| Download URL | sql_server_mcp-0.5.0.tar.gz |
|---|---|
| Size | 118.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a32566694169020a35abcfa58b598e3e0378234522926efffca1d31e29e4ae83
|
|
BLAKE2b-256 checksum How to use checksums |
2704fb31dc0bd9e65f29212b7814f8bae25a748b8c81f75e33974336f0a008c2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / sql_server_mcp-0.5.0-py3-none-any.whl
| Download URL | sql_server_mcp-0.5.0-py3-none-any.whl |
|---|---|
| Size | 14.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
512909f4f3b3dad7236a22fe4de7322be454dcfa7befcfbaa5dc4a1b6209c0af
|
|
BLAKE2b-256 checksum How to use checksums |
594a62903d2bc3fc486e0df13d0aa8e496609dde4beff986886872f7cffad849
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|