ActivityWatch MCP Server
Un servidor MCP para ActivityWatch que permite la interacción con tus datos personales de seguimiento de tiempo.
Documentación
Servidor MCP de ActivityWatch
Un servidor del Protocolo de Contexto de Modelos (MCP) que se conecta a ActivityWatch, permitiendo que LLMs como Claude interactúen con tus datos de seguimiento de tiempo.
Características
- Listar Buckets: Ver todos los buckets disponibles de ActivityWatch
- Ejecutar Consultas: Ejecutar potentes consultas AQL (Lenguaje de Consulta de ActivityWatch)
- Obtener Eventos Crudos: Recuperar eventos directamente de cualquier bucket
- Obtener Configuración: Acceder a los ajustes de configuración de ActivityWatch
Instalación
Puedes instalar el servidor MCP de ActivityWatch desde npm o compilándolo tú mismo.
Instalación desde npm (próximamente)
# Global installation
npm install -g activitywatch-mcp-server
# Or install locally
npm install activitywatch-mcp-server
Compilación desde el Código Fuente
-
Clona este repositorio:
git clone https://github.com/8bitgentleman/activitywatch-mcp-server.git cd activitywatch-mcp-server -
Instala las dependencias:
npm install -
Compila el proyecto:
npm run build
Requisitos Previos
- ActivityWatch instalado y en ejecución
- Node.js (v14 o superior)
- Claude para Desktop (o cualquier otro cliente MCP)
Uso
Uso con Claude para Desktop
-
Abre tu archivo de configuración de Claude para Desktop:
- Windows:
%APPDATA%\Claude\claude_desktop_config.json - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:
-
Añade la configuración del servidor MCP:
{ "mcpServers": { "activitywatch": { "command": "activitywatch-mcp-server", "args": [] } } }Si compilaste desde el código fuente, usa:
{ "mcpServers": { "activitywatch": { "command": "node", "args": ["/path/to/activitywatch-mcp-server/dist/index.js"] } } } -
Reinicia Claude para Desktop
-
Busca el icono de MCP en la interfaz de Claude para confirmar que funciona
Uso de un contenedor podman sin root en Linux con Gemini CLI
Asegúrate de compilar la imagen primero con:
version=$(npm pkg get version | tr -d '"')
podman build . -t activitywatch-mcp-server:${version}
Este ejemplo usa la anulación para que Activity Watch no esté disponible en
127.0.0.1 (ver la siguiente sección). Si no es necesario, puedes omitir la variable de entorno AW_API_BASE.
{
"mcpServers": {
"activitywatch-mcp-server": {
"command": "/usr/bin/podman",
"args": [
"run",
"--rm",
"--interactive",
"--userns=keep-id",
"-e",
"AW_API_BASE",
"localhost/activitywatch-mcp-server:1.2.1"
],
"env": {
"AW_API_BASE": "http://mydesktop.local:5600/api/0"
}
}
}
}
Anular el host/puerto del servidor de ActivityWatch
Si quieres ejecutar este servidor MCP desde dentro del Subsistema de Windows para Linux,
por ejemplo dentro de un contenedor, el servidor AW que se ejecuta en Windows no estará
disponible en 127.0.0.1. Para anular la conexión estándar de localhost, usa la
variable de entorno AW_API_BASE o la bandera --aw-api-base, como se muestra a continuación:
# Using environment variable
export AW_API_BASE=http://mydesktop.local:5600/api/0
node dist/index.js
# Or using command-line flag
node dist/index.js --aw-api-base=http://mydesktop.local:5600/api/0
NOTA: El servidor AW puede ser exigente con el nombre usado para conectarse a él, pero
aceptará un nombre que coincida con el nombre del equipo donde se ejecuta con un
sufijo .local.
Ejemplos de Consultas
Aquí hay algunos ejemplos de consultas que puedes probar en Claude:
- Listar todos tus buckets: "¿Qué buckets de ActivityWatch tengo?"
- Obtener resumen de uso de aplicaciones: "¿Puedes mostrarme qué aplicaciones he usado más hoy?"
- Ver historial de navegación: "¿En qué sitios web he pasado más tiempo hoy?"
- Comprobar productividad: "¿Cuánto tiempo he pasado en aplicaciones de productividad hoy?"
- Ver configuración: "¿Cuáles son mis ajustes de ActivityWatch?" o "¿Puedes comprobar un ajuste específico en ActivityWatch?"
Herramientas Disponibles
list-buckets
Lista todos los buckets disponibles de ActivityWatch con filtrado opcional por tipo.
Parámetros:
type(opcional): Filtrar buckets por tipo (por ejemplo, "window", "web", "afk")includeData(opcional): Incluir datos del bucket en la respuesta
run-query
Ejecuta una consulta en el lenguaje de consulta de ActivityWatch (AQL).
Parámetros:
timeperiods: Período(s) de tiempo a consultar formateados como un array de cadenas. Para rangos de fechas, usa el formato:["2024-10-28/2024-10-29"]query: Array de declaraciones de consulta en el Lenguaje de Consulta de ActivityWatch, donde cada elemento es una consulta completa con declaraciones separadas por punto y comaname(opcional): Nombre para la consulta (usado para caché)
IMPORTANTE: Cada cadena de consulta debe contener una consulta completa con múltiples declaraciones separadas por punto y coma.
Ejemplo de formato de solicitud:
{
"timeperiods": ["2024-10-28/2024-10-29"],
"query": ["events = query_bucket('aw-watcher-window_UNI-qUxy6XHnLkk'); RETURN = events;"]
}
Ten en cuenta que:
timeperiodsdebe tener rangos de fechas preformateados con barras- Cada elemento en el array
queryes una consulta completa con todas las declaraciones
get-events
Obtiene eventos crudos de un bucket de ActivityWatch.
Parámetros:
bucketId: ID del bucket del que obtener eventosstart(opcional): Fecha/hora de inicio en formato ISOend(opcional): Fecha/hora de fin en formato ISOlimit(opcional): Número máximo de eventos a devolver
get-settings
Obtiene los ajustes de ActivityWatch del servidor.
Parámetros:
key(opcional): Obtener una clave de ajuste específica en lugar de todos los ajustes
Ejemplos de Lenguaje de Consulta
ActivityWatch usa un lenguaje de consulta simple. Aquí hay algunos patrones comunes:
// Get window events
window_events = query_bucket(find_bucket("aw-watcher-window_"));
RETURN = window_events;
// Get only when not AFK
afk_events = query_bucket(find_bucket("aw-watcher-afk_"));
not_afk = filter_keyvals(afk_events, "status", ["not-afk"]);
window_events = filter_period_intersect(window_events, not_afk);
RETURN = window_events;
// Group by app
window_events = query_bucket(find_bucket("aw-watcher-window_"));
events_by_app = merge_events_by_keys(window_events, ["app"]);
RETURN = sort_by_duration(events_by_app);
// Filter by app name
window_events = query_bucket(find_bucket("aw-watcher-window_"));
code_events = filter_keyvals(window_events, "app", ["Code"]);
RETURN = code_events;
Configuración
El servidor se conecta a la API de ActivityWatch en http://localhost:5600 por
defecto. Si tu instancia de ActivityWatch se ejecuta en un host o puerto diferente,
puedes anularlo como se describe en la sección Anular el host/puerto del servidor de ActivityWatch
anterior.
Solución de Problemas
ActivityWatch No Está en Ejecución
Si ActivityWatch no está en ejecución, el servidor mostrará errores de conexión. Asegúrate
de que ActivityWatch esté en ejecución y sea accesible en la dirección host/puerto
especificada (http://localhost:5600 a menos que la hayas anulado).
Errores de Consulta
Si encuentras errores de consulta:
- Comprueba la sintaxis de tu consulta
- Asegúrate de que los IDs de bucket sean correctos
- Verifica que los períodos de tiempo contengan datos
- Revisa los registros de ActivityWatch para más detalles
Problemas de Formato de Consulta en Claude/MCP
Si Claude reporta errores al ejecutar consultas a través de este servidor MCP, es probable que se deba a problemas de formato. Asegúrate de que tu consulta siga este formato exacto en tus indicaciones:
{
"timeperiods": ["2024-10-28/2024-10-29"],
"query": ["events = query_bucket('aw-watcher-window_UNI-qUxy6XHnLkk'); RETURN = events;"]
}
Problemas comunes:
- Períodos de tiempo no formateados correctamente (deben ser "inicio/fin" en una sola cadena dentro de un array)
- Declaraciones de consulta divididas en elementos de array separados en lugar de combinadas en una sola cadena
El Problema de Formato Más Común
El error más frecuente es cuando Claude divide cada declaración de consulta en su propio elemento de array de esta manera:
{
"query": [
"browser_events = query_bucket('aw-watcher-web');",
"afk_events = query_bucket('aw-watcher-afk');",
"RETURN = events;"
],
"timeperiods": ["2024-10-28/2024-10-29"]
}
Esto es INCORRECTO. En su lugar, todas las declaraciones deben estar en una sola cadena dentro del array:
{
"timeperiods": ["2024-10-28/2024-10-29"],
"query": ["browser_events = query_bucket('aw-watcher-web'); afk_events = query_bucket('aw-watcher-afk'); RETURN = events;"]
}
Al Indicar a Claude
Al indicar a Claude, sé muy explícito sobre el formato y usa ejemplos. Por ejemplo, di:
"Ejecuta una consulta con períodos de tiempo como ["2024-10-28/2024-10-29"] y consulta como
["statement1; statement2; RETURN = result;"]. Importante: Asegúrate de que TODAS las declaraciones
de consulta estén en una sola cadena dentro del array, no divididas en elementos
de array separados."
Contribuciones
¡Las contribuciones son bienvenidas! No dudes en enviar una Solicitud de Extracción.