@nicola5tor/openproject-timelog
@nicola5tor/openproject-timelog
MCP server (Model Context Protocol) para llevar una bitácora de horas local y sincronizarla con OpenProject (API v3). Registra tu trabajo en lenguaje natural desde Claude Desktop (u otro cliente MCP), revísalo, y súbelo a OpenProject cuando esté listo.
Transporte: stdio
Almacenamiento local:
~/.openproject-timelog/entries.jsonConfig: variables de entorno
OPENPROJECT_URLyOPENPROJECT_API_KEY
Instalación
No hace falta instalar nada de forma global: el servidor se ejecuta con npx.
# probarlo directamente
npx @nicola5tor/openproject-timelogO instalarlo en un proyecto:
npm install @nicola5tor/openproject-timelog
# o
pnpm add @nicola5tor/openproject-timelogRelated MCP server: OpenProject MCP Server
Configuración en Claude Desktop
Edita el fichero de configuración (claude_desktop_config.json) y añade el
servidor bajo mcpServers:
{
"mcpServers": {
"openproject-timelog": {
"command": "npx",
"args": ["-y", "@nicola5tor/openproject-timelog"],
"env": {
"OPENPROJECT_URL": "https://tu-openproject.example.com",
"OPENPROJECT_API_KEY": "TU_API_KEY"
}
}
}
}Reinicia Claude Desktop tras guardar.
Configuración en Claude Code
Es un MCP server estándar por stdio, así que funciona igual en Claude Code (la CLI). Regístralo a nivel usuario (disponible en todos tus proyectos) con:
claude mcp add openproject-timelog -s user \
-e OPENPROJECT_URL=https://tu-openproject.example.com \
-e OPENPROJECT_API_KEY=TU_API_KEY \
-- npx -y @nicola5tor/openproject-timelogAlternativa: editar directamente ~/.claude.json (a nivel usuario) o el
.mcp.json del proyecto (para que solo aplique ahí), con el mismo bloque
mcpServers que en Claude Desktop:
{
"mcpServers": {
"openproject-timelog": {
"command": "npx",
"args": ["-y", "@nicola5tor/openproject-timelog"],
"env": {
"OPENPROJECT_URL": "https://tu-openproject.example.com",
"OPENPROJECT_API_KEY": "TU_API_KEY"
}
}
}
}Cómo obtener tu API key de OpenProject
En OpenProject: Mi cuenta → Access tokens → API y genera una clave. El
servidor autentica con Basic auth usando el usuario literal apikey y tu clave
como contraseña.
Las tools solo locales (
log_entry,list_entries,edit_entry,assign_entry,delete_entry,clear_sent) funcionan aunque no configures OpenProject. Las tools de consulta y subida requierenOPENPROJECT_URLyOPENPROJECT_API_KEY.
Tools
Proyectos locales (workspaces)
Un proyecto local agrupa horas y define valores por defecto (proyecto de OpenProject, work package y actividad) que se aplican al registrar horas mientras esté activo. La lista de proyectos y cuál está activo viven en el mismo store compartido, así que Claude Code y Claude Desktop ven lo mismo.
Tool | Descripción |
| Crea un proyecto local. Params: |
| Lista los proyectos locales y marca el activo (distinto de |
| Activa un proyecto local. Param: |
| Borra un proyecto local. No borra sus entries: solo las desvincula. Param: |
Bitácora local
Tool | Descripción |
| Registra una entrada de horas. Params: |
| Lista entries por estado. Params: |
| Edita una entry pendiente. Params: |
| Asigna un work package a varias entries. Params: |
| Borra una entry pendiente. Param: |
| Elimina de la bitácora local todas las entries ya enviadas ( |
Consulta OpenProject
Tool | Descripción |
| Lista proyectos ( |
| Lista tareas. Params opcionales: |
| Lista actividades de time entry ( |
| Consulta horas ya registradas. Params opcionales: |
Sincronización
Tool | Descripción |
| Sube entries a OpenProject. Param opcional |
Vista visual
Tool | Descripción |
| Genera un HTML autocontenido (stats, filtros por grupo y tabla con columna de Actividad por nombre) con las entries y lo escribe en un fichero temporal. Params: |
* = requerido.
Estado compartido entre Claude Code y Claude Desktop
Ambos clientes ejecutan el mismo paquete y leen/escriben el mismo fichero
~/.openproject-timelog/entries.json. Por eso comparten automáticamente las
entries y los proyectos locales: creas o activas un proyecto en un cliente y el
otro lo ve. El fichero se escribe de forma atómica y las operaciones se
serializan, de modo que escrituras concurrentes no lo corrompen.
Notas de comportamiento
Proyecto activo:
log_entrytoma del proyecto local activo los campos que no indiques (projectId,workPackageId,activityId) y etiqueta la entry con ese proyecto. Cámbialo conproject_use.activityName(enlog_entryyedit_entry) resuelve el nombre tal como aparece en el dropdown de OpenProject (ej. "Especificación", "Pruebas") alactivityIdcorrespondiente, sin distinguir mayúsculas ni acentos. Si hay match exacto lo usa; si no, intenta coincidencia parcial. Si el nombre es ambiguo o no existe, la tool responde con la lista de actividades disponibles en vez de adivinar. Requiere OpenProject configurado y se ignora si ya se pasóactivityIdexplícito.Los ids locales son UUID v4. Las horas se guardan en decimal (
1.5= 1h30m) y se convierten a duración ISO 8601 (PT1H30M) al subir.El
projectIdde una entry, si no se indica, se deriva del work package al subir (una llamada extra a OpenProject).El fichero JSON se escribe de forma atómica (fichero temporal + rename) y las operaciones se serializan para evitar corrupción.
Los errores de red / credenciales / permisos se devuelven como mensajes legibles en la respuesta de la tool, sin tumbar el servidor.
Ejemplos de uso conversacional
Tú: Registra 2 horas de hoy arreglando el login, tarea 1234. Claude: (llama a
log_entrycon description="arreglar login", hours=2, workPackageId=1234)
Tú: Apúntame 45 minutos de reunión, ya le pongo la tarea luego. Claude: (
log_entrydescription="reunión", hours=0.75) — queda pendiente de asignar.
Tú: ¿Qué tengo pendiente de subir? Claude: (
list_entriesstatus="pending")
Tú: Esas dos reuniones ponles la tarea 1234. Claude: (
assign_entryentryIds=[...], workPackageId=1234)
Tú: ¿Qué actividades hay? Ponle "Development" a todo y súbelo. Claude: (
get_activities→edit_entry/assignpara activityId →upload_entries)
Tú: Limpia lo que ya se subió. Claude: (
clear_sent)
Tú: Muéstrame la bitácora como galería, agrupada por tarea. Claude: (
render_gallerygroupBy="workPackageId" → publica el HTML resultante como Artifact)
Desarrollo
npm install # instala deps y compila (prepare -> build)
npm run build # compila TypeScript a dist/
npm start # ejecuta dist/index.jsEstructura:
openproject-timelog/
├── src/
│ ├── index.ts # entry point, setup MCP y registro de tools
│ ├── store.ts # CRUD bitácora local (JSON atómico)
│ ├── openproject.ts # cliente API OpenProject v3
│ ├── gallery.ts # generador de HTML de galería (render_gallery)
│ └── types.ts # interfaces/types
├── package.json
├── tsconfig.json
└── README.mdLicencia
MIT
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
- AlicenseAqualityCmaintenanceAn MCP server for Productive.io that enables users to log time, inspect projects, and manage time entries using natural language commands. It features fuzzy project matching, local caching, and remembers default services per project for streamlined time tracking.14MIT
- FlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for integrating with OpenProject API, enabling AI assistants to manage projects, work packages, time tracking, and users.12
- FlicenseNot gradedqualityBmaintenanceAn MCP server that enables AI assistants to interact with OpenProject, listing projects and work packages and managing resources through natural language.
- FlicenseNot gradedqualityDmaintenanceAn MCP server that connects Claude Desktop to your OpenProject instance, allowing you to manage projects, tasks, and time entries through natural language.
Related MCP Connectors
MCP server for generating rough-draft project plans from natural-language prompts.
A MCP server built for developers enabling Git based project management with project and personal…
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
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/NicoLa5Tor/openMcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server