ATracker MCP Server

ATracker MCP Server

Syncs ATracker time tracking data to a local SQLite database and provides MCP tools for querying tasks, entries, tags, and exporting data.

Category
访问服务器

README

ATracker MCP Server

MCP server + standalone CLI for syncing ATracker time tracking data to a local SQLite database. Works with Claude Desktop, Claude Code, or any MCP client.

What it does

  1. Calls the ATracker cloud API (reverse-engineered web sync endpoint)
  2. Stores tasks, entries, tags, and task-tag relationships in a local SQLite DB
  3. Supports incremental sync (only fetches changes since last sync) and full sync
  4. Exposes 7 MCP tools for querying/exporting the data
  5. Also works as a standalone CLI script (atracker_sync.py)

Files

├── src/atracker_mcp/
│   ├── __init__.py          # Package init, version
│   └── server.py            # MCP server (7 tools: sync, timeline, summary, etc.)
├── atracker_sync.py         # Standalone sync CLI (no MCP dependency needed)
├── ecosystem.config.js      # PM2 config (optional, for auto-restart)
├── .env.example             # Template for credentials
├── .gitignore               # Excludes .env, *.db, venv, exports
├── pyproject.toml            # Python package config (hatchling)
├── requirements.txt          # Minimal deps: mcp, requests, python-dotenv
└── data/                    # Created at runtime
    ├── atracker.db          # SQLite database (gitignored)
    └── .sync_state.json     # Last sync timestamp (gitignored)

Setup

1. Install dependencies

python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

2. Get credentials

  1. Open https://atracker.pro/Web/ and log in
  2. Open browser DevTools (F12) → Network tab → filter "Fetch/XHR"
  3. Do any action in the app (or refresh the page)
  4. Click the UpdateFromIOS request
  5. From Headers: copy the ARRAffinity cookie value
  6. From Payload: copy the uuid value

3. Configure

cp .env.example .env

Edit .env:

ATRACKER_COOKIE=your_arraffinity_cookie_value
ATRACKER_UUID=your-uuid-from-payload

Running

Standalone CLI (simplest)

# First sync — pulls all historical data
python3 atracker_sync.py --full

# Subsequent syncs — only new changes
python3 atracker_sync.py

# Export to CSV
python3 atracker_sync.py --export timeline.csv

# Export last 7 days to JSON
python3 atracker_sync.py --export week.json --days 7

# Export today only
python3 atracker_sync.py --export today.csv --today

Cron (production setup)

Add to crontab for automatic sync every 15 minutes:

crontab -e
*/15 * * * * cd /path/to/ATracker-MCP && source venv/bin/activate && python3 atracker_sync.py >> /var/log/atracker-sync.log 2>&1

PM2 (alternative)

pm2 start ecosystem.config.js

This runs the sync script and restarts it every 5 minutes (via restart_delay).

MCP Server (for Claude Desktop / Claude Code)

Add to Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "atracker": {
      "command": "python3",
      "args": ["-m", "atracker_mcp.server"],
      "cwd": "/path/to/ATracker-MCP",
      "env": {
        "PYTHONPATH": "/path/to/ATracker-MCP/src"
      }
    }
  }
}

MCP Tools

Tool Description
atracker_sync Sync from ATracker cloud. full=true for all data, default incremental
atracker_current_task Get the currently running/active task
atracker_timeline Query entries. Filters: limit, date (YYYY-MM-DD), days, task (name search)
atracker_summary Time totals grouped by task. Filters: date, days
atracker_tasks List all tasks with entry counts
atracker_export Export to CSV/JSON. Filters: format, days, output filename
atracker_stats DB stats: task/entry counts, date range, last sync time

Database Schema

SQLite with 4 tables:

tasks (task_id TEXT PK, name TEXT, category TEXT, color TEXT, icon TEXT, tag_id TEXT)
entries (entry_id TEXT PK, task_id TEXT FK, start_time REAL, end_time REAL, notes TEXT)
tags (tag_id TEXT PK, name TEXT, color TEXT)
task_tags (task_id TEXT, tag_id TEXT, PK(task_id, tag_id))
  • start_time / end_time are Unix timestamps (seconds)
  • Running tasks have end_time = 0 or end_time < start_time
  • Indexes on entries(start_time) and entries(task_id)

Querying Tags

Tags are linked to tasks via the task_tags junction table. Here's how to query them:

Get all tasks with their tags

SELECT 
    t.task_id,
    t.name AS task_name,
    GROUP_CONCAT(g.name) AS tags
FROM tasks t
LEFT JOIN task_tags tt ON t.task_id = tt.task_id
LEFT JOIN tags g ON tt.tag_id = g.tag_id
GROUP BY t.task_id, t.name;

Get timeline entries with tags

SELECT 
    e.entry_id,
    t.name AS task_name,
    datetime(e.start_time, 'unixepoch') AS started,
    datetime(e.end_time, 'unixepoch') AS ended,
    GROUP_CONCAT(g.name) AS tags
FROM entries e
JOIN tasks t ON e.task_id = t.task_id
LEFT JOIN task_tags tt ON t.task_id = tt.task_id
LEFT JOIN tags g ON tt.tag_id = g.tag_id
GROUP BY e.entry_id
ORDER BY e.start_time DESC
LIMIT 20;

Filter entries by tag

SELECT 
    t.name AS task_name,
    SUM(e.end_time - e.start_time) / 3600.0 AS hours
FROM entries e
JOIN tasks t ON e.task_id = t.task_id
JOIN task_tags tt ON t.task_id = tt.task_id
JOIN tags g ON tt.tag_id = g.tag_id
WHERE g.name = 'Work'
  AND e.start_time >= strftime('%s', 'now', '-7 days')
GROUP BY t.name
ORDER BY hours DESC;

List all tags with task counts

SELECT 
    g.name AS tag,
    g.color,
    COUNT(DISTINCT tt.task_id) AS task_count
FROM tags g
LEFT JOIN task_tags tt ON g.tag_id = tt.tag_id
GROUP BY g.tag_id
ORDER BY task_count DESC;

API Details

The sync uses ATracker's web sync endpoint (PUT /api/services/app/ATUpdateFromIOS/UpdateFromIOS). Key points:

  • Auth via ARRAffinity cookie (same value in both ARRAffinity and ARRAffinitySameSite)
  • Header Abp.TenantId: 1 is required
  • lastSyncTimeStampInApp controls incremental sync (0 = full sync, Unix timestamp = changes since)
  • Response contains result.updateTask, result.updateTaskEntry, result.updateTag, result.updateTaskTag arrays
  • Cookie typically valid ~1 week; re-login at web app to refresh

Privacy

  • Credentials in .env (gitignored)
  • All data stored locally in SQLite
  • Only communicates with atracker.pro official API

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选
mcp-server-qdrant

mcp-server-qdrant

这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。

官方
精选
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选