timesheet-mcp
Click on "Deploy 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., "@timesheet-mcpCan you log my hours for today and export the monthly Excel timesheet?"
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.
Timesheet MCP (PRIS)
Servidor MCP (Model Context Protocol) en Python que mantiene el control
horario del profesional en un archivo JSON editable entre sesiones y, al
pedirlo, renderiza un .xlsx respetando la plantilla
Timesheet Modelo Mayo 2025 PRIS.xlsx (logo, merges, formulas).
v0.3 — multi-mes: cada entrada vive por su fecha ISO en state.days.
No hay operacion que borre data de otro mes: registrar una entrada nueva
siempre coexiste con lo anterior, sin importar el mes o anio.
Stack
Python 3.11+
openpyxl3.1+mcp[cli]1.0+pydantic2.6+
Related MCP server: timesheet-data
Estructura
timesheet/
models.py # pydantic: Professional, Supervisor, DayItem, Day, State
state.py # load_state, save_state, mutadores puros (multi-mes)
dates.py # trackable_days, months_present, today_month
renderer.py # render(state, year, month, template, out) + plan B de imagen
template/ # copia inmutable de la plantilla PRIS
data/ # state.json (se crea al primer arranque)
exports/ # salida de export_to_excel
tests/ # smoke test (casos del spec + extras de borde, multi-mes)
server.py # entrypoint MCP stdio, 12 toolsSetup (Windows)
# 1. Instalar Python 3.11+ desde python.org (marca "Add to PATH")
# 2. Desde la raiz del proyecto:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e .
# 3. Verificar que la plantilla este copiada en template/
# 4. Smoke test:
python tests/smoke_test.pyRegistro en cliente MCP
OpenCode (recomendado — ya configurado en este proyecto)
El MCP timesheet ya esta registrado globalmente en
%USERPROFILE%\.config\opencode\opencode.jsonc:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"timesheet": {
"type": "local",
"command": [
"C:\\proyectos\\timesheet\\.venv\\Scripts\\python.exe",
"C:\\proyectos\\timesheet\\server.py"
],
"cwd": "C:\\proyectos\\timesheet",
"enabled": true,
"timeout": 15000
}
}
}Disponible en cualquier sesion de opencode (en cualquier directorio de trabajo) con solo mencionarlo en el prompt, p.ej.:
use timesheet para cargar las horas de hoy y exportar el excel del mesVerificacion:
opencode mcp list
# -> ✓ timesheet connectedClaude Desktop
%APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"timesheet": {
"command": "C:\\proyectos\\timesheet\\.venv\\Scripts\\python.exe",
"args": ["C:\\proyectos\\timesheet\\server.py"]
}
}
}Tools (12)
# | Tool | Proposito |
1 |
| Estado completo + |
2 |
| Editar nombre, especialidad o tarifa (nunca borra entradas) |
3 |
| Editar nombre y fecha del supervisor |
4 |
| Editar |
5 |
| Upsert de un item por descripcion (auto-default 8h) |
6 |
| Reemplazar la lista completa del dia |
7 |
| Borrar el primer item que matchee |
8 |
| Borrar el dia completo (items + entry/exit) |
9 |
| Mover un item por |
10 |
| Totales calculados (sin escribir) |
11 |
| Renderizar el .xlsx del mes pedido |
12 |
| Meses con datos + mes actual del sistema |
Modelo multi-mes
Cada entrada se guarda con su fecha ISO. No existe "mes activo":
agregar entradas en meses distintos no se pisa. Las herramientas que
necesitan saber "que mes miramos" aceptan year y month opcionales;
si no los pasas, usan el mes actual del sistema.
# Agregar entrada en cualquier fecha (multiples meses conviven)
set_day_item(date="2026-08-15", description="RDM-X", hours=8)
set_day_item(date="2026-09-20", description="RDM-Y", hours=8)
# Ver que meses tienen datos
list_months() # -> [{year:2026, month:8, day_count:1}, {year:2026, month:9, day_count:1}]
# Ver el mes actual del sistema (hoy)
get_timesheet()
# Ver un mes especifico
get_timesheet(year=2026, month=8)
# Exportar un mes especifico (requerido; warning si no hay data)
export_to_excel(year=2026, month=8, path="exports/agosto.xlsx")set_professional_info ya no acepta year/month (no tendria
sentido: nada cambia entre meses). Cambiar nombre, especialidad o
tarifa NUNCA borra ni altera entradas existentes.
Export: solo dias con entradas
El .xlsx muestra unicamente los dias que tienen al menos un item.
Si un mes tiene 21 dias con entradas de 31 posibles, el Excel muestra
solo esas 21 filas con fechas no consecutivas; las demas filas del
template quedan vacias (se limpian explicitamente para que no aparezca
contenido residual del mes anterior que la plantilla trae pre-cargado).
El layout se calcula desde n (cantidad de dias con entradas):
fila 10..10+n-1 -> dias con entradas (en orden cronologico)
fila n+15 -> totales (F)
fila n+16 -> tarifa (F)
fila n+17 -> monto (F)
fila n+21 -> firma + ultimo dia (A/E)
fila n+25 -> supervisor (A/E)last_day en la respuesta y en el Excel es la fecha del ultimo dia con
entradas, no el ultimo dia del mes calendario.
Notas
Recalculo de formulas al abrir: el servidor setea
wb.calculation.fullCalcOnLoad = Truepara que Excel/LibreOffice recalcule automaticamente. Si no se ve el total actualizado al abrir el archivo, presioneF9oCtrl+Alt+F9.Paginas multiples: el archivo exportado puede ocupar 1 o 2 paginas impresas dependiendo de cuantos dias con entradas haya. La impresion usa
fitToPage=truedel template.Imagen del logo: openpyxl generalmente la preserva. Como salvaguarda el renderer aplica un Plan B con
zipfiletras elsave, copiandoxl/media/yxl/drawings/_rels/*.relsdesde la plantilla original si hace falta. Si la imagen sigue sin aparecer, verifique la consola para elwarningde respuesta.Encoding: el JSON se persiste en UTF-8 con
ensure_ascii=False, preservando acentos y tildes (ej: "Raúl").Persistencia atomica: cada mutacion escribe a
state.json.tmpy luego haceos.replace. No haystate.jsonhuerfano a medio escribir.Migracion automatica v0.2 -> v0.3: si al cargar
data/state.jsonse detectan los campos legacyyear/month, se descartan silenciosamente y el archivo se reescribe sin ellos. Los dias enstate.daysse conservan intactos.
This server cannot be deployed
Maintenance
Related MCP Connectors
timesheet.io MCP server - manage timers, projects, tasks and reports
- MOCOOAuthcom.mocoapp.api
MCP server for MOCO business software: time tracking, projects, budgets, and invoicing via API
1 - mcp-serverOAuthio.klokin
MCP server exposing klokin time-tracking operations (employees, time entries, stores) to AI clients.
MCP server for lacita - appointment management software
Related MCP Servers
- FlicenseAqualityDmaintenanceAn MCP server that wraps the TimePRO API, enabling AI assistants to automatically create, view, and manage timesheets for authenticated users. It provides tools for searching clients and projects, retrieving configuration defaults, and performing full CRUD operations on timesheet entries.10-
- FlicenseNot gradedqualityDmaintenanceMCP server for querying work checkpoints and storing finalized timesheet reports in SQLite.-
- FlicenseAqualityDmaintenanceMCP server providing CRUD operations for timesheet management via REST API endpoints, enabling creation, reading, updating, and deletion of timesheet entries along with project management.9-
- AlicenseBqualityDmaintenanceMCP server for Clockify time tracking, enabling CRUD operations on workspaces, projects, tasks, clients, tags, users, and time entries.36MIT