Ek-Chuah MCP
by Entheos69
README.md
# Ek-Chuah MCP -- MCP-AEC (lector C3)
Servidor MCP **read-only** que sirve el **graph_aec** (Archivo Epistemico) en la nube:
cualquier IA lee la via epistemica de forma autonoma, y por **I3** cada lectura trae
su porque. Hermano del substrato [`Ek-Chuah`](https://github.com/Entheos69/Ek-Chuah)
(misma topologia que `concept-sediment` / `concept-sediment-mcp`: substrato y servidor
MCP son repos separados).
> Contrato de origen: `concept-sediment/docs/ek_chuah/` -- CONVERGENCIA (proceso 2),
> LECTOR_C3 (esta spec), SCHEMA_YAML_AEC, y REPORTE_CodeCS_a_CodeMCP_paso4_habilitado.
## Arquitectura (camino B -- Guardian 2026-06-27)
La nube **no** recibe la proyeccion ya construida; recibe el **log** (forma Q) y
**reconstruye** la proyeccion aqui. Honra forma Q / I1, evita el desync de proyeccion
one-way, y reusa el stack `concept-sediment-mcp`.
```
../AEC/log/inscripciones.jsonl (durable local, la VERDAD -- CodeCS)
| exportador del log (SOL JOINT a CodeCS; bytes nivel-1 NO cruzan)
v
aec_log (JSONB append-only) copia replicada del log en la nube
| projection_build.rebuild_projection (idempotente, det.)
v
tablas graph_aec + afirmacion.embedding proyeccion REGENERABLE
| queries.py (read-only)
v
4 tools MCP -> cualquier IA
```
## Tools (4 core, todas read-only)
| Tool | Job | Entrada |
|---|---|---|
| `aec_search` | "?ya investigue X?" -- indice anti-re-investigacion (embeddings + ILIKE) | `query` |
| `aec_get_via` | una afirmacion + su via ascendente completa (I3) | `af_id` |
| `aec_resolve` | un referente -> cadena de versiones (I4) | `url` \| `referente_id` \| `content_hash` |
| `aec_get_necesidad` | traza descendente: que trajo una indagacion y que sobrevivio | `nec_id` |
`aec_search` devuelve cada hit con **stub** de via (nunca dato pelon); `aec_get_via`
expande la via completa. 5a tool `aec_divergencia` **diferida** (LECTOR_C3 §8).
## Membrana (el candado que no se rompe)
- **No escribe.** Read-only por construccion + `get_readonly_session` (SET TRANSACTION
READ ONLY) + rol de BD solo-lectura en Railway. Aportar va por Estratega, fuera de aqui.
- **No baja URLs.** Sin web; la `url` es metadato forense que devuelve, no que fetcha.
- **No sirve nivel 1.** Devuelve `content_hash`, nunca los bytes del snapshot.
## Estructura
```
server.py FastMCP + Starlette + 4 tools aec_*
queries.py lectura read-only (ports de proyeccion.py)
projection_build.py rebuild de aec_log -> proyeccion + embeddings (camino B)
_TABLAS_PROYECCION es la lista canonica de tablas
schema.sql DDL: aec_log + tablas de proyeccion + pgvector
db.py engine; get_readonly_session (defensa membrana)
normaliza_url.py espejo vendorizado de D-ver-1 (canonical URL)
```
## Local
```bash
cp .env.example .env # DATABASE_URL (Postgres+pgvector) + GEMINI_API_KEY
python projection_build.py --replicate ../AEC/log/inscripciones.jsonl # carga aec_log
python projection_build.py --rebuild # reconstruye + embeddings
python server.py # lector en :8000
```
Falsador I1 (rebuild = identico, excluye embedding):
`python projection_build.py --dump` debe coincidir con
`Ek-Chuah/proyeccion.dump_logico` sobre el mismo log.
## Deploy (gateado por Guardian)
El deploy del MCP-AEC **invalida sesiones MCP** (CONVERGENCIA §9). Antes: YAMLs de
cierre `reviewed` + MTV + baselines si cambian tools. Railway apunta a **este** repo,
no al substrato. Post-deploy: reiniciar cliente -> reconectar MCP.
## Pendiente JOINT
El **exportador del log** local -> `aec_log` es jurisdiccion CodeCS (SOL del borde,
`docs/ek_chuah/SOL_EXPORTADOR_LOG_AEC_2026-06-27.md`). Mientras tanto,
`projection_build.py --replicate` lo simula desde el archivo local para pruebas.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues