mcp-time-tracker

Registra horas contra proyectos con temporizadores de inicio/parada, totales diarios y exportación de hojas de tiempo, todo desde Claude o cualquier cliente MCP.

Documentación

Registra tiempo desde Claude con un servidor gratuito y sin instalación

Servidor MCP para registro de tiempo: hojas de horas, una hoja de horas y un rastreador de horas facturables. Registra tiempo facturable sin salir del chat.

Funciona con Claude Desktop, Claude Code, Cursor y cualquier cliente del Protocolo de Contexto de Modelos. Se ejecuta en tu propia máquina, o alojado sin instalación.

Página del producto: https://mcp.zovo.one/s/time-tracker — qué hace, las herramientas que expone y un endpoint de token en vivo.

Instalación

Alojado, nada que instalar. Obtén un token de https://mcp.zovo.one/mcp/connect (la página de conexión) o https://mcp.zovo.one/mcp/token (el mismo token como JSON); se emite uno anónimo gratuito al instante y una clave Pro funciona de la misma manera. Luego apunta un cliente MCP a https://mcp.zovo.one/mcp/time-tracker a través de streamable-http y envía el token como Authorization: Bearer <token>.

Si tu cliente no puede configurar encabezados, coloca el token en la ruta en su lugar: https://mcp.zovo.one/mcp/time-tracker/t/<token>. Ambas formas funcionan. La URL desnuda sin token responde 401 en tools/call, por lo que el token no es opcional.

Claude Desktop, un clic. Descarga time-tracker.mcpb desde la última versión y haz doble clic en él.

Desde el código fuente. El espejo es autónomo: cada dependencia de @theluckystrike/* está incluida, por lo que una clonación nueva se compila sin configuración adicional.

git clone https://github.com/theluckystrike/mcp-time-tracker.git
cd mcp-time-tracker
npm install && npm run build

Luego apunta tu cliente al punto de entrada compilado:

{
  "mcpServers": {
    "time-tracker": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-time-tracker/dist/index.js"]
    }
  }
}

@theluckystrike/mcp-time-tracker aún no está publicado en npm, por lo que un comando npx -y @theluckystrike/mcp-time-tracker fallará. Las tres rutas anteriores son las que funcionan y cada una es probada por CI.

time-tracker demo

Espejo de solo lectura de mcp-servers/servers/time-tracker. Consulta MIRROR.md.

Destacado en Awesome MCP Servers — listado de directorio | endpoint alojado en vivo, nivel gratuito, sin registro.

Registra tiempo facturable sin salir de tu chat de IA. Di "inicia un temporizador en el rediseño de acme", sigue trabajando, luego pide "mis horas de esta semana por proyecto" o "líneas de factura para acme en agosto". Mantiene un temporizador en ejecución, te permite registrar tiempo que olvidaste rastrear, aplica tu tarifa por hora por proyecto y convierte el resultado en un informe, un archivo CSV o un conjunto de partidas de factura. Todo se almacena como JSON simple en tu propia máquina.

Creado por theluckystrike.

En el Registro oficial de MCP (io.github.theluckystrike/time-tracker-timesheet-billable-hours).

Listado en el Índice de Productos de IA — endpoint remoto en vivo en mcp.zovo.one/s/time-tracker, nivel gratuito, sin registro.

Registra tiempo facturable desde el chat y conviértelo directamente en un informe o partidas de factura, sin configuración, todo local.

Instalación en 60 segundos

La publicación en npm para @theluckystrike/mcp-time-tracker está pendiente. Hasta entonces, el paquete de un clic .mcpb o una clonación + compilación es la ruta que funciona, ambas verificadas a continuación.

Un clic (.mcpb): descarga time-tracker.mcpb desde la última versión y haz doble clic en él en Claude Desktop: https://github.com/theluckystrike/mcp-servers/releases/latest

(claude_desktop_config.json):

{
  "mcpServers": {
    "time-tracker": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-time-tracker"]
    }
  }
}

Claude Code:

claude mcp add time-tracker -- npx -y @theluckystrike/mcp-time-tracker

(.cursor/mcp.json):

{
  "mcpServers": {
    "time-tracker": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-time-tracker"]
    }
  }
}

La forma npx anterior comienza a funcionar en el momento en que se publica el paquete. Hasta entonces, usa el paquete .mcpb anterior, o compila desde el código fuente con exactamente estos tres comandos:

git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-servers
npm install
npm run build -w packages/mcp-license -w servers/time-tracker

Luego apunta el command de tu cliente a node con un argumento: la ruta absoluta a servers/time-tracker/dist/index.js.

Para ejecutar en modo Pro, configura MCP_LICENSE_KEY en el mismo bloque de configuración, o llama a license_activate una vez con tu clave.

Herramientas

HerramientaQué hace
timer_startInicia un temporizador en un proyecto (tarea opcional, etiquetas, tarifa, moneda). Iniciar uno nuevo detiene y registra el anterior. Un nombre de proyecto parcial que coincide exactamente con un proyecto existente se usa como ese proyecto.
timer_stopDetiene el temporizador en ejecución, escribe la entrada y devuelve la duración.
timer_statusQué está en ejecución, por cuánto tiempo y el total de hoy.
entry_addRegistra tiempo que ya trabajaste (inicio más fin o minutos), con una tarifa y moneda opcionales: la tarifa "90 euros por hora" factura como EUR 225.00 por 2.5 h. Los nombres de proyecto parciales se resuelven como timer_start.
entry_listTabla compacta de entradas, filtrada por rango de fechas y proyecto.
entry_editCambia cualquier campo de una entrada.
entry_deleteElimina una entrada por id.
project_set_rateEstablece la tarifa por hora y la moneda utilizadas para los totales monetarios (la moneda acepta códigos o palabras: EUR, euros, libras, zl). apply_to_existing: true vuelve a tarificar el tiempo ya registrado para ese proyecto; agrega only_missing: true para tocar solo las entradas que no llevan tarifa.
reportHoras y dinero para un período, opcionalmente agrupado por proyecto, día, tarea o etiqueta; omite group_by para el total simple por moneda. Tabla, JSON o CSV. Las horas ya facturadas se omiten; pasa unbilled_only: false para la hoja de horas completa.
export_csvEscribe entradas en un archivo CSV y devuelve la ruta.
invoice_summaryPartidas listas para factura de un proyecto: horas, tarifa, monto, total, en la moneda en que se registró el tiempo. Una línea por tarea y tarifa, para que ninguna línea muestre una tarifa combinada que nadie acordó. Devuelve el entry_ids detrás de las líneas y omite las horas ya facturadas (unbilled_only: false las incluye). Gratis para los últimos 7 días, Pro para cualquier período del historial completo.
entry_mark_billedSella las horas que se incluyeron en una factura con su número (ids de invoice_summary, o project + from + to), para que report y invoice_summary dejen de ofrecerlas y las mismas horas nunca se facturen dos veces.
license_statusGratis o Pro, y dónde actualizar.
license_activateActiva una clave Pro (verificada sin conexión).

También se exponen: el recurso timetracker://today (resumen de hoy) y el prompt daily_standup (escribe una actualización de standup a partir del tiempo registrado de ayer y hoy).

Lo que puedes decir

No se requieren nombres de herramientas. Estas son las frases que realmente se probaron contra el servidor; la columna de herramienta es la que las respondió.

Tú dicesHerramienta
"Inicia un temporizador para el proyecto del sitio web de Acme."timer_start
"Detén el temporizador y dime cuánto tiempo trabajé."timer_stop
"¿Qué está en ejecución ahora mismo y por cuánto tiempo?"timer_status
"Registra 2.5 horas ayer para Acme, revisión de diseño, a 90 euros por hora."entry_add
"Muéstrame mis entradas de Acme de esta semana."entry_list
"Esa última entrada debería decir refactorización de API, no revisión de diseño."entry_edit
"Elimina la entrada que acabo de registrar dos veces."entry_delete
"Establece mi tarifa para Acme en 90 EUR por hora."project_set_rate
"¿Cuántas horas facturé este mes, agrupadas por proyecto?"report
"Dame las líneas de factura para Acme en agosto."invoice_summary
"Facturé esas horas como INV-2026-0001."entry_mark_billed

Dos más que vale la pena conocer: "exporta mi tiempo a un CSV para mi contable" (export_csv) y "escribe mi actualización de standup de ayer y hoy" (el prompt daily_standup).

Ejemplo práctico

Esta es una transcripción real de la auditoría en docs/USER_VALUE_R2.md, números sin cambios.

You: Log 2.5 hours yesterday for Acme, design review, at 90 euros an hour.

  entry_add { project: "Acme", ... }
  -> "Acme" resolved to the existing project "Acme website"
  -> rate "90 euros an hour" parsed as EUR 90.00/h

Assistant: Logged 2.50 h for Acme website - design review at EUR 90.00/h = EUR 225.00.

You: How much do I bill Acme this week? Give me invoice lines.

  invoice_summary { project: "Acme website", from: "2026-08-31", to: "2026-09-02" }

Assistant: Invoice summary - Acme website
  design review    2.50 h   EUR 90.00/h   EUR 225.00
  TOTAL            2.50 h                 EUR 225.00

Una llamada cada uno. La tarifa lleva su moneda hasta el final: el informe nunca imprime un "225" desnudo, y nunca se convierte en "$225" por accidente.

Un segundo ejemplo práctico, el informe semanal y el prompt daily_standup:

You: How many hours did I put into Acme this week, grouped by task?

  report { project: "Acme website", from: "2026-08-27", to: "2026-09-02", group_by: "task" }

Assistant: Acme website, 2026-08-27 to 2026-09-02
  design review   2.50 h   EUR 225.00
  TOTAL           2.50 h   EUR 225.00

You: Write my standup update.

  (prompt) daily_standup

Assistant: Yesterday: 2.50 h on Acme website (design review).
Today: nothing logged yet.

Cierre de horas facturadas

Una hora que ha sido facturada está terminada. entry_mark_billed {ids, invoice_number} escribe billed_at y billed_invoice en esas entradas; a partir de entonces report y invoice_summary las omiten por defecto, para que el "facturar Acme" del próximo mes no pueda volver a facturar trabajo ya pagado. La hoja de horas completa sigue ahí: pasa unbilled_only: false a cualquiera de ellas. invoice_summary devuelve el entry_ids que usó precisamente para que puedan entregarse directamente a entry_mark_billed una vez que exista la factura.

report y invoice_summary responden preguntas superpuestas a propósito: report es para "cuánto tiempo y dinero", agrupado como quieras; invoice_summary es para "dame las líneas que puedo poner en una factura", que es una vista más estrecha, con forma de factura, de las mismas entradas para un proyecto.

Cómo almacena datos

Las entradas, proyectos y tarifas viven en un solo archivo JSON: ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/time-tracker/data.json.

Cada escritura (iniciar o detener un temporizador, agregar, editar o eliminar una entrada, establecer una tarifa) ocurre bajo un archivo de bloqueo de asesoría en .../time-tracker/.lock, mantenido durante todo el ciclo de carga-mutación-guardado, por lo que dos llamadas superpuestas no pueden intercalarse y corromper el archivo. El guardado en sí escribe en un archivo temporal y lo renombra en su lugar, por lo que un bloqueo o un proceso eliminado a mitad de escritura deja el archivo anterior o el nuevo, nunca uno a medio escribir. Las lecturas (entry_list, report, timer_status, export_csv) no toman el bloqueo.

Para respaldar tus datos, copia el único archivo data.json (y .lock si está presente, aunque no contiene datos). No hay base de datos ni un segundo archivo oculto.

Si data.json alguna vez es ilegible o no es JSON válido, el servidor no lo trata como "aún no hay datos". Mueve el archivo a un lado byte por byte como data.json.corrupt-<timestamp>, escribe un marcador data.json.corrupt y hace que cada herramienta, incluidas las lecturas, devuelva data file is corrupt; moved to ...; nothing was written. Restore a good data.json (la copia en cuarentena está justo ahí) y elimina el archivo de marcador para continuar. Nada se sobrescribe mientras tanto.

Fechas, horas y tarifas

  • Las marcas de tiempo sin desplazamiento son tu hora local. 2026-09-02T09:00:00 significa 09:00 donde estás, no UTC. Pasa un desplazamiento explícito (2026-09-02T09:00:00+02:00) o un Z final y se respeta exactamente.
  • Los límites de solo fecha cubren días locales completos. from: "2026-09-01" es 00:00:00 local del día 1 y to: "2026-09-30" es 23:59:59.999 local del día 30, por lo que un mes informado por fechas incluye su último día. Las marcas de tiempo con hora se usan tal como se dan.
  • Las entradas se recortan a la ventana. Una entrada que comienza antes de from o termina después de to cuenta por la parte dentro del período, no toda ni ninguna.
  • Las entradas se dividen en la medianoche local para la agrupación por día. El trabajo de 23:30 a 01:30 es 0.5 h en el primer día y 1.5 h en el siguiente, incluso a través de un límite de mes. timer_status cuenta solo la parte de una entrada, o del temporizador en ejecución, que cae después de la medianoche de hoy.
  • Las cadenas de tarifa se analizan, nunca se adivinan. "1,200 USD" es 1200 (una coma seguida de exactamente tres dígitos es agrupación de miles), "12,50 EUR" es 12.50 (la forma decimal europea inequívoca), y "1.200,50" es 1200.50. Cualquier cosa que podría significar cualquiera de las dos cosas, como "1,2345", se rechaza con un ejemplo práctico en lugar de leerse como el número incorrecto.
  • Las tarifas se capturan cuando se registra el tiempo. entry_add y timer_stop almacenan la tarifa por hora efectiva y la moneda en la entrada, y los informes y facturas usan esa tarifa almacenada. project_set_rate por lo tanto se aplica solo a entradas futuras; pasa apply_to_existing: true para volver a tarificar el tiempo ya registrado para ese proyecto. Eso vuelve a sellar CADA entrada del proyecto, incluidas las entradas que ya llevan una tarifa, y la respuesta dice cuántas cambiaron y el nuevo total del proyecto. Agrega only_missing: true para tocar solo las entradas que no capturaron tarifa propia.
  • Las filas de etiquetas se superponen. En group_by: "tag" una entrada etiquetada dev y meeting aparece en ambas filas; el total se calcula a partir de las entradas una vez, por lo que nunca es la suma de las filas.

Límites y advertencias honestas

  • Los usuarios gratuitos entry_list, report, export_csv y invoice_summary solo ven los últimos 7 días. Los temporizadores y las entradas en sí son ilimitados y nada se elimina nunca; la ventana solo reduce lo que una llamada gratuita puede leer.
  • El nivel gratuito admite tarifas por hora en 2 proyectos; un tercer proyecto con tarifa requiere Pro.
  • Cada agrupación de report es gratuita, incluida la etiqueta: el total de la etiqueta es una corrección de precisión, no una función premium. group_by en sí es opcional; omítelo para el total simple por moneda.
  • Solo puede ejecutarse un temporizador a la vez. Iniciar un segundo detiene y registra el primero; no existe un modo de temporizador concurrente.
  • No hay recordatorios ni detección de inactividad: si olvidas detener un temporizador, seguirá ejecutándose hasta que lo detengas o inicies otro.

Solución de problemas

  • npx se cuelga o no encuentra el paquete: la publicación npm de este paquete está pendiente. Usa el paquete .mcpb o la ruta de clonar y compilar anterior hasta que esté disponible.
  • Uso del paquete .mcpb: se instala directamente en Claude Desktop; no hay una ruta separada para configurarlo.
  • Uso de la ruta de clonación: el binario del servidor es servers/time-tracker/dist/index.js después de npm run build. Apunta el command de tu cliente a node con esa ruta absoluta como único argumento.
  • Versión de Node: requiere Node >= 18. Verifica con node -v.
  • No aparece nada / fallos silenciosos: este servidor escribe registros solo en stderr, nunca en stdout (stdout está reservado para el protocolo MCP). En Claude Desktop, revisa Configuración -> Desarrollador -> el archivo de registro del servidor; en Claude Code, ejecuta con --mcp-debug o revisa la terminal desde la que lo iniciaste.
  • Una clave Pro no se reconoce: ejecuta license_status para ver qué nivel cree el servidor que tienes y confirma que MCP_LICENSE_KEY está configurado en el mismo proceso que lanza el cliente (no solo en tu shell).

Privacidad

Todos los datos permanecen locales: las entradas viven en ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/time-tracker/data.json. El servidor no realiza solicitudes de red, no tiene telemetría y no necesita cuenta. Las claves de licencia son firmas Ed25519 verificadas sin conexión contra una clave pública compilada en el paquete; la activación funciona sin conexión a internet.

Se combina con

Preguntas frecuentes

Sí. Los tres hablan MCP sobre stdio con la misma forma de configuración; las herramientas y el archivo de datos son idénticos independientemente del cliente.

Nada se elimina. La entrada permanece en data.json para siempre; solo que no aparecerá en los resultados de entry_list, report, export_csv o invoice_summary hasta que actives Pro, que abre el historial completo.

Sí. La moneda se establece por proyecto (o por entrada, anulando el valor predeterminado del proyecto) y cada total se agrupa por moneda; un informe nunca suma EUR y USD juntos.

El servidor no bloquea superposiciones; registra lo que le indicas. entry_edit te permite corregir un error después del hecho.

No. No hay llamadas de red en ningún lugar de este servidor, incluida la activación de licencias, que se verifica con una clave pública local.

Licencia

MIT

Un perfil de negocio para toda la suite

Tu identidad se almacena una vez, en ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/profile/business.json, y cada servidor de la suite la lee: el emisor de facturas, el membrete de docx, el emisor recurrente, la tasa de IVA predeterminada de expense-tracker, la zona horaria predeterminada de time-tracker y timezone, y los membretes de currículum y contrato. Configúrala una vez con business_set (invoice o docx): nunca la repites en ningún otro lugar. Una dirección de correo electrónico solo se toma de ese perfil o de un argumento explícito; cuando no hay ninguna almacenada, los documentos muestran [add: email] y la herramienta lo indica en lugar de permitir que alguien improvise una dirección.

Preguntas frecuentes

¿Existe un servidor gratuito de seguimiento de tiempo MCP?

Sí. El servidor de seguimiento de tiempo en mcp.zovo.one es un servidor gratuito de seguimiento de tiempo MCP sin instalación: inicia y detén temporizadores en el chat, mantén totales por cliente y genera informes semanales. A diferencia de los rastreadores SaaS (WebWork, TrackingTime), no necesita cuenta: pega la URL alojada y listo.

¿Cómo hago seguimiento de tiempo desde Claude?

Conecta https://mcp.zovo.one/mcp/time-tracker (URL tokenizada de mcp.zovo.one/mcp/connect) y di: "Inicia un temporizador para el proyecto Acme". Detenlo más tarde de la misma manera; los resúmenes semanales están a una sola petición de distancia.

Usa estos documentos como un servidor MCP

Cualquier cliente MCP (Claude, Cursor, Windsurf, VS Code) puede leer la documentación de este repositorio directamente a través de GitMCP, sin instalación: