CoreMCP
Conecta bases de datos heredadas a agentes de IA mediante el Protocolo de Contexto de Modelo. Puente de código abierto para análisis de datos con LLM.
Documentación
CoreMCP
Un servidor de Protocolo de Contexto de Modelo (MCP), escrito en Go, que expone bases de datos SQL como herramientas y prompts de MCP. Se ejecuta como un único binario estático, incorpora sus controladores y se comunica ya sea por stdio (para clientes MCP locales como Claude Desktop) o por un WebSocket saliente (para operación remota detrás de NAT).
Actualmente incluye adaptadores para MSSQL (SQL Server 2000+, compatible con collation Turkish_CI_AS) y PostgreSQL. Firebird está en progreso; MySQL está en la hoja de ruta.
Estado
- Estable: Adaptador MSSQL, adaptador PostgreSQL, transporte stdio, descubrimiento de esquema, herramientas personalizadas, middleware de normalización NOLOCK / turco, modo de conexión WebSocket.
- En progreso: Adaptador Firebird (la fábrica actualmente devuelve un error de marcador de posición).
- Hoja de ruta: MySQL, transporte HTTP, registro de auditoría, caché de resultados de consultas.
Valores predeterminados
CoreMCP es de solo lectura por defecto. Omitir readonly en una configuración de origen deja activo el modo solo SELECT; tienes que establecer readonly: false para habilitar execute_procedure. Aun así, la postura recomendada es un usuario de base de datos dedicado con SELECT (y EXECUTE solo en los procedimientos que pretendes exponer) — defensa en profundidad en lugar de confiar únicamente en la protección del lado del servidor.
Instalación
Binario
Descarga desde la página de Releases — linux/amd64, linux/arm64, darwin/{amd64,arm64}, windows/amd64.
Instalador de una línea (Linux/macOS):
curl -fsSL https://get.corebasehq.com | sh
Docker
docker pull y11t0/coremcp:latest
Imagen multi-arquitectura (linux/amd64, linux/arm64).
Desde el código fuente
Requiere Go 1.23+.
git clone https://github.com/corebasehq/coremcp.git
cd coremcp
go build -o coremcp ./cmd/coremcp
Configuración
coremcp.yaml en el directorio de trabajo:
server:
name: "coremcp-agent"
version: "0.1.0"
transport: "stdio"
port: 8080
logging:
level: "info"
format: "json"
sources:
- name: "my_database"
type: "mssql"
dsn: "sqlserver://username:password@localhost:1433?database=mydb&encrypt=disable"
readonly: true
no_lock: true # READ UNCOMMITTED isolation (WITH (NOLOCK) equivalent)
normalize_turkish: true # Turkish character + mojibake normalization
Consulta coremcp.example.yaml para un ejemplo más completo.
Formato DSN
MSSQL:
sqlserver://username:password@host:port?database=dbname&encrypt=disable
PostgreSQL:
postgresql://username:password@host:port/dbname?sslmode=disable
Adaptador dummy (para pruebas sin una base de datos real):
dummy://test
Opciones de origen
| Opción | Tipo | Predeterminado | Descripción |
|---|---|---|---|
name | string | — | Identificador único de origen |
type | string | — | Tipo de adaptador: mssql, postgres (o postgresql), rest, graphql, dummy |
dsn | string | — | Cadena de conexión |
readonly | bool | true | Solo SELECT a nivel de configuración. Establece false explícitamente para permitir execute_procedure. |
no_lock | bool | false | (Solo MSSQL) Ejecuta SELECTs bajo READ UNCOMMITTED. Equivalente a WITH (NOLOCK) en cada referencia de tabla. Elimina la adquisición de bloqueos compartidos en OLTP ocupado. Compensación: posibles lecturas sucias. |
normalize_turkish | bool | false | (Solo MSSQL) Middleware bidireccional. Saliente: los caracteres turcos dentro de literales de cadena SQL se convierten a mayúsculas ASCII antes de enviar la consulta ('Hüseyin' → 'HUSEYIN'). Entrante: el mojibake de Windows-1254 / Windows-1252 en cadenas de resultados se corrige automáticamente. Diseñado para bases de datos ERP turcas heredadas en Turkish_CI_AS. |
Ejemplo: MSSQL con NOLOCK
sources:
- name: "oltp_db"
type: "mssql"
dsn: "sqlserver://user:pass@localhost:1433?database=production&encrypt=disable"
readonly: true
no_lock: true
Ejemplo: ERP turco heredado
sources:
- name: "erp_db"
type: "mssql"
dsn: "sqlserver://user:pass@localhost:1433?database=LOGO&encrypt=disable"
readonly: true
no_lock: true
normalize_turkish: true
Cómo se comporta el middleware turco:
| El modelo emite | Enviado a la BD | Por qué |
|---|---|---|
WHERE ADI = 'Hüseyin' | WHERE ADI = 'HUSEYIN' | El ERP almacena nombres en ASCII mayúsculas |
WHERE SEHIR LIKE '%şeker%' | WHERE SEHIR LIKE '%SEKER%' | Ş → S |
WHERE SEHIR = 'İstanbul' | WHERE SEHIR = 'ISTANBUL' | İ → I |
Corrección de mojibake en filas entrantes:
| La BD devuelve | Corregido | Causa |
|---|---|---|
GÐKHAN | GĞKHAN | Byte Win-1254 0xD0 leído como Win-1252 |
ÝSTANBUL | İSTANBUL | Byte Win-1254 0xDD leído como Win-1252 |
ÞEHİR | ŞEHİR | Byte Win-1254 0xDE leído como Win-1252 |
Configuración de seguridad
security:
max_row_limit: 1000 # forced LIMIT cap
enable_pii_masking: true
pii_patterns:
- name: "credit_card"
pattern: '\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b'
replacement: "****-****-****-****"
enabled: true
- name: "email"
pattern: '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
replacement: "***@***.***"
enabled: true
- name: "turkish_id"
pattern: '\b[1-9]\d{10}\b'
replacement: "***********"
enabled: true
Lo que esto habilita:
- Lexer consciente de T-SQL. El tokenizador personalizado de cierre seguro elimina comentarios y literales de cadena, luego clasifica la declaración — solo pasan
SELECTyWITH.DROP,ALTER,UPDATE,DELETE,TRUNCATE,EXEC,OPENROWSET,SELECT…INTOy similares son rechazados antes de llegar a la BD. Los payloads de múltiples declaraciones (cualquier;fuera de cadenas/comentarios) son fatales — los ataques de consultas apiladas se bloquean de forma independiente del dialecto. Se eligió sobre los parsers SQL de Go de terceros (xwb1989/sqlparser, vitess, cockroachdb) porque fallan de forma cerrada en los hints de T-SQL y cualquier relajación de "caer en regex" es evadible medianteEX/**/ECy trucos similares. Trátalo como una capa, no la única — combínalo con un rol de BD de privilegios mínimos. - Límite de filas forzado.
LIMITse agrega (o envuelve) en cada SELECT para que un modelo nunca transmita millones de filas de vuelta a través del protocolo. - Enmascaramiento de PII. Post-procesamiento basado en regex en las cadenas de resultados antes de que lleguen al cliente.
Uso
CoreMCP tiene dos modos de operación.
1. Local (serve)
Para clientes MCP locales (Claude Desktop, etc.):
coremcp serve --config coremcp.yaml
stdio es el transporte predeterminado:
coremcp serve -t stdio
Configuración de Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"coremcp": {
"command": "/path/to/coremcp",
"args": ["serve", "-c", "/path/to/coremcp.yaml"],
"env": {}
}
}
}
2. Remoto (connect)
connect abre un WebSocket saliente a un relay (típicamente CoreBase Cloud) y sirve tráfico MCP a través de él. El agente nunca acepta conexiones entrantes, por lo que funciona desde redes que no permiten 443 entrante (plantas de fábrica, VPC corporativas, redes hospitalarias).
coremcp connect --server="wss://api.corebasehq.com/ws/agent" --token="sk_xxx"
Banderas:
-s, --server string Relay WebSocket URL (required)
-t, --token string Authentication token (required)
-a, --agent-id string Agent ID (auto-generated if omitted)
-r, --max-reconnect int Max reconnect attempts (default 10; 0 = infinite)
-d, --reconnect-delay duration Delay between reconnect attempts (default 5s)
Ejemplo, de larga duración:
./coremcp connect \
--server="wss://api.corebasehq.com/ws/agent" \
--token="sk_xxx" \
--agent-id="site-istanbul-001" \
--max-reconnect=0
Comandos de cable soportados por el protocolo relay:
run_sql— ejecutar SQLget_schema— volcar esquema en cachélist_sources— enumerar orígenes configuradoshealth_check— estado del agente (liveness)config_sync— enviar configuraciones de origen actualizadas al agente en ejecución
Arquitectura
coremcp/
├── cmd/coremcp/ # CLI entry point
│ ├── main.go
│ ├── root.go
│ ├── serve.go # stdio mode
│ └── connect.go # WebSocket mode
├── pkg/
│ ├── adapter/ # Database adapters
│ │ ├── factory.go
│ │ ├── dummy/
│ │ └── mssql/
│ ├── config/
│ ├── core/ # Shared types, Source interface
│ ├── security/ # Query validation, PII masking
│ └── server/ # MCP server
└── coremcp.yaml
Herramientas y prompts
Herramientas integradas
query_database
SQL arbitrario contra un origen configurado.
source_name(obligatorio)query(obligatorio)
list_tables
Tablas con recuentos de columnas, claves primarias, recuentos de claves foráneas.
source_name(obligatorio)
describe_table
Esquema completo para una tabla: columnas, tipos, nulabilidad, PKs, FKs, comentarios de columna.
source_name(obligatorio)table_name(obligatorio)
list_views
Todas las vistas con definiciones de columnas.
source_name(obligatorio)
list_procedures
Procedimientos almacenados con nombres de parámetros, tipos, modos (IN/OUT/INOUT) y un ejemplo de llamada listo para copiar.
source_name(obligatorio)
execute_procedure
Llama a un procedimiento almacenado con parámetros nombrados. Solo habilitado cuando readonly: false.
source_name(obligatorio)procedure_name(obligatorio)params(opcional) — objeto JSON de pares nombre/valor
Endurecimiento:
- Nombre del procedimiento validado contra
^[a-zA-Z_][a-zA-Z0-9_#@.]*$ - Nombres de parámetros validados (alfanuméricos + guion bajo)
- Valores vinculados mediante
sql.Named— sin interpolación de cadenas - Rechazado directamente cuando el origen es
readonly: true
Ejemplo:
{
"source_name": "erp_db",
"procedure_name": "sp_CiroHesapla",
"params": "{\"StartDate\":\"2024-01-01\",\"EndDate\":\"2024-12-31\"}"
}
Herramientas personalizadas
Define consultas parametrizadas reutilizables como herramientas MCP de primera clase:
custom_tools:
- name: "get_daily_sales"
description: "Daily sales summary for a given date"
source: "production_db"
query: "SELECT * FROM orders WHERE DATE(created_at) = '{{date}}'"
parameters:
- name: "date"
description: "Date in YYYY-MM-DD format"
required: true
- name: "get_top_customers"
description: "Top N customers by order count"
source: "production_db"
query: "SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id ORDER BY order_count DESC LIMIT {{limit}}"
parameters:
- name: "limit"
description: "Number of customers to return"
required: true
default: "10"
Estas se exponen al modelo con su esquema de parámetros declarado, para que el modelo pueda llamarlas directamente en lugar de volver a derivar el SQL en cada turno.
database_schema prompt
Al iniciar, CoreMCP se conecta a cada origen configurado, escanea tablas / columnas / claves / relaciones y extrae comentarios de columna (por ejemplo, MS_Description en MSSQL). El resultado se expone como un único prompt de MCP que prepara al modelo con contexto de esquema — incluidos los comentarios — para que pueda escribir consultas correctas sin volcados de esquema manuales en cada conversación.
Añadir adaptadores
- Crea
pkg/adapter/yourdb/. - Implementa
core.Source. - Regístralo en
pkg/adapter/factory.go.
pkg/adapter/dummy/dummy.go es la implementación de referencia mínima.
Hoja de ruta
- Descubrimiento de esquema al iniciar
- Comentarios / descripciones de columna
-
list_tables/describe_tableintegrados - Herramientas personalizadas parametrizadas
- Lexer consciente de T-SQL para saneamiento de consultas (fail-closed, rechazo de múltiples declaraciones, sin parser de terceros)
- Enmascaramiento de PII
- Límite de filas forzado
- Modo WebSocket
connect - Reconexión automática
- Sincronización de configuración remota
- NOLOCK / READ UNCOMMITTED por origen (MSSQL)
- Middleware de caracteres turcos + mojibake (MSSQL)
- Descubrimiento de vistas y procedimientos (
list_views,list_procedures,execute_procedure) - Adaptador PostgreSQL
- Adaptador Firebird (en progreso)
- Adaptador MySQL
- Transporte HTTP
- Caché de resultados de consultas
- Operaciones de escritura (con protecciones de seguridad explícitas)
- Registro de auditoría
- Gestión multi-agente
- Monitoreo en tiempo real
Contribuciones
Consulta CONTRIBUTING.md. Informes de seguridad: SECURITY.md.
Licencia
Licencia Apache 2.0 — consulta LICENSE.
Soporte
- Reportar un error
- Solicitar una función
- Correo electrónico: support@corebasehq.com
Acerca de
CoreMCP es el componente de puerta de enlace de código abierto y local de CoreBase, una plataforma de agentes de IA para los datos de tu empresa. Chatea directamente con tus bases de datos y APIs, o deja que agentes autónomos y activados por eventos ejecuten automatizaciones de múltiples pasos a través de ellos — bases de datos (SQL Server 2000+, PostgreSQL), APIs REST y GraphQL, y más de 50 conectores SaaS.
CoreMCP es la forma en que esos agentes alcanzan los sistemas detrás de tu firewall, incluidos los heredados y locales a los que nada más se conecta: se ejecuta en tu propio servidor, mantiene las credenciales de la base de datos localmente y se conecta con confianza cero — solo puerto 443 saliente, sin puertos entrantes. Sobre ese acceso, CoreBase añade Contexto Unificado y Memoria de Consultas: las relaciones de esquema, la terminología y los patrones de consulta probados que convierten el acceso bruto en respuestas precisas.