MCP SQL Server
Provides read-only access to SQL Server databases via Claude Desktop, with multiple security layers preventing any writes.
README
MCP SQL Server (Read-Only)
Servidor MCP (Model Context Protocol) seguro de solo lectura para conectar Claude Desktop (o cualquier cliente MCP) a una base de datos SQL Server 2019.
Diseñado bajo el principio secure by default: el MCP nunca puede modificar datos ni estructura. La seguridad se aplica en múltiples capas (validación de SQL, permisos del usuario, configuración de sesión, timeouts y límites de filas).
📦 Dos repositorios: el código vive en GK-Leyton/MCP_SQLSERVER (público) y las credenciales (
.env) en un repo privado aparte, GK-Leyton/MCP_SQLSERVER-secrets. El.envnunca se versiona en este repo de código.
Tabla de contenido
- Inicio rápido
- Características
- Arquitectura de seguridad
- Requisitos previos
- Instalación paso a paso
- Configuración del usuario SQL
- Variables de entorno
- Registro en Claude Desktop
- Tools expuestos
- Pruebas
- Recomendaciones de seguridad adicionales
- Solución de problemas
Inicio rápido
Flujo recomendado cuando ya existen los dos repositorios. Para el detalle, ver Instalación paso a paso.
# 1. Clonar el código (este repo)
git clone https://github.com/GK-Leyton/MCP_SQLSERVER.git
cd MCP_SQLSERVER
# 2. Traer el .env desde el repo privado de secretos
git clone https://github.com/GK-Leyton/MCP_SQLSERVER-secrets.git
copy MCP_SQLSERVER-secrets\.env .env # Windows
# cp MCP_SQLSERVER-secrets/.env ./.env # Linux / macOS
# 3. Entorno virtual + dependencias
python -m venv .venv
.venv\Scripts\activate # Windows
pip install -r requirements.txt
# 4. Probar conexión y tools
python -m src.server --selftest
¿Sin acceso al repo de secretos? Copia la plantilla y edítala a mano:
copy .env.example .env # Windows (cp .env.example .env en Linux/macOS)
Después registra el MCP en Claude Desktop (ver Registro en Claude Desktop) y reinícialo.
Características
- 100% solo lectura: cualquier intento de
INSERT/UPDATE/DELETE/MERGE/TRUNCATE/DROP/ALTER/CREATE/EXECes rechazado antes de llegar a la base de datos. - Validador de SQL multicapa: tokenización con
sqlparse, lista blanca de tipos de sentencia, lista negra de palabras clave, detección de comentarios maliciosos y de múltiples sentencias. - Conexión configurada como READ ONLY a nivel de sesión (
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDyApplicationIntent=ReadOnlycuando aplica). - Límite de filas obligatorio (TOP N) en todos los tools.
- Timeout de query configurable.
- Logging estructurado de cada consulta ejecutada.
- Manejo de errores que no expone información sensible (cadenas de conexión, stack traces) al cliente MCP.
- Credenciales gestionadas exclusivamente vía
.env/ variables de entorno.
Arquitectura de seguridad
El MCP aplica defensa en profundidad:
| Capa | Control |
|---|---|
| 1. Cliente MCP | Solo expone tools de lectura. No hay tool que acepte DDL/DML. |
2. Validador SQL (security.py) |
Whitelist (SELECT/CTE) + blacklist de keywords + análisis con sqlparse + bloqueo de múltiples sentencias y EXEC. |
3. Capa de aplicación (database.py) |
Conexión autocommit=True, readonly=True, timeout de query, parámetros enlazados. |
| 4. Sesión SQL | SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED y rechazo de cualquier batch con más de un statement. |
| 5. Permisos en SQL Server | Usuario dedicado con únicamente rol db_datareader (sin db_ddladmin, sin db_datawriter, sin db_owner). |
| 6. Red / SO | Recomendaciones para firewall, TLS, y rotación de credenciales. |
Aunque se rompiera una capa (p. ej. una validación), las demás siguen impidiendo la escritura. El control definitivo son los permisos del usuario SQL.
Requisitos previos
- Python 3.10+
- SQL Server 2019 accesible por red
- ODBC Driver 17 for SQL Server (o 18) instalado en la máquina donde corre el MCP
- Windows: Microsoft ODBC Driver
- Linux/macOS: ver guía oficial de Microsoft
- Claude Desktop (o cualquier cliente MCP compatible)
Instalación paso a paso
# 1. Clonar / situarse en el proyecto
cd C:\xampp\htdocs\MCP_SQLSERVER
# 2. Crear y activar un entorno virtual
python -m venv .venv
.venv\Scripts\activate # Windows
# source .venv/bin/activate # Linux / macOS
# 3. Instalar dependencias
pip install -r requirements.txt
# 4. Copiar la plantilla de variables de entorno
copy .env.example .env # Windows
# cp .env.example .env # Linux / macOS
# 5. Editar .env con tus credenciales (ver sección siguiente)
# 6. Probar que conecta y los tools funcionan
python -m src.server --selftest
Configuración del usuario SQL
Crea un usuario dedicado con solo el rol db_datareader. No le otorgues db_owner, db_ddladmin ni db_datawriter.
-- Ejecutar en SQL Server (con un usuario admin)
USE master;
CREATE LOGIN mcp_reader WITH PASSWORD = 'CONTRASEÑA_FUERTE_AQUI';
USE TuBaseDeDatos;
CREATE USER mcp_reader FOR LOGIN mcp_reader;
ALTER ROLE db_datareader ADD MEMBER mcp_reader;
-- (Opcional) Denegar explícitamente cualquier intento de escritura
DENY INSERT, UPDATE, DELETE, ALTER, EXECUTE TO mcp_reader;
-- (Opcional) Si el servidor admite ApplicationIntent=ReadOnly,
-- conviene apuntar a una réplica de solo lectura.
Repite el CREATE USER ... db_datareader en cada base de datos que deba poder consultar.
Variables de entorno
Todas las credenciales viven en .env (nunca en el código).
# .env (NO subir a git)
SQLSERVER_HOST=localhost
SQLSERVER_PORT=1433
SQLSERVER_DATABASE=TuBaseDeDatos
SQLSERVER_USER=mcp_reader
SQLSERVER_PASSWORD=CONTRASEÑA_FUERTE_AQUI
SQLSERVER_DRIVER=ODBC Driver 17 for SQL Server
SQLSERVER_ENCRYPT=yes
SQLSERVER_TRUST_SERVER_CERT=no
# Límites operativos
MCP_QUERY_TIMEOUT_SECONDS=15
MCP_MAX_ROWS=100
MCP_LOG_LEVEL=INFO
MCP_LOG_FILE=mcp_sqlserver.log
Manejo de credenciales (no van quemadas en el código):
- El código nunca contiene credenciales: todo sale de variables de entorno /
.env.- Precedencia: las variables del sistema operativo ganan sobre el
.env(load_dotenv(override=False)). En producción puedes definir las variables a nivel de SO/usuario de Windows y prescindir del archivo.env..envestá en.gitignore; la plantilla.env.exampleno lleva secretos (solo placeholders).- La contraseña no se escribe en logs (
Settings.safe_repr()la omite); sí se registran host, base y usuario para diagnóstico.- Si una contraseña estuvo expuesta en un archivo compartido, rótala en SQL Server.
Registro en Claude Desktop
Edita claude_desktop_config.json (Windows: %APPDATA%\Claude\claude_desktop_config.json).
{
"mcpServers": {
"sqlserver-readonly": {
"command": "C:\\xampp\\htdocs\\MCP_SQLSERVER\\.venv\\Scripts\\python.exe",
"args": ["-m", "src.server"],
"cwd": "C:\\xampp\\htdocs\\MCP_SQLSERVER"
}
}
}
Reinicia Claude Desktop. Si todo está bien, verás los tools execute_select_query, list_databases, list_tables, describe_table, preview_table_data disponibles.
Hay un ejemplo listo para copiar en
claude_desktop_config.example.json.
Tools expuestos
| Tool | Descripción | Parámetros principales |
|---|---|---|
execute_select_query |
Ejecuta una consulta SELECT validada. |
query: str, max_rows: int (opcional) |
list_databases |
Lista todas las bases de datos visibles. | — |
list_tables |
Lista tablas y vistas de un esquema. | database: str (opcional), schema: str (opcional) |
describe_table |
Devuelve columnas, tipos, nullability y PK de una tabla. | table: str, schema: str (opcional), database: str (opcional) |
preview_table_data |
Devuelve las primeras N filas de una tabla. | table: str, rows: int (≤ MCP_MAX_ROWS), schema: str (opcional) |
Todos los tools:
- Aplican el validador de seguridad.
- Aplican
TOP N(N ≤MCP_MAX_ROWS). - Aplican el timeout de query.
- Registran la consulta en el log.
Pruebas
pip install -r requirements-dev.txt
pytest -v
La suite cubre el validador (tests/test_security.py) con casos como:
INSERT/UPDATE/DELETE/MERGE/TRUNCATE/DROP/ALTER/CREATE→ rechazoEXEC sp_xyEXECUTE→ rechazo- Multi-sentencia (
SELECT 1; DROP TABLE x) → rechazo - Inyección por comentarios (
SELECT 1 -- ; DROP ...) → rechazo SELECTválido → aceptado
Recomendaciones de seguridad adicionales
- Réplica de solo lectura. Apunta el MCP a una Always On Availability Group secundaria con
ApplicationIntent=ReadOnly. Aunque algo se escapara, físicamente no se puede escribir. - Cifrado en tránsito. Mantén
SQLSERVER_ENCRYPT=yesy, salvo desarrollo,SQLSERVER_TRUST_SERVER_CERT=nocon un certificado válido. - Rotación de credenciales. Usa un gestor (Azure Key Vault, AWS Secrets Manager, HashiCorp Vault) en producción en lugar de un
.envplano. - Firewall. Limita el acceso al puerto 1433 solo desde la máquina del MCP.
- Auditoría. Activa SQL Server Audit sobre
mcp_readerpara registrar 100% de las consultas a nivel servidor (no solo del MCP). - No conceder
VIEW SERVER STATEniVIEW ANY DEFINITIONsalvo que sea necesario; el MCP funciona sin ellos sobre catálogos estándar. - Quotas de recursos. Considera un Resource Governor pool para
mcp_readerque limite CPU/IO. .envfuera de control de versiones (ya está en.gitignore).- Actualiza dependencias regularmente (
pip-audit). - No deshabilites el validador, ni siquiera “temporalmente”.
Solución de problemas
Login failed for user 'mcp_reader'→ revisa usuario/contraseña en.envy que el usuario exista en la base destino.Driver not found→ instala el ODBC Driver 17/18 y verifica el valor deSQLSERVER_DRIVER.Query rejected: ...→ el validador detectó algo no permitido. Revisa que sea una sola sentenciaSELECTsinEXEC, sin;extra y sin comentarios sospechosos.- Timeouts → ajusta
MCP_QUERY_TIMEOUT_SECONDSo revisa el plan de la consulta. No incrementes el timeout para “tapar” consultas problemáticas.
Licencia
Uso interno. Ajustar según política de tu organización.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。