mcp-mssqlserver
This MCP server exposes Microsoft SQL Server database operations and schema/metadata inspection to MCP clients.
Execute SQL statements such as SELECT, INSERT, UPDATE, and DELETE, returning recordsets or affected-row counts.
List tables in the current database, with optional schema filtering.
Describe table structure: columns, data types, nullability, defaults, and primary key markers.
List available SQL Server databases.
Inspect table indexes, including indexed columns, type, uniqueness, and primary-key status.
Inspect table foreign keys and their referenced targets.
Optionally run in read-only mode to restrict
execute_queryto single SELECT/CTE SELECT statements and roll back the transaction.Connect using environment-based SQL Server configuration and run over stdio or Streamable HTTP transport.
Provides a remote MCP endpoint for n8n's MCP Client Tool node to interact with SQL Server databases.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-mssqlserver list all tables in the database"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Server for Microsoft SQL Server
Production-oriented MCP server for Microsoft SQL Server, exposing database operations to MCP clients (Claude Desktop, VS Code Copilot, Cursor, and compatible hosts).
Features
Query execution (
SELECT,INSERT,UPDATE,DELETE), with an optional read-only mode (MSSQL_READ_ONLY=true)Database discovery and schema introspection
Table metadata inspection (columns, types, nullability, defaults, PK)
Index and foreign key discovery
Environment-driven configuration for secure deployment
Related MCP server: SQL Query Tools MCP Server
Available Tools
Tool | Description |
| Executes a SQL statement and returns recordsets or affected rows |
| Lists tables from |
| Returns table column metadata and primary key markers |
| Lists all SQL Server databases |
| Lists table indexes, type, uniqueness, PK, and indexed columns |
| Lists table foreign keys and referenced targets |
Requirements
Node.js 18+
Access to a Microsoft SQL Server instance
Network connectivity from MCP host to SQL Server (
host:port)
Configuration
Set connection settings using environment variables:
Variable | Required | Default | Description |
| No |
| SQL Server host or IP |
| No |
| SQL Server TCP port |
| Yes | — | Default database |
| No |
| Authentication mode: |
| Yes* | — | SQL login user (required only in |
| Yes* | — | SQL login password (required only in |
| No |
| Enables encrypted connection |
| No |
| Trusts server certificate when encryption is enabled |
* Required when MSSQL_AUTH_MODE=sql.
Variable | Required | Default | Description |
| No |
| Enables read-only mode ( |
| No |
| Transport mode: |
| No |
| Port for the HTTP server (only used when |
| No |
| Bind address for the HTTP server (only used when |
Note: the published Docker image always runs in
httpmode and does not build themsnodesqlv8native driver (used only forMSSQL_AUTH_MODE=windows). Windows Authentication is only available when running the server directly on a Windows host vianpx/npm start.
Read-only mode
Set MSSQL_READ_ONLY=true to restrict execute_query to read operations. When enabled:
Only a single
SELECT(orWITH ... SELECT) statement is accepted. Multiple statements,INSERT,UPDATE,DELETE,MERGE,TRUNCATE, DDL (CREATE/ALTER/DROP),GRANT/REVOKE/DENY,EXEC/EXECUTE,SELECT ... INTO,OPENROWSET/OPENQUERY/OPENDATASOURCE, andxp_*/sp_*procedures are rejected before reaching the database. Comments, string literals and delimited identifiers are ignored by the check.The query runs inside a transaction that is always rolled back.
The connection is opened with
ApplicationIntent=ReadOnly, which routes to a readable secondary replica when an Always On availability group with read-only routing is configured (it has no effect otherwise).The
execute_querytool description exposed to the MCP client states that the server is read-only.The remaining tools (
list_tables,describe_table,list_databases,get_table_indexes,get_foreign_keys) only read metadata and are unaffected.
This mode is a defense-in-depth measure, not a security boundary. The check is lexical and can reject legitimate queries that use a blocked word outside literals/identifiers (false positives), and T-SQL has enough syntax that bypasses cannot be fully ruled out. The effective guarantee must come from the database: use a login restricted to
db_datareader(optionally withDENY INSERT, UPDATE, DELETE, ALTER, EXECUTE) and combine it with this flag.
Usage
Run directly from GitHub
npx github:ferronicardoso/mcp-mssqlserverClaude Code (CLI)
claude mcp add mssqlserver --scope user -- npx -y github:ferronicardoso/mcp-mssqlserver--scope controls where the server registration is stored:
Scope | Stored in | Visible to |
| project-local, untracked | only you, only in this project |
|
| anyone who clones the repo (commit it to share) |
| your global Claude Code config | you, across every project |
Environment variables can be passed with repeated --env KEY=VALUE flags before the --, e.g.:
Bash (Linux/macOS/WSL):
claude mcp add mssqlserver --scope user \
--env MSSQL_HOST=localhost \
--env MSSQL_PORT=1433 \
--env MSSQL_DATABASE=master \
--env MSSQL_AUTH_MODE=sql \
--env MSSQL_USER=sa \
--env MSSQL_PASSWORD=your-password \
-- npx -y github:ferronicardoso/mcp-mssqlserverPowerShell:
claude mcp add mssqlserver --scope user `
--env MSSQL_HOST=localhost `
--env MSSQL_PORT=1433 `
--env MSSQL_DATABASE=master `
--env MSSQL_AUTH_MODE=sql `
--env MSSQL_USER=sa `
--env MSSQL_PASSWORD=your-password `
-- npx -y github:ferronicardoso/mcp-mssqlserverCodex CLI
Bash (Linux/macOS/WSL):
codex mcp add mssqlserver \
--env MSSQL_AUTH_MODE=sql \
--env MSSQL_HOST=localhost \
--env MSSQL_PORT=1433 \
--env MSSQL_DATABASE=master \
--env MSSQL_USER=sa \
--env MSSQL_PASSWORD=your-password \
npx -- -y github:ferronicardoso/mcp-mssqlserverPowerShell:
codex mcp add mssqlserver `
--env MSSQL_AUTH_MODE=sql `
--env MSSQL_HOST=localhost `
--env MSSQL_PORT=1433 `
--env MSSQL_DATABASE=master `
--env MSSQL_USER=sa `
--env MSSQL_PASSWORD=your-password `
npx -- -y github:ferronicardoso/mcp-mssqlserverFor Windows Authentication instead, drop MSSQL_USER/MSSQL_PASSWORD and set MSSQL_AUTH_MODE=windows:
Bash (Linux/macOS/WSL):
codex mcp add mssqlserver \
--env MSSQL_AUTH_MODE=windows \
--env MSSQL_HOST=localhost \
--env MSSQL_PORT=1433 \
--env MSSQL_DATABASE=master \
npx -- -y github:ferronicardoso/mcp-mssqlserverPowerShell:
codex mcp add mssqlserver `
--env MSSQL_AUTH_MODE=windows `
--env MSSQL_HOST=localhost `
--env MSSQL_PORT=1433 `
--env MSSQL_DATABASE=master `
npx -- -y github:ferronicardoso/mcp-mssqlserverThis registers the server in ~/.codex/config.toml. To remove it, run codex mcp remove mssqlserver.
Claude Desktop configuration
%APPDATA%\\Claude\\claude_desktop_config.json:
{
"mcpServers": {
"mssqlserver": {
"command": "npx",
"args": ["github:ferronicardoso/mcp-mssqlserver"],
"env": {
"MSSQL_HOST": "localhost",
"MSSQL_PORT": "1433",
"MSSQL_DATABASE": "master",
"MSSQL_AUTH_MODE": "sql",
"MSSQL_USER": "sa",
"MSSQL_PASSWORD": "your-password"
}
}
}
}VS Code MCP configuration
.vscode/mcp.json:
{
"servers": {
"mssqlserver": {
"command": "npx",
"args": ["github:ferronicardoso/mcp-mssqlserver"],
"env": {
"MSSQL_HOST": "localhost",
"MSSQL_PORT": "1433",
"MSSQL_DATABASE": "master",
"MSSQL_AUTH_MODE": "sql",
"MSSQL_USER": "sa",
"MSSQL_PASSWORD": "your-password"
}
}
}
}Run with Docker (HTTP transport)
The published image runs in Streamable HTTP mode by default, for use as a remote MCP endpoint (e.g. from n8n's MCP Client Tool node or any Streamable HTTP-compatible client):
Bash (Linux/macOS/WSL):
docker run -d --name mcp-mssqlserver \
-p 3001:3001 \
-e MSSQL_HOST=host.docker.internal \
-e MSSQL_PORT=1433 \
-e MSSQL_DATABASE=master \
-e MSSQL_AUTH_MODE=sql \
-e MSSQL_USER=sa \
-e MSSQL_PASSWORD=your-password \
ghcr.io/ferronicardoso/mcp-mssqlserver:latestPowerShell:
docker run -d --name mcp-mssqlserver `
-p 3001:3001 `
-e MSSQL_HOST=host.docker.internal `
-e MSSQL_PORT=1433 `
-e MSSQL_DATABASE=master `
-e MSSQL_AUTH_MODE=sql `
-e MSSQL_USER=sa `
-e MSSQL_PASSWORD=your-password `
ghcr.io/ferronicardoso/mcp-mssqlserver:latestThe MCP endpoint is then available at http://localhost:3001/mcp.
Local Development
git clone https://github.com/ferronicardoso/mcp-mssqlserver
cd mcp-mssqlserver
npm install
npm run buildStart the compiled server:
npm startBuild and Commit Workflow
This repository intentionally tracks dist/ to support npx github:user/repo usage.
The project uses a Husky pre-commit hook to:
build TypeScript (
npm run build)stage generated artifacts (
git add dist)
Manual fallback:
npm run build
git add distSecurity Notes
Never commit real credentials or
.envfiles.Prefer least-privilege SQL users for production use. For read-only scenarios, use a
db_datareaderlogin in addition toMSSQL_READ_ONLY=true.For public or untrusted networks, enable encryption (
MSSQL_ENCRYPT=true) and configure certificates appropriately.
Windows Authentication (Integrated Security)
To use Windows Authentication with Integrated Security (process account), configure:
MSSQL_AUTH_MODE=windows
MSSQL_HOST=sqlserver.company.local
MSSQL_PORT=1433
MSSQL_DATABASE=masterLicense
MIT © Raphael Augusto Ferroni Cardoso
Available Tools
6 toolsdescribe_tableB
Retorna a estrutura de uma tabela: colunas, tipos de dados, nulabilidade e valores padrão.
Inputs: table (required), schema.
execute_queryA
Executa uma query SQL no SQL Server e retorna os resultados. Use para SELECT, INSERT, UPDATE e DELETE.
Inputs: query (required).
get_foreign_keysC
Lista as chaves estrangeiras de uma tabela e suas referências.
Inputs: table (required), schema.
get_table_indexesB
Lista os índices de uma tabela, incluindo colunas e tipo de índice.
Inputs: table (required), schema.
list_databasesA
Lista todos os bancos de dados disponíveis no servidor SQL Server.
Inputs: no named parameters.
list_tablesA
Lista todas as tabelas do banco de dados atual, opcionalmente filtrando por schema.
Inputs: schema.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose: describing table structure, executing arbitrary queries, listing foreign keys, indexes, databases, and tables. No overlap or ambiguity.
All tool names follow a consistent verb_noun pattern using snake_case (e.g., describe_table, get_foreign_keys, list_databases), making them predictable and easy to understand.
With 6 tools, the set is well-scoped for a SQL Server utility server, covering essential introspection and query execution without being overly numerous or sparse.
The tools cover core database introspection (list databases, tables, describe table, get indexes/foreign keys) and query execution. Missing advanced features like schema management or stored procedure execution, but these are minor gaps for typical usage.
Related MCP Connectors
Hosted SQL Server MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Text-to-SQL MCP server: read-only queries on PostgreSQL, MySQL and SQL Server with your real schema
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
MCP server for interacting with the Supabase platform
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides tools to connect, query, and manage Microsoft SQL Server databases through the MCP protocol, including support for stored procedures, transactions, and schema inspection.81 PyPIMIT
- AlicenseAqualityDmaintenanceMCP server for connecting to SQL Server in readonly mode. Allows any MCP client to explore the schema and run SELECT queries against a SQL Server database.6MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for executing SQL queries and managing connections to Microsoft SQL Server databases.2,052 npm1MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for Microsoft SQL Server enabling safe read-only queries, schema discovery, and natural-language query via LangChain.MIT