timescribe-mcp
# timescribe-mcp
An [MCP](https://modelcontextprotocol.io) server that gives Claude read-only access to your local [TimeScribe](https://github.com/WINBIGFOX/TimeScribe) time tracking data. Ask things like "how many hours did I track per project last week?" without exporting a CSV.
- Reads TimeScribe's local SQLite database directly, **read-only**. It never writes.
- Works while TimeScribe is running, including the live timer.
- No network access. Your data stays on your machine.
## Requirements
- TimeScribe installed (macOS or Windows)
- Node.js 22.13 or newer
## Install
### Claude Code
```bash
git clone https://github.com/bverhoeve/timescribe-mcp && cd timescribe-mcp
npm ci && npm run build
claude mcp add timescribe -- node "$(pwd)/dist/index.js"
```
### Claude Desktop
Add to `claude_desktop_config.json`:
```json
{
"mcpServers": {
"timescribe": { "command": "node", "args": ["/absolute/path/to/timescribe-mcp/dist/index.js"] }
}
}
```
### Database location
Found automatically:
- macOS: `~/Library/Application Support/timescribe/database/database.sqlite`
- Windows: `%APPDATA%\timescribe\database\database.sqlite` (unverified; if it isn't found, set `TIMESCRIBE_DB_PATH`)
Elsewhere, set `TIMESCRIBE_DB_PATH` to the full path of `database.sqlite`.
## Tools
| Tool | What it returns |
|---|---|
| `list_projects` | All projects, including archived ones (`archived: true`) |
| `get_time_summary` | Work, break and scheduled hours for a date range, grouped per `project` (default), `day` or `project_day`, plus the running timer |
| `list_entries` | Individual work/break entries in a range, filterable by `project_id` and `type`, max 500; `truncated: true` means narrow the range |
Dates are `YYYY-MM-DD`, inclusive, in the timezone set in TimeScribe. Leave out `from` and `to` for the current week (Monday to Sunday). Output times are ISO 8601 with offset.
## How times are counted
- An entry counts on the day it **started** (TimeScribe splits entries at midnight itself).
- A running timer counts up to now. A timer left open while TimeScribe was closed counts up to the last moment the app saw it running.
- `work_hours` is **tracked time only**. TimeScribe's own balance also credits public holidays and absences as worked hours, so in weeks with a holiday this server reports less than the app's balance.
- `scheduled_hours` comes from your TimeScribe work schedule and does not deduct holidays or absences.
## Development
```bash
npm test # type-check, build, run all tests (never touches your real data)
npm run inspect # open the MCP Inspector against your real database
```
## License
MIT
TDQS
Scored across 3 tools
Each tool targets a distinct level of the domain: projects, individual entries, and aggregated summaries. The descriptions explicitly disambiguate by telling the agent when to use list_entries vs get_time_summary, eliminating overlap.
All three names follow a clean snake_case verb_noun pattern (list_projects, list_entries, get_time_summary), with list_* for collections and get_* for a computed value used predictably.
Three tools is at the low end but each earns its place and maps to a genuinely different question (what projects exist, what happened in detail, what the totals are). A read-only analytics surface this tight is defensible, though it leaves little room for growth.
The set covers the read/analysis lifecycle well but is entirely read-only: there is no way to create, edit, or delete entries, manage projects, or start/stop the running timer that get_time_summary reports. Notable gaps if the agent is expected to do more than report on time data.