bitacora-mcp
This server provides Git-based version control and deployment management for HTML presentations, with Google Workspace integration for authentication and publishing.
Create/Update presentations: Add new HTML decks (with title, optional tags, and owner) or update existing ones; each change creates a new Git commit, preserving full history. Supports large decks via file uploads and chunked content for model-generated presentations. HTML is normalized (fragments wrapped into full documents).
Retrieve/List presentations: Fetch the latest (HEAD) or any historical version by commit SHA. List all saved decks, optionally filtered by owner.
Version control features: View the commit history of a presentation and perform non-destructive rollbacks (a new commit that restores an earlier version).
Deploy to Google Apps Script: Publish a specific commit as a web app with idempotent deployments (same commit returns existing URL). Supports configurable access levels (domain, anyone, etc.) and applies sandbox-safe HTML transformations.
Authentication & identity: Over HTTP, enforces Google Workspace login with domain restriction; the authenticated email automatically becomes the owner. In stdio mode, no authentication context is available, suitable for local use.
Additional capabilities: Check deployment status (URL, script ID, etc.), manage metadata (tags/titles), and use configurable local Git storage. Environment variables allow further customization.
Allows deploying HTML presentations as Google Apps Script web apps, including deployment status queries and idempotent publication of specific versions.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bitacora-mcpCreate a presentation titled 'Q3 Review' with HTML Q3 Results"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
bitacora-mcp
MCP server en NestJS para crear, versionar, recuperar y publicar presentaciones HTML dirigidas a directivos y PO de Bidcom. Los decks se persisten versionados y se publican en Google Workspace vía Google Apps Script, con una URL estable, editable y con historial.
Qué hace
18 tools para crear, editar, versionar, buscar, comparar, validar y publicar presentaciones HTML (ver tabla completa más abajo).
Dos backends de store, switch via env vars:
git(default): filesystem local, single-user — ideal para desarrollomongodb: multi-user, AWS-ready — para deployment centralizado
OAuth de Google Workspace restringido a
bidcom.com.ar(login real, no texto libre). Sesiones persistidas en SQLite o MongoDB.Publicación en Apps Script con idempotencia por commit + access, reintentos con backoff exponencial, y historial completo de publicaciones.
Validación pre-deploy que unifica chequeos de sandbox + estructura HTML.
Related MCP server: marp-agent-mcp
Prerequisitos
Node 22 (usa
--env-filenativo, sin dependencia dedotenv)MongoDB 7+ (solo si vas a usar
DECK_STORE=mongodboOAUTH_STORE=mongodb)Docker (para levantar MongoDB local fácilmente)
Setup inicial
git clone <repo> bitacora-mcp
cd bitacora-mcp
npm install
npm run buildConfiguración
Copiá el template de environment y llená los valores:
cp .env.example .envEditá .env con los valores correspondientes (el archivo está en .gitignore,
no se commitea). Los campos obligatorios dependen del modo de uso:
Modo stdio (local, sin login de Google)
Para usar desde Claude Desktop local sin login de Google, no hace falta .env
ni credenciales. Las tools corren con owner libre (texto):
npm start # levanta el server por stdioModo HTTP (con login de Google Workspace)
Requiere credenciales de OAuth en GCP (ver más abajo). Llená en .env:
GOOGLE_WORKSPACE_CLIENT_ID=<client-id>
GOOGLE_WORKSPACE_CLIENT_SECRET=<client-secret>
JWT_SECRET=<openssl rand -hex 32>npm run start:http # levanta el server por HTTP en http://localhost:3030Store: git (default) o MongoDB
# Para usar MongoDB (multi-user, AWS-ready):
DECK_STORE=mongodb
OAUTH_STORE=mongodb
MONGODB_URI=mongodb://localhost:27017/bitacoraSi no seteás estas vars, el server usa git + SQLite (filesystem local).
Credenciales de Google (setup una sola vez)
Hay dos OAuth clients distintos en el mismo proyecto GCP:
1. OAuth client "Desktop app" — para deployar en Apps Script
Google Cloud Console → proyecto (nuevo o existente)
Habilitar Google Apps Script API (APIs & Services → Library)
Credentials → Create Credentials → OAuth client ID → Desktop app
Descargar JSON →
~/.bitacora-google/oauth-client.jsonCorrer el consent flow:
npm run build npm run google:authorizeAbre el navegador, pedí consent, cachea el refresh token en
~/.bitacora-google/token.json. Se refresca solo.
2. OAuth client "Web application" — para login de usuarios (modo HTTP)
En el mismo proyecto GCP → Credentials → Create Credentials → OAuth client ID
Tipo: Web application (no Desktop app — ese no tiene redirect URIs editables)
Authorized redirect URIs:
http://localhost:3030/auth/callbackAnotá Client ID y Client Secret → van en
.env:GOOGLE_WORKSPACE_CLIENT_ID=<este> GOOGLE_WORKSPACE_CLIENT_SECRET=<este>
Levantar MongoDB local (para modo MongoDB)
docker run -d --name bitacora-mongo -p 27017:27017 mongo:7MongoDB queda en mongodb://localhost:27017. Seteá en .env:
DECK_STORE=mongodb
OAUTH_STORE=mongodb
MONGODB_URI=mongodb://localhost:27017/bitacoraPruebas locales
Smoke test (sin credenciales de Google)
Corre las 18 tools end-to-end contra un cliente de Apps Script mockeado:
# Modo git (default)
npm run smoke
# Modo MongoDB
DECK_STORE=mongodb MONGODB_URI=mongodb://localhost:27017/bitacora-smoke npm run smokeLos 48 tests cubren: create → update → rollback → deploy → unpublish → list_deployments, diff, search, archive, validate, fragment update, y cargas chunked/from-file.
Probar con MCP Inspector
Levantá el server HTTP:
npm run build npm run start:httpEn otra terminal, abrí el Inspector:
npx @modelcontextprotocol/inspectorEn el Inspector: Add Server → Streamable HTTP → URL:
http://localhost:3030/mcpAl llamar una tool, se abre el navegador para login de Google Workspace. Logueate con tu cuenta
@bidcom.com.ar.Las tools van a usar tu email real como
ownerautomáticamente.
Probar con Claude Desktop
Configurá
claude_desktop_config.json(en~/Library/Application Support/Claude/en macOS):{ "mcpServers": { "bitacora-remote": { "url": "http://localhost:3030/mcp" } } }Reiniciá Claude Desktop (Cmd+Q y volver a abrir).
Pedile a Claude: "Mostrame las presentaciones que tengo" — debería disparar el flujo OAuth la primera vez y listar tus decks.
Sesión persistente: si ya te logueaste desde el Inspector, Claude Desktop reusa esa sesión (SQLite/MongoDB la persiste). Para forzar el flujo OAuth desde cero, borrá el store de sesiones:
rm ~/.bitacora-store/oauth.db(SQLite) o limpiá las coleccionesoauth_*en MongoDB.
Conectar a Claude Desktop (modo stdio, sin login)
Para uso local sin login de Google, stdio es más simple:
{
"mcpServers": {
"bitacora": {
"command": "node",
"args": ["/RUTA/ABSOLUTA/bitacora-mcp/dist/main.js"],
"env": {
"DECK_STORE_DIR": "/RUTA/ABSOLUTA/deck-store",
"DECK_STORE": "git"
}
}
}
}O con MongoDB:
{
"mcpServers": {
"bitacora": {
"command": "node",
"args": ["/RUTA/ABSOLUTA/bitacora-mcp/dist/main.js"],
"env": {
"DECK_STORE": "mongodb",
"MONGODB_URI": "mongodb://localhost:27017/bitacora"
}
}
}
}Tools (18)
Versionado (13)
Tool | Qué hace |
| Crea un deck y lo guarda versionado. Devuelve |
| Igual que |
| Agrega un chunk de HTML a una carga iniciada con |
| Nueva versión con HTML y/o metadata nuevos. Con |
| Igual que |
| HTML + metadata en HEAD o en un |
| Lista los decks, filtrable por |
| Historial de commits/versiones de un deck. |
| Vuelve a un |
| Búsqueda full-text sobre título, tags y contenido HTML. Devuelve matches con snippet y |
| Dif textual + visual HTML side-by-side entre dos versiones. Resuelve "¿qué cambió entre la versión que aprobó el director y la actual?". |
| Soft-delete no destructivo: marca el deck como archivado, lo saca de |
| Restaura un deck archivado. |
| Reporte estructurado pre-deploy: DOCTYPE, mixed content, |
Publicación (5)
Tool | Qué hace |
| Publica un |
| Devuelve el estado de publicación actual (commit, scriptId, deploymentId, url). |
| Historial completo de publicaciones por deck (incluye despublicadas), para auditoría. |
| Despublica: borra el deployment de Apps Script (la URL deja de servir), marca el registro con |
| Estado de publicación actual de un deck. |
Decks grandes
Dos problemas distintos, dos soluciones distintas:
1. El HTML ya existe como archivo en disco → create_from_file /
update_from_file. El server lo lee directo del filesystem, byte a byte. El
modelo nunca reproduce el contenido, así que no importa cuán grande sea ni
si tiene base64 embebido.
2. El HTML lo está generando el modelo y no entra en una sola tool call
→ create({partial: true}) + append por chunks. Recién en done: true se
normaliza y comitea, igual que un create de una sola llamada.
Arquitectura
src/
core/ # DeckService (normalize/escHtml), DeckValidateService
store/ # DeckStore interface + GitSpecStore | MongoDeckStore
auth/ # WorkspaceDomainGuard, SqliteOAuthStore, MongoOAuthStore
presentations/ # PresentationsService + Controller (13 tools), PendingUpload
deployer/ # AppsScriptClient (real/mock), SandboxTransform, DeployerService (5 tools)
shared-tools.module.ts # controllers + providers, importado por stdio y HTTP
app.module.ts # bootstrap stdio (sin auth)
http-app.module.ts # bootstrap HTTP (con OAuth de Workspace)
main.ts / main-http.ts # entry pointsDos modos de store, dos modos de auth:
Componente | Default (local) | MongoDB (multi-user/AWS) |
Decks |
|
|
OAuth sessions |
|
|
Switch via DECK_STORE y OAUTH_STORE env vars.
Notas de stack
@rekog/mcp-nestv2 — APIMcpStrategy+@McpController@rekog/mcp-nest-authv2 — servidor de autorización OAuth 2.1/MCP embebido (McpAuthModule+GoogleOAuthProvider)Node 22 con
--env-file=.envnativo (sindotenv)mongodbdriver oficial (sin Mongoose ni ODM)simple-gitpara el store git,better-sqlite3para el store de sesioneszodv4 para schemas de las toolsTypeScript 7.x,
module/moduleResolution:nodenext
Maintenance
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
FlicenseNot gradedqualityBmaintenanceMCP server that wraps the Slideless HTTP API as tools for listing, sharing, uploading, and managing HTML presentations from any MCP host without installing the CLI.- FlicenseNot gradedqualityAmaintenanceMCP server for generating slides from natural language, with interactive preview and export to PDF, PPTX, and Markdown.19
- AlicenseNot gradedqualityCmaintenanceProvides MCP server for Google Slides API, enabling creation, reading, modification, and management of Google Slides presentations using service account authentication.134GPL 3.0
- FlicenseNot gradedqualityBmaintenanceMCP server for building presentations (PDF/web) with a task-based async pipeline, enabling session management, project creation, presentation IR saving, git commits, building, and deployment.
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…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Bidcomsrl/bitacora-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server