Servidor MCP custom para Microsoft SQL Server.
Soporta SELECT, INSERT (individual y bulk), UPDATE, DELETE, DDL (CREATE/ALTER TABLE) y Stored Procedures con parámetros opcionales.
- Python 3.11+
- ODBC Driver 17 o 18 for SQL Server instalado en tu máquina
- Acceso a tu instancia de SQL Server
# 1. Clonar / copiar el proyecto
cd sqlserver-mcp
# 2. Crear entorno virtual
python -m venv .venv
source .venv/bin/activate # Linux/Mac
.venv\Scripts\activate # Windows
# 3. Instalar dependencias
pip install -r requirements.txt
# 4. Configurar conexión
cp .env.example .env
# Edita .env con tus datos de SQL ServerImportante:
El archivo.env.examplecontiene comentarios (#) como referencia y documentación.
El archivo.envfinal debe contener únicamente las variables de entorno necesarias, sin comentarios.
| Variable | Descripción | Default |
|---|---|---|
MSSQL_SERVER |
IP o nombre del servidor | localhost |
MSSQL_PORT |
Puerto TCP | 1433 |
MSSQL_DATABASE |
Base de datos por defecto | master |
MSSQL_USERNAME |
Usuario SQL | sa |
MSSQL_PASSWORD |
Contraseña | — |
MSSQL_DRIVER |
Driver ODBC instalado | ODBC Driver 17 for SQL Server |
MSSQL_ENCRYPT |
Encriptar conexión (yes/no) | yes |
MSSQL_TRUST_CERT |
Confiar en cert autofirmado | no |
MSSQL_TIMEOUT |
Timeout de conexión en segundos | 30 |
MSSQL_POOL_SIZE |
Tamaño del pool de conexiones | 5 |
MSSQL_CHAR_ENCODING |
Encoding de columnas VARCHAR (cp1252, latin-1, utf-8) | cp1252 |
MSSQL_ALLOWED_OPS |
Ops habilitadas (csv) | select,insert,update,delete,exec_sp,ddl,ddl_sp |
MSSQL_ALLOWED_SCHEMAS |
Schemas permitidos (vacío = todos) | — |
MSSQL_DDL_TABLE_PREFIX |
Prefijo requerido para DDL (vacío = sin restricción) | — |
MSSQL_LOG_QUERIES |
Loggear queries ejecutadas | true |
MSSQL_LOG_LEVEL |
Nivel de logging (DEBUG/INFO/WARNING/ERROR) | INFO |
# Modo stdio (para OpenCode)
python server.py
# Modo HTTP (para agentes remotos)
python server.py --transport streamable-http --port 5000Agrega esto a tu archivo de configuración de OpenCode (opencode.json o opencode.jsonc):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"sqlserver": {
"type": "local",
"command": [
"C:\\ruta-al-proyecto\\.venv\\Scripts\\python.exe",
"-u",
"C:\\ruta-al-proyecto\\server.py"
],
"environment": {
"MSSQL_SERVER": "localhost",
"MSSQL_PORT": "1433",
"MSSQL_DATABASE": "mi_bd",
"MSSQL_USERNAME": "sa",
"MSSQL_PASSWORD": "TuPassword123!"
}
}
}
}Ajusta las rutas en
commanda tu entorno virtual y al directorio del proyecto.
| Tool | Descripción |
|---|---|
tool_list_schemas |
Lista schemas de la BD |
tool_list_tables |
Lista tablas/vistas de un schema |
tool_describe_table |
Describe columnas, tipos, PKs e índices |
tool_execute_query |
SELECT parametrizado con filtros y paginación |
tool_insert_record |
INSERT de un registro |
tool_bulk_insert |
INSERT masivo en lotes (ideal para traducciones) |
tool_update_record |
UPDATE con WHERE obligatorio |
tool_delete_record |
DELETE con WHERE obligatorio |
tool_create_table |
CREATE TABLE con IF NOT EXISTS |
tool_alter_table |
ALTER TABLE ADD/ALTER COLUMN |
tool_execute_ddl_raw |
DDL arbitrario T-SQL (con guardia anti-DROP) |
tool_list_stored_procedures |
Lista SPs del schema |
tool_describe_stored_procedure |
Muestra parámetros del SP (incluye opcionales) |
tool_execute_sp |
Ejecuta SP con parámetros nombrados opcionales |
tool_create_sp |
Crea un nuevo stored procedure (requiere ddl_sp en MSSQL_ALLOWED_OPS) |
tool_alter_sp |
Modifica un stored procedure existente (requiere ddl_sp en MSSQL_ALLOWED_OPS) |
tool_drop_sp |
Elimina un stored procedure (requiere ddl_sp y allow_destructive=True) |
Pregunta al agente:
"Crea la tabla de traducciones para inglés y español, e inserta estas 500 filas de forma masiva"
El agente usará:
tool_create_table→ crea la tablatool_bulk_insert→ inserta en lotes de 500
Pregunta al agente:
"Llama al SP sp_GetCatalogo con IdIdioma = 2"
El agente usará:
tool_describe_stored_procedure→ ve que IdIdioma es opcionaltool_execute_sp→ llama con{"IdIdioma": 2}
- WHERE es obligatorio en UPDATE y DELETE para evitar operaciones masivas accidentales.
- DROP y TRUNCATE están bloqueados en
execute_ddl_rawsalvo que pasesallow_destructive=True. - Puedes limitar schemas y operaciones desde el
.envsin tocar código. - Las queries van parametrizadas (placeholders
?) para prevenir SQL injection.
En producción, evita usar el usuario sa. Crea un login SQL Server dedicado con los permisos mínimos que realmente necesite el agente. Por ejemplo, si el agente solo requiere leer, insertar y crear tablas (sin editar ni eliminar registros):
CREATE LOGIN mcp_agent WITH PASSWORD = 'TuPasswordSeguro123!';
USE [tu_base];
CREATE USER mcp_agent FOR LOGIN mcp_agent;
GRANT SELECT, INSERT, CREATE TABLE TO mcp_agent;Ajusta los permisos según tu caso (UPDATE, DELETE, EXECUTE en stored procedures, etc.) y acótalos también en la variable MSSQL_ALLOWED_OPS del .env.