LABSCO SUMMARY
Full write access to Harvest, with one switch that turns it into a read-only reporting tool.
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.
What it is
A FastMCP server over the Harvest time tracking and project management API, covering time entries, projects, assignments, clients, tasks and estimates.
What you get
- 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
Requirements
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.
Setup effort
Clone and run — clone the repository, then add the configuration for your client; uv runs the script from your clone, with nothing to build
USE CASES
01
Logging time without leaving what you are doing
Start or stop the timer on the right project and task from the conversation.
02
Finding the hours nobody submitted
Pull unsubmitted timesheets for a period or a person before approvals close.
03
Answering where the week went
List time entries with filters and have them summarised in the thread.
04
Setting up a new project properly
Create it for the client, assign the tasks as billable, and add the people who will work on it.
05
Moving an estimate along
Create it with line items, mark it sent, and email it to the client without opening Harvest.
06
Letting someone read the numbers without risk
Run the server with HARVEST_READ_ONLY set; every write tool refuses and explains why.
07
Retiring a finished project
Archive it by setting is_active to False rather than deleting, which would take its time entries and expenses with it.
BEFORE YOU INSTALL
What to know first
Requires
- uv on PATH
- Python 3.10 or later
- HARVEST_ACCOUNT_ID in your environment
- HARVEST_API_KEY in your environment
Where it runs
The documented client runs the server on your machine.
INSTALLATION
Connect your client
Clone the repository, then add the configuration for your client; uv runs the script from your clone, with nothing to build.
Server setup
TERMINAL
git clone https://github.com/taiste/harvest-mcp-server.gitMCP Clients
Claude Desktop
CLAUDE DESKTOP · JSON
{
"mcpServers": {
"harvest": {
"command": "uv",
"args": [
"run",
"--directory",
"<YOUR_DIRECTORY>",
"harvest-mcp-server.py"
],
"env": {
"HARVEST_ACCOUNT_ID": "<YOUR_HARVEST_ACCOUNT_ID>",
"HARVEST_API_KEY": "<YOUR_HARVEST_API_KEY>"
}
}
}
}<YOUR_DIRECTORY> is the full path of your harvest-mcp-server clone (the folder that holds harvest-mcp-server.py), <YOUR_HARVEST_ACCOUNT_ID> your Harvest Account ID and <YOUR_HARVEST_API_KEY> your Harvest API key.