Skip to main content
Glama
README.md
# MCP Hub propio para Codex y ChatGPT

Este servicio consolida dos cosas en una sola capa:

- MCP remoto por `Streamable HTTP` para Codex y ChatGPT.
- Panel técnico y registry compatible para onboarding de conectores y sitios WordPress.

## Qué incluye ahora

- Hub MCP con herramientas de Notion y WordPress.
- State store persistido en JSON para onboarding editable.
- Panel técnico en `/admin`.
- Admin API en `/api/admin/*`.
- Registry WordPress compatible:
  - `GET /sites`
  - `GET /sites/:site_id`
  - `POST /register-site`
  - `PATCH /sites/:site_id`
  - `DELETE /sites/:site_id`

## Arquitectura

- `src/index.ts`: entrypoint HTTP, `/mcp`, `/health`, `/admin` y rutas de registry.
- `src/mcp-server.ts`: herramientas MCP de Notion y WordPress.
- `src/lib/state.ts`: estado persistido del hub.
- `src/notion.ts`: adaptador Notion por alias.
- `src/wordpress.ts`: adaptador WordPress compatible con el bridge actual.
- `src/admin/*`: UI y API técnica de onboarding.

## Variables de entorno

Obligatorias en producción:

- `ADMIN_API_KEY`
- `ADMIN_SESSION_SECRET`
- `WORDPRESS_REGISTRY_TOKEN`

Recomendadas:

- `MCP_AUTH_MODE=bearer`
- `MCP_API_KEY`
- `MCP_ALLOWED_HOSTS=mcp.tudominio.com,localhost,127.0.0.1`
- `HUB_STATE_FILE=/app/data/hub-state.json`

Bootstrap opcional:

- `NOTION_CONNECTIONS_JSON`
- `WORDPRESS_BOOTSTRAP_SITES_FILE`
- `NOTION_OAUTH_CLIENT_ID`
- `NOTION_OAUTH_CLIENT_SECRET`
- `NOTION_OAUTH_REDIRECT_URI`

## Rutas principales

- `GET /`
- `GET /health`
- `GET /admin`
- `POST /mcp`
- `GET /sites`
- `POST /register-site`

## Panel técnico

El panel permite:

- iniciar autorizaciones de Notion por OAuth;
- almacenar y editar conexiones Notion ya autorizadas;
- validarlas con `whoami`;
- registrar sitios WordPress a mano;
- ver estado de bridge;
- ocultar o desactivar sitios sin borrarlos lógicamente del modelo;
- eliminar sitios del registry;
- ver el catálogo técnico para futuros conectores.

## Compatibilidad WordPress

La idea es no romper el stack actual:

- el plugin WordPress puede seguir enviando auto-registro a `POST /register-site`;
- el modelo por `site_id`, `site_label` y `base_url` se mantiene;
- las herramientas MCP WordPress conservan los mismos nombres usados antes.

## Uso local

```bash
npm install
copy .env.example .env
npm run dev
```

Pruebas rápidas:

```bash
curl http://localhost:3000/health
npm run smoke:http
```

Abre:

```text
http://localhost:3000/admin
```

## Despliegue en EasyPanel

1. Crea el servicio desde este directorio.
2. Persiste `./data` o define un volumen para `HUB_STATE_FILE`.
3. Configura `MCP_AUTH_MODE=bearer` y un `MCP_API_KEY` privado.
4. Configura `MCP_ALLOWED_HOSTS` con tu dominio publico y localhost.
5. Configura `ADMIN_API_KEY`, `ADMIN_SESSION_SECRET` y `WORDPRESS_REGISTRY_TOKEN`.
6. Si vas a conectar Notion desde el panel, configura `NOTION_OAUTH_CLIENT_ID`, `NOTION_OAUTH_CLIENT_SECRET` y `NOTION_OAUTH_REDIRECT_URI=https://tu-dominio/api/admin/connectors/notion/oauth/callback`.
7. Si vienes del `wp_criu_registry` actual, monta el mismo volumen y deja `WORDPRESS_BOOTSTRAP_SITES_FILE=/app/data/sites.json`.
8. Publica el servicio por HTTPS.
9. Usa `/mcp` para MCP y `/admin` para onboarding humano.

## Onboarding de Notion

1. Crea una integración pública de Notion y define como redirect URI:
   - `https://tu-dominio/api/admin/connectors/notion/oauth/callback`
2. Carga `NOTION_OAUTH_CLIENT_ID`, `NOTION_OAUTH_CLIENT_SECRET` y `NOTION_OAUTH_REDIRECT_URI` en EasyPanel.
3. Entra a `/admin`.
4. Escribe `alias`, `label` opcional y `defaultParentPageId` opcional.
5. Pulsa `Conectar con Notion`.
6. Autoriza la integración en Notion.
7. Vuelve al panel y valida con `whoami`.

## Migración directa desde el registry actual

Si `mcp.criu.com.co` hoy responde como `wp_criu_registry`, la migración segura para reemplazarlo con este hub es:

1. Respaldar el volumen actual de `/app/data`.
2. Mantener el archivo legado `sites.json` en ese mismo volumen.
3. Desplegar este servicio con:
   - `HUB_STATE_FILE=/app/data/hub-state.json`
   - `WORDPRESS_BOOTSTRAP_SITES_FILE=/app/data/sites.json`
4. Arrancar el hub nuevo.
5. Confirmar en `/admin` que los sitios heredados aparecieron.

El hub también intenta detectar automáticamente un `sites.json` vecino al `hub-state.json`, de modo que un reemplazo directo no dependa de pasos manuales extra.

## Codex

Ejemplo con bearer:

```toml
[mcp_servers.criu_hub]
url = "https://mcp.tudominio.com/mcp"
bearer_token_env_var = "CRIU_MCP_HUB_TOKEN"
```

El valor de `CRIU_MCP_HUB_TOKEN` debe ser el mismo `MCP_API_KEY` del hub.

## ChatGPT

Diseño recomendado:

- camino principal: `Secure MCP Tunnel`
- fallback: endpoint HTTPS directo a `/mcp`

## Guía operativa

Hay una guía más aterrizada de uso personal, despliegue y onboarding en [docs/OPERACION_PERSONAL.md](./docs/OPERACION_PERSONAL.md).

Si este repo ya está desplegado en producción, el estado operativo real y los endpoints live actuales quedaron documentados en [docs/ESTADO_LIVE_MCP_CRIU.md](./docs/ESTADO_LIVE_MCP_CRIU.md).

## Scripts útiles

Importar sitios desde el registry vivo actual a `data/sites.json`:

```bash
LEGACY_REGISTRY_TOKEN=tu_token npm run import:legacy-registry
```

O explícitamente:

```bash
node scripts/import-legacy-registry.mjs --url https://mcp.criu.com.co --token tu_token --output ./data/sites.json
```

Hacer smoke test HTTP/MCP del hub ya levantado:

```bash
MCP_HUB_URL=https://mcp.criu.com.co MCP_HUB_TOKEN=tu_token npm run smoke:http
```

## Futuros conectores

Cada integración nueva debería entrar como:

1. manifest del conector
2. config schema
3. health check
4. admin form
5. entidades administrables
6. adaptador MCP

TDQS

B3/5.0

Scored across 17 tools

Disambiguation4/5

Most tools have distinct purposes (themes, plugins, translations, DB, files). Some overlap between `bridge_raw_request` and `rest_proxy` could cause confusion, but descriptions help differentiate.

Naming Consistency4/5

Most names follow `verb_noun` pattern (e.g., `activate_theme`, `list_plugins`). However, `plugin_action` deviates, and mixing `check_translations` with `check_plural_translations` is acceptable but not perfectly uniform.

Tool Count4/5

17 tools cover a broad range of WordPress management tasks. While slightly above the ideal 3-15 range, the count is justified and not excessive for the domain.

Completeness4/5

Covers themes, plugins, options, DB, REST, files, and translations. Missing theme/plugin creation and user management are minor gaps, but the set is functional for most operations.

Maintenance

ActivityStale
ResponsivenessNo issues