返回市场
活动监控-mcp-服务器

活动监控-mcp-服务器

作者:8bitgentleman33 星标更新:2025-03-29

项目介绍

ActivityWatch MCP 服务器

一个连接到 ActivityWatch 的模型上下文协议(MCP)服务器,允许像 Claude 这样的大型语言模型与您的时间跟踪数据进行交互。

<a href="https://glama.ai/mcp/servers/msnzvab06f"> <img width="380" height="200" src="https://gips1.baidu.com/it/u=322442555,1567104827&fm=3081&app=3081&f=PNG?w=760&h=400" alt="ActivityWatch Server MCP 服务器" /> </a>

特性

  • 列出桶:查看所有可用的 ActivityWatch 桶
  • 运行查询:执行强大的 AQL(ActivityWatch 查询语言)查询
  • 获取原始事件:从任何桶中直接检索事件
  • 获取设置:访问 ActivityWatch 配置设置

安装

您可以从 npm 安装 ActivityWatch MCP 服务器,或者自行构建。

从 npm 安装(即将推出)

# 全局安装
npm install -g activitywatch-mcp-server

# 或者本地安装
npm install activitywatch-mcp-server

从源码构建

  1. 克隆此仓库:

    git clone https://github.com/8bitgentleman/activitywatch-mcp-server.git
    cd activitywatch-mcp-server
    
  2. 安装依赖项:

    npm install
    
  3. 构建项目:

    npm run build
    

先决条件

  • 已安装并运行的 ActivityWatch
  • Node.js(v14 或更高版本)
  • Claude for Desktop(或其他 MCP 客户端)

使用方法

与 Claude for Desktop 一起使用

  1. 打开您的 Claude for Desktop 配置文件:

    • Windows: %APPDATA%\Claude\claude_desktop_config.json
    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  2. 添加 MCP 服务器配置:

{
  "mcpServers": {
    "activitywatch": {
      "command": "activitywatch-mcp-server",
      "args": []
    }
  }
}

如果您是从源码构建的,请使用:

{
  "mcpServers": {
    "activitywatch": {
      "command": "node",
      "args": ["/path/to/activitywatch-mcp-server/dist/index.js"]
    }
  }
}
  1. 重启 Claude for Desktop
  2. 查看 Claude 界面中的 MCP 图标以确认其是否正常工作

示例查询

这里有一些您可以在 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(可选):查询名称(用于缓存)

重要:每个查询字符串应包含一个完整的查询,多个语句之间用分号分隔。

示例请求格式:

{
  "timeperiods": ["2024-10-28/2024-10-29"],
  "query": ["events = query_bucket('aw-watcher-window_UNI-qUxy6XHnLkk'); RETURN = events;"]
}

注意:

  • timeperiods 应该有预格式化的日期范围,用斜杠分隔
  • query 数组中的每个项目都是一个完整的查询,包含所有语句

get-events

从 ActivityWatch 桶中获取原始事件。

参数:

  • bucketId:要获取事件的桶的 ID
  • start(可选):开始日期/时间,ISO 格式
  • end(可选):结束日期/时间,ISO 格式
  • limit(可选):返回的最大事件数

get-settings

从服务器获取 ActivityWatch 设置。

参数:

  • key(可选):获取特定设置键而不是所有设置

查询语言示例

ActivityWatch 使用简单的查询语言。这里是一些常见的模式:

// 获取窗口事件
window_events = query_bucket(find_bucket("aw-watcher-window_"));
RETURN = window_events;

// 获取非 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;

// 按应用分组
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);

// 按应用名称过滤
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 正在运行并且可以通过 http://localhost:5600 访问。

查询错误

如果您遇到查询错误:

  1. 检查您的查询语法
  2. 确保桶 ID 是正确的
  3. 验证时间段内是否有数据
  4. 查看 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 时,明确说明格式并使用示例。例如,说:

"运行一个查询,时间段为 ["2024-10-28/2024-10-29"],查询为 ["statement1; statement2; RETURN = result;"]。重要:确保所有查询语句都在数组内的一个字符串中,而不是分割成单独的数组元素。"

贡献

欢迎贡献!请随时提交拉取请求。

许可证

MIT