mcp-data-server
mcp-data-server
Proyecto de ejemplo que demuestra patrones de producción para web-scraping / automatización.
Un servidor MCP que le da a Claude (o a cualquier cliente MCP) acceso de solo lectura a una base de datos empresarial — con las salvaguardas que hacen que conectar un LLM a datos reales de la empresa sea aceptable: conexión de solo lectura, lista blanca de tablas, enmascaramiento de PII, límite de filas, tiempo de espera de consulta y un registro de auditoría completo.
Pregunta "¿qué países piden más y cuánto nos costaron los reembolsos el último trimestre?" en Claude Desktop y obtén la respuesta desde la base de datos real — sin que el modelo pueda escribir, eliminar, adjuntar o leer una tabla que no se le haya concedido.
Por qué existe esto
El obstáculo en la mayoría de los proyectos "conectar IA a nuestros datos" no es la conexión, sino la primera pregunta de quien sea dueño de la base de datos: ¿qué impide que lea o rompa algo que no debería? Este servidor responde esa pregunta en código.
Related MCP server: Vela MCP Server
Cuatro barreras independientes
# | Barrera | Qué impide |
1 | Conexión abierta | cualquier escritura, incluso si se omiten todas las comprobaciones anteriores |
2 | Análisis de sentencia | múltiples sentencias, cualquier cosa que no sea |
3 | Lista negra de palabras clave |
|
4 | Lista blanca + enmascaramiento + límites | tablas no concedidas, columnas PII, resultados sobredimensionados, consultas descontroladas |
Cada sentencia ejecutada se añade al registro de auditoría con su recuento de filas y duración, para que el propietario de los datos pueda ver exactamente lo que el modelo solicitó.
2026-08-18T11:22:41 6 rows in 1ms SELECT country, COUNT(*) FROM customers GROUP BY 1 LIMIT 201
2026-08-18T11:22:44 error: rejected DELETE FROM customersHerramientas expuestas
Herramienta | Propósito |
| tablas legibles + recuentos de filas |
| columnas, tipos, cuáles están enmascaradas, 3 filas de muestra |
| un |
| búsqueda de subcadenas sin escribir SQL |
| nulos, recuento de distintos, min/max, 5 valores principales |
Además de un recurso schema://tables, para que un cliente pueda cargar todo el esquema sin gastar una llamada de herramienta.
Inicio rápido
git clone https://github.com/dkautomation23/mcp-data-server.git
cd mcp-data-server
python -m venv .venv && . .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
python -m mcp_data_server.seed # creates demo.db
cp .env.example .env # then point DATABASE_PATH at your file
python -m mcp_data_server # serves over stdioPython 3.10+. La base de datos de demostración tiene customers, orders, order_items y una tabla deliberadamente sensible internal_notes utilizada a continuación para mostrar el bloqueo de la lista blanca.
Conéctalo a Claude Desktop
Añadir a claude_desktop_config.json (ejemplo completo en examples/claude_desktop_config.json):
{
"mcpServers": {
"business-data": {
"command": "python",
"args": ["-m", "mcp_data_server"],
"cwd": "C:/path/to/mcp-data-server",
"env": {
"DATABASE_PATH": "C:/path/to/your.db",
"ALLOWED_TABLES": "customers,orders,order_items",
"MASKED_COLUMNS": "customers.email,customers.phone"
}
}
}
}Conéctalo a Claude Code
claude mcp add business-data -- python -m mcp_data_serverCómo es una sesión
Salida real del servidor en ejecución (consulta examples/demo_session.md para la transcripción completa):
// run_sql("SELECT status, COUNT(*) n, ROUND(SUM(total_eur)) revenue FROM orders GROUP BY 1 ORDER BY 3 DESC")
{
"sql": "SELECT status, COUNT(*) n, ROUND(SUM(total_eur)) revenue FROM orders GROUP BY 1 ORDER BY 3 DESC LIMIT 201",
"columns": ["status", "n", "revenue"],
"rows": [["paid", 92, 149914.0], ["pending", 39, 64596.0], ["refunded", 31, 45911.0]],
"row_count": 3, "truncated": false, "elapsed_ms": 0
}
// run_sql("DELETE FROM customers")
{ "error": "only SELECT (or WITH ... SELECT) statements are allowed" }
// run_sql("SELECT * FROM internal_notes")
{ "error": "table 'internal_notes' is not in the allowlist (allowed: customers, orders, order_items)" }
// run_sql("SELECT id, name, email FROM customers LIMIT 2")
{ "rows": [[1, "Customer 001", "***"], [2, "Customer 002", "***"]] }Configuración
Variable | Por defecto | Propósito |
|
| Archivo SQLite a exponer (siempre abierto en solo lectura) |
| todas | lista blanca separada por comas; cualquier otra cosa es invisible |
| – | lista |
|
| límite máximo por llamada; los resultados por encima se marcan como |
|
| una consulta más larga se cancela |
|
| registro de solo anexión de cada sentencia; vacío lo desactiva |
Pruebas
pytest -q............................... [100%]
31 passed in 1.77sTres capas: las salvaguardas SQL (inyección, segundas sentencias, contrabando de comentarios, tablas prohibidas), la capa de base de datos contra un archivo real sembrado (incluyendo un intento de escritura que el propio SQLite rechaza), y siete pruebas que impulsan el servidor sobre el protocolo MCP real — el mismo flujo de handshake, list_tools y call_tool que realiza un cliente de escritorio.
Adaptarlo a la pila de un cliente
Postgres / MySQL: reemplaza la conexión en
db.pycon un controlador agrupado y una sesiónSET TRANSACTION READ ONLY; la capa de validación no cambia.Herramientas específicas del negocio: añade una función con
@mcp.tool()enserver.py— untop_customers(period)bien nombrado supera a hacer que el modelo escriba SQL.Transporte HTTP en lugar de stdio:
mcp.run(transport="streamable-http"), luego ponlo detrás de tu propia autenticación.
Licencia
MIT — consulta LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Query your warehouse or a CSV with Claude/ChatGPT over MCP, governed by table-level ACL + audit.
Ask questions in plain language, get answers from your business database. No SQL required.
Ask business questions in plain English. Get instant answers from your database, no SQL needed.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables read-only exploration and querying of PostgreSQL or MySQL databases via MCP, with schema discovery, safe SQL validation, natural language to SQL conversion, and CSV export.111-
- AlicenseNot gradedqualityDmaintenanceEnables governed, agent-agnostic data exploration by allowing users to ask natural language questions through MCP-compatible agents, executing safe, permission-scoped queries against data sources and returning interactive charts.3 npmApache 2.0
- AlicenseNot gradedqualityAmaintenanceProvides a secure, policy-driven read-only gateway that exposes multiple databases to AI tools via MCP, with governed select, search, and aggregate operations and no free-form SQL.Apache 2.0
- FlicenseNot gradedqualityCmaintenanceEnables natural-language querying of Postgres and MongoDB databases in read-only mode, with PII masking and row/timeout guardrails, from any MCP client.-