MCP GraphQL Server Multi-Fuente
đź“„ README.md
# MCP GraphQL Server Multi-Fuente
Servidor MCP (Model Context Protocol) que expone una API GraphQL dinámica sobre múltiples fuentes de datos: CSV, Google Sheets, SQLite, PostgreSQL, MySQL, MongoDB y Oracle.
## ✨ CaracterĂsticas
- 🔌 **Adaptadores múltiples**: CSV, Google Sheets, SQLite, PostgreSQL, MySQL, MongoDB, Oracle (preparado).
- 🧠**Esquema GraphQL dinámico**: genera automáticamente el esquema según los datos.
- 🔍 **Consultas flexibles**: filtros avanzados (`where` con operadores), ordenamiento, paginación, selección de campos.
- ✍️ **Mutaciones**: crear, actualizar y eliminar registros con confirmación para eliminaciones.
- 🚀 **Batching**: ejecuta varias consultas en una sola petición.
- đź’ľ **Persisted Queries**: guarda consultas frecuentes y reutilĂzalas por hash.
- 📊 **Métricas**: seguimiento de rendimiento de consultas y mutaciones.
- 🛡️ **Seguridad**: lĂmite de complejidad, errores personalizados, directiva `@auth` de ejemplo.
- 🔄 **Cambio de fuente dinámico**: alterna entre bases de datos sin reiniciar.
## 🏗️ Arquitectura
Cliente MCP (LM Studio, Claude Desktop) │ (stdio) ▼ Servidor MCP (index.ts) │ ├── Herramientas: graphql_query, graphql_mutation, switch_source, list_sources, etc. │ ▼ Capa GraphQL (schema.ts + resolvers.ts) │ ├── Adaptadores (BaseAdapter) │ ├── CSVAdapter │ ├── GoogleSheetsAdapter │ ├── SQLiteAdapter │ ├── PostgresAdapter │ ├── MySQLAdapter │ ├── MongoDBAdapter │ └── OracleAdapter │ ▼ Fuentes de datos (CSV, Google Sheets, SQLite, ...)
## 📦 Requisitos
- Node.js 18 o superior
- npm 9+
- Para SQLite: `better-sqlite3`
- Para PostgreSQL: `pg`
- Para MySQL: `mysql2`
- Para MongoDB: `mongodb`
- Para Oracle: `oracledb` (requiere cliente nativo)
## 🛠️ Instalación
```bash
# Clonar o descargar el proyecto
git clone <url-del-repo>
cd mcp-graphql-server
# Instalar dependencias base
npm install
# Instalar dependencias especĂficas segĂşn adaptadores a usar
npm install better-sqlite3 # SQLite
npm install pg # PostgreSQL
npm install mysql2 # MySQL
npm install mongodb # MongoDB
npm install oracledb # Oracle (requiere Oracle Instant Client)⚙️ Configuración
Crea un archivo .env en la raĂz con las variables de entorno:
# Fuente activa por defecto: csv, google-sheets, sqlite, postgres, mysql, mongodb, oracle
DEFAULT_SOURCE=google-sheets
# CSV
CSV_FILE_PATH=./src/data/sample.csv
# Google Sheets
GOOGLE_SHEETS_API_URL=https://script.google.com/macros/s/TU_ID/exec
GOOGLE_SHEETS_NAME=Empleados
# SQLite
SQLITE_DB_PATH=./src/data/sample.db
SQLITE_TABLE=empleados
# PostgreSQL
PG_CONNECTION_STRING=postgres://user:password@localhost:5432/dbname
PG_TABLE=empleados
# MySQL
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=secret
MYSQL_DATABASE=test
MYSQL_TABLE=empleados
# MongoDB
MONGO_URI=mongodb://localhost:27017
MONGO_DB_NAME=test
MONGO_COLLECTION=empleados
# Oracle
ORACLE_USER=system
ORACLE_PASSWORD=oracle
ORACLE_CONNECT_STRING=localhost:1521/XEPDB1
ORACLE_TABLE=empleados🚀 Uso
Compilar
npm run buildIniciar el servidor
node dist/index.jsEl servidor se conecta por stdio, listo para que un cliente MCP (como LM Studio o Claude Desktop) lo utilice.
Configurar en LM Studio
Abre LM Studio y carga un modelo (ej. Gemma).
Ve a la configuraciĂłn del chat y agrega un servidor MCP.
Comando:
nodeArgumentos:
H:\deepseek-graphql-mcp\dist\index.jsVariables de entorno: copia las de tu
.env.
Reinicia la conversaciĂłn para que el modelo reconozca las herramientas.
Herramientas disponibles
graphql_query– Ejecuta consultas GraphQL.graphql_batch– Ejecuta varias consultas en una llamada.graphql_mutation– Crea, actualiza o elimina registros (con confirmación para DELETE).switch_source– Cambia la fuente de datos activa.list_sources– Lista las fuentes disponibles.register_persisted_query– Registra una consulta persistida.get_metrics– Obtiene métricas de rendimiento.get_schema– Muestra el esquema de la fuente activa.
đź§Ş Ejemplos de consultas
Obtener todos los registros
{
records {
id
nombre
email
}
}Filtrar y ordenar
{
records(
where: { salario: { operator: gt, value: "50000" } },
orderBy: [{ field: "salario", direction: "desc" }]
) {
nombre
salario
}
}Obtener departamentos (solo Google Sheets)
{
departamentos {
id
nombre
ubicacion
}
}Crear registro
mutation {
createRecord(input: { nombre: "Nuevo", email: "nuevo@email.com" }) {
id
nombre
}
}Eliminar con confirmaciĂłn
mutation {
deleteRecord(id: "11")
}La primera llamada devuelve una advertencia; el modelo debe llamar de nuevo con confirm: true.
🔌 Adaptadores incluidos
Adaptador | Archivo | Dependencia | Estado |
CSV |
|
| âś… Probado |
Google Sheets |
|
| âś… Probado |
SQLite |
|
| âś… Probado |
PostgreSQL |
|
| 📦 Catálogo |
MySQL |
|
| 📦 Catálogo |
MongoDB |
|
| 📦 Catálogo |
Oracle |
|
| 📦 Catálogo |
Consulta EXTRA.md para más detalles sobre los adaptadores de base de datos.
đź§° SoluciĂłn de problemas
El modelo no cambia de fuente: Refuerza el system prompt con instrucciones claras sobre
switch_source.Error de tipos en GraphQL: AsegĂşrate de que el esquema se haya inferido correctamente (revisa logs de inicializaciĂłn).
Google Sheets no carga: Verifica que la URL de Apps Script sea pĂşblica y que el nombre de la hoja coincida.
SQLite no funciona: Comprueba que la base de datos exista y tenga la tabla indicada.
Error de compilaciĂłn TS5055: Revisa que
tsconfig.jsonincluya solosrc/**/*y no archivos sueltos en la raĂz.
đź“„ Licencia
MIT – Libre uso y modificación.