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_SQL_LEGACY_TLS |
no | Set to true for old SQL Server hosts (e.g. SQL Server 2012) that reset the connection during the TLS handshake (TCP Provider: Error code 0x2746). Lowers OpenSSL's security level to 0 for this process only. 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.1
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.1.tar.gz | 119.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sql_server_mcp-0.5.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 134.7 kB
Release files / sql_server_mcp-0.5.1.tar.gz
| Download URL | sql_server_mcp-0.5.1.tar.gz |
|---|---|
| Size | 119.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b87f8490ec898a5f830394d857b0763ff8183a7deec17e84aaa06a9cdf7f69d5
|
|
BLAKE2b-256 checksum How to use checksums |
651db22d6c63383b61e554697ff82a524f8ca25442a5bb20aa8ebe5da72baf69
|
| 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.1-py3-none-any.whl
| Download URL | sql_server_mcp-0.5.1-py3-none-any.whl |
|---|---|
| Size | 15.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
94e3a1bcfd931e75cb198ad956ed495ed2dda4acf92f79998049fa93933e8c6a
|
|
BLAKE2b-256 checksum How to use checksums |
c1db7104a2277129f07f9ff119990b9177d3e6294cd5f35c27e33d88b0a3e4d1
|
| 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}
|