dfevx/gov-ec-mcp-server
If you are the rightful owner of gov-ec-mcp-server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
The MCP Server for Citizen Co-decision in Ecuador is a secure and verifiable platform that provides access to public government data, enabling participatory analysis and citizen co-decision.
gov-ec-mcp-server — MCP Server para co-decisión ciudadana (Ecuador)
Servidor Model Context Protocol (MCP) que expone, de forma segura y verificable, vistas de una base de datos Postgres/Supabase con datos públicos del Gobierno de Ecuador. Este repositorio corresponde al módulo 2 de un proyecto mayor: una infraestructura de datos semántica para habilitar análisis participativo y co-decisión ciudadana en el Observatorio Ciudadano para Estado Abierto (CPCCS).
El MVP se centra en el conjunto Detenidos/Aprehendidos de datosabiertos.gob.ec, entregando consultas en modo solo-lectura, reportes auditables y registros de acceso/errores con mínimos privilegios.
📌 Objetivos
- Bajar la barrera técnica: permitir a equipos no técnicos (CPCCS, ciudadanía, periodistas) consultar y descargar datos abiertos con semántica documentada.
- Veracidad y trazabilidad: exponer vistas controladas, documentar campos/relaciones, y registrar uso/errores para auditoría.
- Arquitectura portable: correr en local (con túnel HTTPS via grok) y en Railway (PaaS), con configuración por
.env.
🧩 Arquitectura (visión general)
- MCP Server (este repo): FastAPI/Uvicorn + MCP; carga YAMLs de metadata y reportes; aplica guardarraíles (timeouts, paginación, modo “full-scan”).
- Postgres/Supabase (read-only): vista pública
v_detenidos_public, índices de consulta, roles de solo lectura (mcp_ro) y solo inserción de logs (mcp_log). - YAML maestro: describe datasets y reportes; paths por defecto:
metadata/datasets.ymlymetadata/reports.yml. - Logs:
access_logsyerror_logscon RLS (INSERT-only paramcp_log). - Despliegue:
Procfile(Railway), configuración enpyproject.tomly dependencias enrequirements.txt.
🗂️ Estructura del repositorio
.
├─ metadata/ # YAML maestro (datasets y reportes)
│ ├─ datasets.yml
│ ├─ detenidos_aprehendidos.yml
│ └─ reports.yml
├─ sql/ # Migraciones/objetos de BD (ordenadas por prefijo)
│ ├─ 010_view_v_detenidos_public.sql
│ ├─ 020_indexes_analytics.sql
│ ├─ 030_roles_and_grants.sql
│ └─ 040_logs_tables_policies.sql
├─ src/mcp_ec/ # Código del servidor MCP
│ ├─ __init__.py
│ ├─ config.py
│ ├─ db.py
│ ├─ http_app.py
│ ├─ logging_config.py
│ ├─ metadata.py
│ ├─ reports.py
│ ├─ run_http.py
│ └─ security.py
├─ .gitignore
├─ Procfile
├─ pyproject.toml
├─ requirements.txt
├─ SECURITY.md
└─ README.md
- Nota: el proyecto usa layout
src/y empaquetado con setuptools/pyproject;include-package-data = truepermite que lo indicado enMANIFEST.in(YAML/SQL) viaje en el sdist.
✅ Requisitos
- Python 3.11+
- Postgres/Supabase con usuarios de mínimo privilegio:
mcp_ro: read-only sobre vistas públicasmcp_log: insert-only enaccess_logsyerror_logs
- Variables de entorno en
.env(usa la plantilla.env.example). Claves principales:DB_URL_RO,DB_URL_LOG,STATEMENT_TIMEOUT_MS,PAGE_MAX,METADATA_FILE,REPORTS_FILE,HOST,PORT,RELOAD,TRUST_PROXY.
⚙️ Instalación
Opción A (rápida, para testers):
python -m venv .venv
# Windows:
.venv\Scripts ctivate
# macOS/Linux:
# source .venv/bin/activate
pip install -r requirements.txt
Opción B (proyecto editable, extras de desarrollo opcionales):
pip install -e . # instala según pyproject.toml
# o con extras de dev:
# pip install -e .[dev]
- Las dependencias principales están definidas en
pyproject.toml(PEP 621) y reflejadas enrequirements.txtpara facilitar pruebas por terceros.
🔧 Configuración
- Copia la plantilla y completa valores reales (no subas
.enval repo):
cp .env.example .env
- Variables clave (extracto):
DB_URL_RO,DB_URL_LOG: DSNs consslmode=requireyconnect_timeout=5.REQUIRE_FULL_SCAN_DEFAULT,ERROR_LOGGING_ENABLED,STATEMENT_TIMEOUT_MS,PAGE_DEFAULT,PAGE_MAX.METADATA_FILE,REPORTS_FILE: rutas al YAML maestro (por defectometadata/*.yml).HOST,PORT,RELOAD,WEB_CONCURRENCY,TRUST_PROXY,FORWARDED_ALLOW_IPS.
El repo incluye
.gitignorepara evitar que.env, entornos y artefactos de build se suban por error.
🗃️ Preparar Base de Datos
Ejecuta los SQL en este orden:
psql "$DB_URL_ADMIN" -f sql/010_view_v_detenidos_public.sql
psql "$DB_URL_ADMIN" -f sql/020_indexes_analytics.sql
psql "$DB_URL_ADMIN" -f sql/030_roles_and_grants.sql
psql "$DB_URL_ADMIN" -f sql/040_logs_tables_policies.sql
- 010: crea la vista
v_detenidos_public(superficie de lectura). - 020: índices para filtros más comunes y rangos temporales.
- 030: crea usuarios de mínimo privilegio y concede permisos.
- 040: tablas de logs, índices y RLS (INSERT-only para
mcp_log).
En Supabase, puedes aplicar cada script desde SQL Editor con un rol administrador del proyecto.
▶️ Ejecución en local
# Con el entrypoint del proyecto (recomendado para reproducir prod)
python -m mcp_ec.run_http --host 127.0.0.1 --port 8000
# Alternativa directa (si necesitas)
# uvicorn mcp_ec.http_app:app --host 127.0.0.1 --port 8000 --reload
- Para exponerlo a un cliente MCP externo (p. ej., Claude Pro Desktop), crea un túnel HTTPS (ej. grok):
Usa la URL pública resultante como endpoint del servidor MCP en tu cliente.
grok http 8000
☁️ Despliegue en Railway
- Crear proyecto en Railway y conectar el repo.
- Variables: define en el panel (
DB_URL_RO,DB_URL_LOG, etc.; no subas.env). - Procfile: el repo incluye un proceso web que arranca el servidor:
web: python -m mcp_ec.run_http --host 0.0.0.0 --port $PORT - Deploy: Railway/Nixpacks detecta Python y usará el
Procfile.
Si desplegaste detrás de proxy, el
run_http.pyaplica cabeceras de proxy y configuraHOST/PORTdesde entorno (ver.env.example).
🔐 Seguridad (resumen)
- Principio de mínimo privilegio:
mcp_ro(read-only),mcp_log(insert-only). - RLS en logs: bloquea lecturas por roles de aplicación.
- Guardarraíles:
STATEMENT_TIMEOUT_MS,PAGE_MAX,REQUIRE_FULL_SCAN_DEFAULT. - Transporte: siempre detrás de HTTPS (Railway) o túnel HTTPS (local).
- Gestión de secretos: no versionar
.env; rotar credenciales si se exponen.
Consulta para detalles operativos y flujo de responsible disclosure.
🧪 Salud y endpoints
- Healthcheck: ruta
/__health - Documentación interactiva: si está habilitada por tu build, la UI de OpenAPI suele estar en
/docs. - MCP: las herramientas/recursos se anuncian vía protocolo MCP para clientes compatibles (p. ej., Claude Desktop).
🧰 Comandos útiles
# Instalar solo runtime
pip install -r requirements.txt
# Instalar editable con extras de dev
pip install -e .[dev]
# Ejecutar servidor (local)
python -m mcp_ec.run_http --host 127.0.0.1 --port 8000
🗺️ Roadmap
- Exportadores tabulares (CSV/Parquet) y endpoints de descarga controlada.
- Validaciones esquemáticas y data contracts por dataset.
- Anotaciones semánticas ampliadas (definiciones, periodicidad, cobertura).
- Métricas de uso (agregadas) y observabilidad de rendimiento.
🤝 Agradecimientos y referencias
- MCP Server Postgres (Anthropic/MCP Team, archivado) — https://github.com/modelcontextprotocol/servers-archived/tree/main/src/postgres
- Documentación oficial de MCP — https://modelcontextprotocol.io/docs/develop/build-server
📝 Licencia
MIT — ver .
📦 Notas de empaquetado
pyproject.tomldefine metadatos, dependencias y entry pointmcp-serve.requirements.txtreplica las dependencias de ejecución para instalaciones rápidas por terceros..gitignoreexcluye.env, entornos, caches y artefactos locales.- Variables por defecto y rutas de YAML están ejemplificadas en
.env.example.