Observed since 20 Oct, 18:38 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
A Model Context Protocol server providing tools to interact with ActivityWatch time tracking data
A Model Context Protocol (MCP) server that connects to ActivityWatch, allowing LLMs like Claude to interact with your time tracking data.
Version 2.0: Now implemented in Python with native UVX support! Originally built in TypeScript, this server has been completely rewritten in Python for better integration with the Python ecosystem and simplified deployment via
uvx.
When using uv no specific installation is needed. We will use uvx to directly run mcp-server-activitywatch.
uvx mcp-server-activitywatch
Alternatively you can install mcp-server-activitywatch via pip:
pip install mcp-server-activitywatch
After installation, you can run it as a script using:
python -m mcp_server_activitywatch
Add to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"activitywatch": {
"command": "uvx",
"args": ["mcp-server-activitywatch"]
}
}
}
{
"mcpServers": {
"activitywatch": {
"command": "python",
"args": ["-m", "mcp_server_activitywatch"]
}
}
}
{
"mcpServers": {
"activitywatch": {
"command": "uvx",
"args": [
"mcp-server-activitywatch",
"--api-base",
"http://localhost:5600/api/0"
],
"env": {
"AW_API_BASE": "http://localhost:5600/api/0"
}
}
}
}
After configuration, restart Claude Desktop and look for the MCP icon to confirm it's working.
OpenCode supports MCP servers out of the box. Add the server configuration to your OpenCode settings:
{
"mcp": {
"servers": {
"activitywatch": {
"command": "uvx",
"args": ["mcp-server-activitywatch"]
}
}
}
}
{
"mcp": {
"servers": {
"activitywatch": {
"command": "python",
"args": ["-m", "mcp_server_activitywatch"]
}
}
}
}
You can add this to:
Ctrl+Shift+P and select "Preferences: Open User Settings (JSON)".vscode/mcp.json in your workspaceCrush also supports MCP servers. Configure it in your Crush settings:
{
"mcpServers": {
"activitywatch": {
"command": "uvx",
"args": ["mcp-server-activitywatch"]
}
}
}
{
"mcpServers": {
"activitywatch": {
"command": "python",
"args": ["-m", "mcp_server_activitywatch"]
}
}
}
Lists all available ActivityWatch buckets with optional type filtering.
Parameters:
type (optional): Filter buckets by type (e.g., "window", "web", "afk")include_data (optional): Include bucket data in responseRun a query in ActivityWatch's query language (AQL).
Parameters:
timeperiods: Time period(s) to query formatted as array of strings. For date ranges, use format: ["2024-10-28/2024-10-29"]query: Array of query statements in ActivityWatch Query Language, where each item is a complete query with statements separated by semicolonsname (optional): Name for the query (used for caching)IMPORTANT: Each query string should contain a complete query with multiple statements separated by semicolons.
Example request format:
{
"timeperiods": ["2024-10-28/2024-10-29"],
"query": [
"events = query_bucket('aw-watcher-window_hostname'); RETURN = events;"
]
}
Note that:
timeperiods should have pre-formatted date ranges with slashesquery array is a complete query with all statementsGet raw events from an ActivityWatch bucket.
Parameters:
bucket_id: ID of the bucket to fetch events fromstart (optional): Start date/time in ISO formatend (optional): End date/time in ISO formatlimit (optional): Maximum number of events to returnGet ActivityWatch settings from the server.
Parameters:
key (optional): Get a specific settings key instead of all settingsGet examples of properly formatted queries for the ActivityWatch MCP server. This tool takes no parameters and returns helpful examples.
Here are some example queries you can try:
ActivityWatch uses a simple query language. Here are some common patterns:
// 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;
The server connects to the ActivityWatch API at http://localhost:5600/api/0 by default.
You can customize this using:
Command-line argument:
uvx mcp-server-activitywatch --api-base http://localhost:5600/api/0
Environment variable:
export AW_API_BASE=http://localhost:5600/api/0
uvx mcp-server-activitywatch
If ActivityWatch isn't running, the server will show connection errors. Make sure ActivityWatch is running and accessible at http://localhost:5600.
If you're encountering query errors:
activitywatch-query-examples tool to see properly formatted examplesThe most frequent error is when query statements are split into separate array elements instead of being combined in one string:
❌ INCORRECT:
{
"query": [
"browser_events = query_bucket('aw-watcher-web');",
"afk_events = query_bucket('aw-watcher-afk');",
"RETURN = events;"
],
"timeperiods": ["2024-10-28/2024-10-29"]
}
✅ CORRECT:
{
"timeperiods": ["2024-10-28/2024-10-29"],
"query": [
"browser_events = query_bucket('aw-watcher-web'); afk_events = query_bucket('aw-watcher-afk'); RETURN = events;"
]
}
Class Model
flowchart LR
subgraph "MCP Server"
direction TB
classDef server fill:#e1f5fe
classDef tool fill:#f3e5f6
classDef handler fill:#fff3e0
A[server.py] --> B[tools/]
A --> C[server.py]
class A server
class B tool
class C handler
end
subgraph "ActivityWatch API"
direction TB
classDef api fill:#e8f5e8
D[localhost:5600]
class D api
end
subgraph "MCP Client"
direction TB
classDef client fill:#fce4ec
E[Claude Desktop]
F[OpenCode]
class E client
class F client
end
A --> D
E --> A
F --> A
activitywatch-mcp-server/ ├── src/ │ └── mcp_server_activitywatch/ │ ├── init.py # Entry point and CLI │ ├── server.py # MCP server setup │ └── tools/ # Individual tool implementations │ ├── list_buckets.py │ ├── run_query.py │ ├── get_events.py │ ├── get_settings.py │ └── query_examples.py ├── tests/ # Test suite │ ├── conftest.py │ ├── test_list_buckets.py │ ├── test_run_query.py │ └── test_get_settings.py ├── pyproject.toml # Project configuration └── README.md
### Setup Development Environment
```bash
# Clone the repository
git clone https://github.com/8bitgentleman/activitywatch-mcp-server.git
cd activitywatch-mcp-server
# Create virtual environment and install dependencies
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install in editable mode with dev dependencies
uv pip install -e ".[dev]"
# Run all tests
pytest tests/ -v
# Run specific test file
pytest tests/test_list_buckets.py -v
# Run with coverage
pytest tests/ --cov=src/mcp_server_activitywatch --cov-report=html
# Run type checking
pyright src/
# Run linting
ruff check src/
# Run the server directly
source .venv/bin/activate
mcp-server-activitywatch
# Test with custom API endpoint
mcp-server-activitywatch --api-base http://localhost:5600/api/0
# Test with environment variable
AW_API_BASE=http://localhost:5600/api/0 mcp-server-activitywatch
You can use the MCP inspector to debug the server:
npx @modelcontextprotocol/inspector uvx mcp-server-activitywatch
This will open a web interface where you can:
To add a new tool:
Create a new file in src/mcp_server_activitywatch/tools/ (e.g., my_tool.py)
Implement the schema function and handler:
from mcp.types import TextContent
from typing import Any
def my_tool_schema() -> dict[str, Any]:
return {
"type": "object",
"properties": {
"param": {"type": "string", "description": "Parameter description"}
},
"required": ["param"]
}
async def my_tool_handler(api_base: str, arguments: dict[str, Any]) -> list[TextContent]:
# Implementation here
return [TextContent(type="text", text="Result")]
Register the tool in server.py:
from mcp_server_activitywatch.tools.my_tool import my_tool_schema, my_tool_handler
# In list_tools handler:
Tool(
name="activitywatch-my-tool",
description="Tool description",
inputSchema=my_tool_schema(),
),
# In call_tool handler:
case "activitywatch-my-tool":
return await my_tool_handler(api_base, arguments)
Write tests in tests/test_my_tool.py
The package is designed to be published to PyPI for easy installation via uvx:
# Update version in pyproject.toml
# Build the package
python -m build
# Upload to PyPI (requires PyPI credentials)
twine upload dist/*
# Test installation
uvx mcp-server-activitywatch
Contributions are welcome! Please feel free to submit a Pull Request.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 2.1.0 | 13 Feb 2026 | 3 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Observed since 20 Oct, 18:38 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:fc28a0ab3157f7f8e16432fe004ffbedc3bc33e290c57c3a221beb055b5b35af