Timers, estimates and project changes all go through, which is what makes it worth wiring in — and also why HARVEST_READ_ONLY matters: flip it and every write tool refuses with an explanation instead of you having to trust the model. Deleting a project takes its time entries and expenses with it, so archiving is the safer move the docs point to.
A FastMCP server over the Harvest time tracking and project management API, covering time entries, projects, assignments, clients, tasks and estimates.
- Time entries — list with filters, create new ones, start and stop timers, and pull unsubmitted timesheets that have not gone for approval
- Projects — list and filter by client, active state or updated_since, read details, create, update, and archive by setting is_active to False
- Task assignments — list account-wide or per project, create, update, and delete when no time is logged against them
- User assignments — the same lifecycle for linking people to projects
- Clients and tasks — list with filters and read details
- Estimates — list and filter by client, state or date range, look one up by its user-facing number, read its messages, create with line items, change state between send, accept, decline and re-open, and email it to recipients
- HARVEST_READ_ONLY disables every write operation while leaving all reads working
A Harvest account with API access, plus HARVEST_ACCOUNT_ID and HARVEST_API_KEY in the client's environment block. Python 3.10 or higher and uv, which launches harvest-mcp-server.py from the project directory. The maintainers suggest a dedicated API key with limited permissions.
Build from source — clone the repository and build it, then point your client at the binary
