关于 ActivityWatch MCP Server
ActivityWatch MCP Server 将 MCP 客户端连接到 ActivityWatch 时间追踪数据。它提供桶列表、AQL 查询、原始事件读取和设置访问工具。
主要功能
- 01列出桶并可按类型筛选
- 02运行 ActivityWatch 查询语言查询
- 03读取桶中的原始事件
- 04读取全部或指定设置
适用场景
- 01汇总一段时间内的应用使用情况
- 02查看指定日期范围的网站活动
- 03按 AFK 状态筛选窗口活动
- 04检查 ActivityWatch 配置
MCP 相关
通过 list-buckets、run-query、get-events 和 get-settings 四种工具,向 MCP 客户端开放 ActivityWatch 桶、AQL 查询、原始事件和设置。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
ActivityWatch MCP 服务
一个连接到 ActivityWatch 的 Model Context Protocol (MCP) 服务,让 Claude 等大模型能够与你的时间追踪数据交互。
功能
- 列出存储桶:查看所有可用的 ActivityWatch 存储桶
- 运行查询:执行强大的 AQL(ActivityWatch Query Language)查询
- 获取原始事件:直接从任意存储桶检索事件
- 获取设置:访问 ActivityWatch 配置设置
安装
你可以从 npm 安装 ActivityWatch MCP 服务,也可以自行构建。
从 npm 安装(即将推出)
# Global installation
npm install -g activitywatch-mcp-server
# Or install locally
npm install activitywatch-mcp-server
从源码构建
-
克隆此仓库:
git clone https://github.com/8bitgentleman/activitywatch-mcp-server.git cd activitywatch-mcp-server -
安装依赖:
npm install -
构建项目:
npm run build
前提条件
- 已安装并运行 ActivityWatch
- Node.js(v14 或更高版本)
- Claude for Desktop(或任何其他 MCP 客户端)
用法
与 Claude for Desktop 配合使用
-
打开你的 Claude for Desktop 配置文件:
- Windows:
%APPDATA%\Claude\claude_desktop_config.json - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:
-
添加 MCP 服务配置:
{ "mcpServers": { "activitywatch": { "command": "activitywatch-mcp-server", "args": [] } } }如果你是从源码构建的,请使用:
{ "mcpServers": { "activitywatch": { "command": "node", "args": ["/path/to/activitywatch-mcp-server/dist/index.js"] } } } -
重启 Claude for Desktop
-
查看 Claude 界面中的 MCP 图标,确认其正常工作
在 Linux 上使用无 root 的 podman 容器配合 Gemini CLI
请务必先构建镜像:
version=$(npm pkg get version | tr -d '"')
podman build . -t activitywatch-mcp-server:${version}
此示例使用了针对 Activity Watch 在 127.0.0.1 上不可用的覆盖配置(见下一节)。如果不需要,可以省略 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"
}
}
}
}
覆盖 ActivityWatch 服务主机/端口
如果你想在 Windows Subsystem for Linux 内部运行此 MCP 服务,例如在容器中,那么在 Windows 中运行的 AW 服务将无法通过 127.0.0.1 访问。要覆盖标准的 localhost 连接,请使用环境变量 AW_API_BASE 或 --aw-api-base 标志,如下所示:
# 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
NOTE:AW 服务可能会对用于连接它的名称比较挑剔,但它会接受与运行所在计算机名称匹配并带有 .local 后缀的名称。
示例查询
以下是一些你可以在 Claude 中尝试的示例查询:
- 列出所有存储桶:"我有哪些 ActivityWatch 存储桶?"
- 获取应用使用摘要:"你能告诉我今天使用最多的应用是哪些吗?"
- 查看浏览历史:"今天我在哪些网站上花费的时间最多?"
- 检查生产力:"今天我在生产力应用中花了多少时间?"
- 查看设置:"我的 ActivityWatch 设置是什么?"或"你能检查 ActivityWatch 中的某个特定设置吗?"
可用工具
list-buckets
列出所有可用的 ActivityWatch 存储桶,并支持可选的类型过滤。
参数:
type(可选):按类型过滤存储桶(例如 "window"、"web"、"afk")includeData(可选):在响应中包含存储桶数据
run-query
在 ActivityWatch 的查询语言(AQL)中运行查询。
参数:
timeperiods:要查询的时间段,格式为字符串数组。对于日期 范围,使用格式:["2024-10-28/2024-10-29"]query:ActivityWatch 查询语言中的查询语句数组,其中每个 元素都是一个完整查询,各语句之间用分号分隔name(可选):查询的名称(用于缓存)
IMPORTANT:每个查询字符串应包含一个完整查询,其中多条 语句用分号分隔。
示例请求格式:
{
"timeperiods": ["2024-10-28/2024-10-29"],
"query": ["events = query_bucket('aw-watcher-window_UNI-qUxy6XHnLkk'); RETURN = events;"]
}
请注意:
timeperiods应使用预先格式化好的日期范围,并用斜杠分隔query数组中的每个元素都是一个包含所有语句的完整查询
get-events
从 ActivityWatch 存储桶获取原始事件。
参数:
bucketId:要从中获取事件的存储桶 IDstart(可选):ISO 格式的开始日期/时间end(可选):ISO 格式的结束日期/时间limit(可选):要返回的最大事件数
get-settings
从服务器获取 ActivityWatch 设置。
参数:
key(可选):获取特定的设置键,而不是所有设置
查询语言示例
ActivityWatch 使用一种简单的查询语言。以下是一些常见模式:
// 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;
配置
该服务默认连接到位于 http://localhost:5600 的 ActivityWatch API。如果你的 ActivityWatch 实例运行在其他主机或端口上,
可以按照上文“覆盖 ActivityWatch 服务器主机/端口”一节所述进行覆盖。
故障排除
ActivityWatch 未运行
如果 ActivityWatch 未运行,该服务将显示连接错误。请
确保 ActivityWatch 正在运行,并可通过指定的主机/端口
地址访问(除非你已覆盖该地址,否则为 http://localhost:5600)。
查询错误
如果你遇到查询错误:
- 检查你的查询语法
- 确保存储桶 ID 正确
- 验证时间段内包含数据
- 查看 ActivityWatch 日志以了解更多详情
Claude/MCP 查询格式问题
如果 Claude 在通过此 MCP 服务运行查询时报告错误,很 可能是由于格式问题。请确保你的提示词中的查询遵循以下确切格式:
{
"timeperiods": ["2024-10-28/2024-10-29"],
"query": ["events = query_bucket('aw-watcher-window_UNI-qUxy6XHnLkk'); RETURN = events;"]
}
常见问题:
- 时间段格式不正确(应为数组内单个字符串形式的 "start/end")
- 查询语句被拆分为单独的数组元素,而不是合并 在一个字符串中
最常见的格式问题
最常见的错误是 Claude 将每条查询语句拆分为各自的 数组元素,如下所示:
{
"query": [
"browser_events = query_bucket('aw-watcher-web');",
"afk_events = query_bucket('aw-watcher-afk');",
"RETURN = events;"
],
"timeperiods": ["2024-10-28/2024-10-29"]
}
这是不正确的。相反,所有语句都应位于 数组内的单个字符串中:
{
"timeperiods": ["2024-10-28/2024-10-29"],
"query": ["browser_events = query_bucket('aw-watcher-web'); afk_events = query_bucket('aw-watcher-afk'); RETURN = events;"]
}
向 Claude 编写提示词时
向 Claude 编写提示词时,请非常明确地说明格式并使用示例。例如,可以这样说:
"Run a query with timeperiods as ["2024-10-28/2024-10-29"] and query as
["statement1; statement2; RETURN = result;"]. Important: Make sure ALL query
statements are in a single string within the array, not split into separate
array elements."
贡献
欢迎贡献!请随时提交 Pull Request。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。