Skip to main content
Glama

bitacora-mcp — Fase 2

MCP server en NestJS para crear, versionar, recuperar y publicar presentaciones HTML. El store git es la fuente de verdad; Apps Script (Google Workspace) es el target de publicación, descartable y reconstruible desde cualquier commit.

Qué hace (y qué no, todavía)

  • create / update / get / list / list_versions / rollback

  • ✅ Cada operación es un commit → historial real en git, rollback no destructivo

  • ✅ Normaliza el HTML: envuelve fragments en documento completo con <title> escapado (mismo patrón escHtml del review de XSS)

  • deploy / get_deployment: publica un commit como web app de Apps Script (idempotente por versión) y consulta el estado de publicación

  • ✅ Transform sandbox-safe antes de publicar: fuerza <!DOCTYPE html>, <base target="_top"> y bloquea assets http:// (mixed content)

  • ⛔ Sin OAuth de Workspace: owner se pasa como argumento y el deploy corre bajo una cuenta personal (en Fase 3 sale del login del usuario + service account de dominio)

Related MCP server: marp-agent-mcp

Arquitectura interna

Los módulos mapean 1:1 a los futuros packages/ del monorepo:

  • core/ → normalización y validación de HTML (DeckService, escHtml)

  • store/GitSpecStore, el store versionado en git (decks + índice de deployments)

  • presentations/ → orquestación + @McpController con las 6 tools de versionado

  • deployer/ → toda la fricción de Google en un lugar: OAuth, cliente de la Apps Script API, transform sandbox-safe, y las 2 tools de publicación

Correr

npm install
npm run build
npm start          # levanta el server por stdio

El store se crea en ~/.bitacora-store (configurable con DECK_STORE_DIR).

Publicar en Apps Script (setup de Google, una sola vez)

El deploy corre bajo cuenta personal en esta fase (Fase 3 migra a service account de dominio). Pasos previos, una sola vez por máquina/cuenta:

  1. En Google Cloud Console, un proyecto (o uno nuevo).

  2. Habilitar la Google Apps Script API en ese proyecto (APIs & Services → Library).

  3. Credentials → Create credentials → OAuth client ID, tipo Desktop app.

  4. Descargar el JSON y guardarlo en ~/.bitacora-google/oauth-client.json (override con GOOGLE_OAUTH_CLIENT_PATH).

  5. Correr el consent flow local:

    npm run build
    npm run google:authorize

    Abre una URL de consentimiento, levanta un server local (loopback) para recibir el redirect, y cachea el refresh token en ~/.bitacora-google/token.json (override con GOOGLE_TOKEN_PATH). Se refresca solo de ahí en más.

Las credenciales de Google se guardan fuera del store git a propósito (~/.bitacora-google/, no DECK_STORE_DIR): el store se versiona y podría compartirse; nada con secretos debe vivir ahí.

Variables opcionales para el manifest del web app:

Env var

Default

Qué controla

APPS_SCRIPT_WEBAPP_ACCESS

DOMAIN

Quién puede abrir la URL publicada (DOMAIN, ANYONE, ANYONE_ANONYMOUS, MYSELF)

APPS_SCRIPT_WEBAPP_EXECUTE_AS

USER_DEPLOYING

Con qué identidad corre el doGet (USER_DEPLOYING o USER_ACCESSING)

Prueba end-to-end

npm run smoke      # cliente MCP que ejercita todo el ciclo sobre stdio

El smoke test corre con DECK_DEPLOYER_MOCK=1: el ciclo deploy / get_deployment se ejercita contra un cliente de Apps Script en memoria, sin tocar Google ni requerir credenciales. Para probar contra la API real, corré el server con DECK_DEPLOYER_MOCK sin setear (o en 0) y las credenciales de la sección anterior ya cacheadas.

Conectar a Claude Desktop

En claude_desktop_config.json:

{
  "mcpServers": {
    "bitacora": {
      "command": "node",
      "args": ["/RUTA/ABSOLUTA/bitacora-mcp/dist/main.js"],
      "env": { "DECK_STORE_DIR": "/RUTA/ABSOLUTA/deck-store" }
    }
  }
}

Tools

Tool

Qué hace

presentation_create

Crea un deck y lo guarda versionado. Devuelve id + version (SHA).

presentation_update

Nueva versión con HTML y/o metadata nuevos.

presentation_get

HTML + metadata en HEAD o en un version (SHA) histórico.

presentation_list

Lista los decks, filtrable por owner.

presentation_list_versions

Historial de commits de un deck.

presentation_rollback

Vuelve a un version anterior creando un commit nuevo.

presentation_deploy

Publica un version (default HEAD) como web app de Apps Script. Idempotente por commit.

presentation_get_deployment

Devuelve el estado de publicación actual (commit, scriptId, deploymentId, url).

Notas de stack

  • @rekog/mcp-nest v2 — API McpStrategy + @McpController (no McpModule.forRoot).

  • Transporte stdio: logger: false porque stdout está reservado para el protocolo.

  • El mismo McpStrategy acepta StreamableHttpTransport para el salto a remoto con OAuth de la Fase 3, sin tocar las tools.

Install Server
F
license - not found
A
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • List, share, upload, and manage Slideless HTML presentations from any MCP host.

  • Streamable HTTP MCP server for Google Calendar and Sheets with OAuth login.

  • A MCP server built for developers enabling Git based project management with project and personal…

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/diohernandez/bitacora-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server