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.
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
- Calls the ATracker cloud API (reverse-engineered web sync endpoint)
- Stores tasks, entries, tags, and task-tag relationships in a local SQLite DB
- Supports incremental sync (only fetches changes since last sync) and full sync
- Exposes 7 MCP tools for querying/exporting the data
- 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
- Open https://atracker.pro/Web/ and log in
- Open browser DevTools (F12) → Network tab → filter "Fetch/XHR"
- Do any action in the app (or refresh the page)
- Click the
UpdateFromIOSrequest - From Headers: copy the
ARRAffinitycookie value - From Payload: copy the
uuidvalue
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_timeare Unix timestamps (seconds)- Running tasks have
end_time = 0orend_time < start_time - Indexes on
entries(start_time)andentries(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
ARRAffinitycookie (same value in bothARRAffinityandARRAffinitySameSite) - Header
Abp.TenantId: 1is required lastSyncTimeStampInAppcontrols incremental sync (0 = full sync, Unix timestamp = changes since)- Response contains
result.updateTask,result.updateTaskEntry,result.updateTag,result.updateTaskTagarrays - 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.proofficial API
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
mcp-server-qdrant
这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。