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

CI License Go Version Release

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ónTipoPredeterminadoDescripción
namestring—Identificador único de origen
typestring—Tipo de adaptador: mssql, postgres (o postgresql), rest, graphql, dummy
dsnstring—Cadena de conexión
readonlybooltrueSolo SELECT a nivel de configuración. Establece false explícitamente para permitir execute_procedure.
no_lockboolfalse(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_turkishboolfalse(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 emiteEnviado a la BDPor 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 devuelveCorregidoCausa
GÐKHANGĞKHANByte Win-1254 0xD0 leído como Win-1252
ÝSTANBULİSTANBULByte Win-1254 0xDD leído como Win-1252
ÞEHİRŞEHİRByte 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 SELECT y WITH. DROP, ALTER, UPDATE, DELETE, TRUNCATE, EXEC, OPENROWSET, SELECT…INTO y 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 mediante EX/**/EC y 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. LIMIT se 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 SQL
  • get_schema — volcar esquema en caché
  • list_sources — enumerar orígenes configurados
  • health_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

  1. Crea pkg/adapter/yourdb/.
  2. Implementa core.Source.
  3. 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_table integrados
  • 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


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.