harvest_create_ invoiceCreate a free-form invoice from line items you write yourself.
Log two hours to a client's project by name, see how much of last month has not been billed, turn tracked time into a draft invoice, or check which projects are close to their budget.
PopMCPHarvest
Every endpoint in Harvest's API is a tool, from timesheets and invoices to approvals and time off. Three more do the jobs that take several calls: logging time from a project and task name, adding up hours by client or person, and finding a record by name, which Harvest's own lists cannot do.
217 tools in the full catalog: 97 read and 120 write. 39 load by default, and the rest are found with tool search.
harvest_create_ invoiceCreate a free-form invoice from line items you write yourself.
harvest_create_ invoice_ from_ tracked_ timeCreate an invoice that pulls in a client's unbilled tracked time and expenses.
harvest_create_ invoice_ paymentCreates a new invoice payment object.
harvest_get_ invoiceRetrieves the invoice with the given ID.
harvest_list_ invoicesReturns a list of your invoices.
harvest_send_ invoice_ messageCreates a new invoice message object and sends it.
harvest_get_ project_ budget_ reportBudget against spend for every project: budget, budget_spent, budget_remaining.
harvest_get_ time_ report_ by_ projectHours and billable amounts per project for a date range.
harvest_get_ time_ report_ by_ teamHours and billable amounts per person for a date range: use it for utilisation.
harvest_get_ uninvoiced_ reportWhat is tracked but not invoiced yet, per project: uninvoiced hours, expenses and amount for a date range.
harvest_create_ projectCreates a new project object.
harvest_get_ projectRetrieves the project with the given ID.
harvest_list_ project_ task_ assignmentsReturns a list of your task assignments for the project identified by PROJECT_ID.
harvest_list_ project_ user_ assignmentsReturns a list of user assignments for the project identified by PROJECT_ID.
harvest_list_ projectsReturns a list of your projects.
harvest_update_ projectUpdates the specific project by setting the values of the parameters passed.
harvest_create_ estimateCreates a new estimate object.
harvest_get_ current_ userRetrieves the currently authenticated user.
harvest_list_ estimatesReturns a list of your estimates.
harvest_list_ my_ project_ assignmentsReturns a list of your active project assignments for the currently authenticated user.
harvest_list_ usersReturns a list of your users.
harvest_create_ expenseCreates a new expense object.
harvest_list_ expense_ categoriesReturns a list of your expense categories.
harvest_list_ expensesReturns a list of your expenses.
harvest_create_ clientCreates a new client object.
harvest_get_ clientRetrieves the client with the given ID.
harvest_list_ clientsReturns a list of your clients.
harvest_create_ time_ entryLog time or start a timer for a project and task.
harvest_delete_ time_ entryDelete a time entry.
harvest_get_ time_ entryRetrieves the time entry with the given ID.
harvest_list_ time_ entriesReturns a list of time entries.
harvest_restart_ time_ entryRestarting a time entry is only possible if it isn’t currently running.
harvest_stop_ time_ entryStopping a time entry is only possible if it’s currently running.
harvest_update_ time_ entryUpdates the specific time entry by setting the values of the parameters passed.
harvest_get_ companyRetrieves the company for the currently authenticated user.
harvest_list_ tasksReturns a list of your tasks.
harvest_find_ recordsFind a Harvest client, project, task, person or contact by part of its name (or a project's code, or a person's email), because Harvest's lists have no search.
harvest_get_ time_ summaryAdd up tracked time for a date range: total, billable and unbilled hours and billable amount, grouped by project, client, task, person or day, plus any timers running now.
harvest_log_ timeLog time to Harvest, or start a timer, from a project and task name: "2 hours on Acme website, Design, today".
harvest_approve_ time_ off_ requestApproves a pending or changes_requested request.
harvest_bulk_ approve_ time_ off_ requestsApproves every pending request in the given set.
harvest_bulk_ decline_ time_ off_ requestsDeclines every pending request in the given set.
harvest_bulk_ update_ pto_ allocationsUpdates or resets per-user yearly allocation overrides for many users in one request.
harvest_cancel_ time_ off_ requestCancels a time off request.
harvest_create_ holiday_ calendarCreates a new holiday calendar.
harvest_create_ holiday_ calendar_ entryCreates one or more holiday entries in a calendar.
harvest_create_ time_ off_ policyCreates a new time off policy.
harvest_create_ time_ off_ requestCreates a new time off request.
harvest_create_ work_ scheduleCreates a new work schedule.
harvest_deactivate_ work_ scheduleDeactivates a non-default work schedule.
harvest_decline_ time_ off_ requestDeclines a time off request.
harvest_delete_ holiday_ calendarDeletes a holiday calendar.
harvest_delete_ holiday_ calendar_ entryDeletes a holiday calendar entry.
harvest_delete_ time_ off_ policyDeletes or deactivates an existing time off policy.
harvest_get_ holiday_ calendarRetrieves the details of an existing holiday calendar.
harvest_get_ time_ off_ balancesReturns time off balances broken down per policy for a specific user and year.
harvest_get_ time_ off_ policyRetrieves the details of an existing time off policy.
harvest_get_ time_ off_ requestRetrieves the details of an existing time off request.
harvest_get_ work_ scheduleRetrieves the details of an existing work schedule.
harvest_list_ holiday_ calendar_ entriesReturns a list of holiday entries for the calendar identified by HOLIDAY_CALENDAR_ID.
harvest_list_ holiday_ calendarsReturns a list of holiday calendars.
harvest_list_ pto_ allocationsReturns a list of customized and yearly time off allocations across users.
harvest_list_ pto_ user_ assignmentsReturns a list of users alongside their assigned holiday calendars, assigned work schedules, and effective working hours.
harvest_list_ time_ off_ policiesReturns a list of time off policies.
harvest_list_ time_ off_ requestsReturns a list of time off requests.
harvest_list_ work_ schedulesReturns a list of work schedules.
harvest_request_ time_ off_ changesRequests changes on a time off request.
harvest_update_ holiday_ calendarUpdates an existing holiday calendar.
harvest_update_ holiday_ calendar_ entryUpdates an existing holiday calendar entry.
harvest_update_ pto_ allocationUpdates or resets per-user yearly allocation overrides.
harvest_update_ pto_ user_ assignmentAssigns or unassigns a holiday calendar and work schedule for a specific user.
harvest_update_ time_ off_ policyUpdates an existing time off policy.
harvest_update_ time_ off_ requestUpdates an unreviewed time off request.
harvest_update_ work_ scheduleUpdates an existing work schedule.
harvest_close_ invoiceMark an open invoice as closed (written off).
harvest_create_ invoice_ item_ categoryCreates a new invoice item category object.
harvest_delete_ invoiceDelete an invoice.
harvest_delete_ invoice_ item_ categoryDelete an invoice item category.
harvest_delete_ invoice_ messageDelete an invoice message.
harvest_delete_ invoice_ paymentDelete an invoice payment.
harvest_get_ e_ invoice_ statusRetrieves the Peppol readiness and the latest submission status for an invoice.
harvest_get_ invoice_ item_ categoryRetrieves the invoice item category with the given ID.
harvest_get_ invoice_ message_ templateReturns the subject and body text as configured in Harvest of an invoice message for a specific invoice.
harvest_list_ invoice_ item_ categoriesReturns a list of your invoice item categories.
harvest_list_ invoice_ messagesReturns a list of messages associated with a given invoice.
harvest_list_ invoice_ paymentsReturns a list of payments associate with a given invoice.
harvest_mark_ invoice_ draftMove an open invoice back to draft.
harvest_mark_ invoice_ sentMark a draft invoice as sent, with no email.
harvest_reopen_ invoiceRe-open a closed (written-off) invoice.
harvest_send_ e_ invoiceSends an invoice over the Peppol network.
harvest_update_ invoiceUpdates the specific invoice by setting the values of the parameters passed.
harvest_update_ invoice_ item_ categoryUpdates the specific invoice item category by setting the values of the parameters passed.
harvest_create_ report_ exportCreates a report export.
harvest_create_ saved_ reportCreates a saved report.
harvest_delete_ saved_ reportDeletes a saved report.
harvest_download_ report_ exportServes the completed export file with attachment headers, and returns a 200 OK response code.
harvest_generate_ reportRuns a report definition supplied in the request.
harvest_get_ expense_ detailed_ reportExpenses row by row for a date range, with totals per currency.
harvest_get_ expense_ report_ by_ categoryExpense totals per expense category for a date range.
harvest_get_ expense_ report_ by_ clientExpense totals per client for a date range.
harvest_get_ expense_ report_ by_ projectExpense totals per project for a date range.
harvest_get_ expense_ report_ by_ teamExpense totals per person for a date range.
harvest_get_ profitability_ reportRevenue, costs and margin for a date range, grouped by project, client, team or task.
harvest_get_ report_ exportRetrieves the status of an export.
harvest_get_ saved_ reportRetrieves a saved report.
harvest_get_ time_ detailed_ reportTime entries row by row for a date range, with totals: who, client, project, task, hours and amounts.
harvest_get_ time_ report_ by_ clientHours and billable amounts per client for a date range.
harvest_get_ time_ report_ by_ taskHours and billable amounts per task for a date range.
harvest_list_ saved_ reportsReturns a list of saved reports, ordered by updated_at descending, then id descending.
harvest_run_ saved_ reportRuns the stored definition of a saved report.
harvest_update_ saved_ reportUpdates a saved report.
harvest_create_ task_ assignmentCreates a new task assignment object.
harvest_create_ user_ assignmentCreates a new user assignment object.
harvest_delete_ projectDeletes a project and any time entries or expenses tracked to it.
harvest_delete_ task_ assignmentDelete a task assignment.
harvest_delete_ user_ assignmentDelete an user assignment.
harvest_get_ task_ assignmentRetrieves the task assignment with the given ID.
harvest_get_ user_ assignmentRetrieves the user assignment with the given ID.
harvest_list_ tagsReturns the tag vocabulary for the account.
harvest_list_ task_ assignmentsReturns a list of your task assignments.
harvest_list_ user_ assignmentsReturns a list of your projects user assignments, active and archived.
harvest_update_ task_ assignmentUpdates the specific task assignment by setting the values of the parameters passed.
harvest_update_ user_ assignmentUpdates the specific user assignment by setting the values of the parameters passed.
harvest_archive_ userArchive an user (is_active false): they can no longer sign in, and their history stays.
harvest_create_ estimate_ item_ categoryCreates a new estimate item category object.
harvest_create_ estimate_ messageCreates a new estimate message object.
harvest_create_ userCreates a new user object and sends an invitation email to the address specified in the email parameter.
harvest_create_ user_ billable_ rateCreates a new billable rate object.
harvest_create_ user_ cost_ rateCreates a new cost rate object.
harvest_delete_ estimateDelete an estimate.
harvest_delete_ estimate_ item_ categoryDelete an estimate item category.
harvest_delete_ estimate_ messageDelete an estimate message.
harvest_delete_ userDelete an user.
harvest_get_ estimateRetrieves the estimate with the given ID.
harvest_get_ estimate_ item_ categoryRetrieves the estimate item category with the given ID.
harvest_get_ userRetrieves the user with the given ID.
harvest_get_ user_ billable_ rateRetrieves the billable rate with the given ID.
harvest_get_ user_ cost_ rateRetrieves the cost rate with the given ID.
harvest_list_ estimate_ item_ categoriesReturns a list of your estimate item categories.
harvest_list_ estimate_ messagesReturns a list of messages associated with a given estimate.
harvest_list_ user_ billable_ ratesReturns a list of billable rates for the user identified by USER_ID.
harvest_list_ user_ cost_ ratesReturns a list of cost rates for the user identified by USER_ID.
harvest_list_ user_ project_ assignmentsReturns a list of active project assignments for the user identified by USER_ID.
harvest_list_ user_ teammatesReturns a list of assigned teammates for the user identified by USER_ID.
harvest_mark_ estimate_ acceptedMark an open estimate as accepted.
harvest_mark_ estimate_ declinedMark an open estimate as declined.
harvest_mark_ estimate_ sentMark a draft estimate as sent, with no email.
harvest_reopen_ estimateRe-open a closed estimate.
harvest_update_ estimateUpdates the specific estimate by setting the values of the parameters passed.
harvest_update_ estimate_ item_ categoryUpdates the specific estimate item category by setting the values of the parameters passed.
harvest_update_ userUpdates the specific user by setting the values of the parameters passed.
harvest_update_ user_ teammatesUpdates the the assigned teammates for a specific user.
harvest_approve_ expenseApproves a submitted expense, with the same effect as the Approvals page’s approve action.
harvest_attach_ expense_ receiptAttach or replace the receipt on an existing expense.
harvest_create_ expense_ categoryCreates a new expense category object.
harvest_create_ expense_ with_ receiptCreate an expense and attach a receipt file in one step.
harvest_delete_ expenseDelete an expense.
harvest_delete_ expense_ categoryDelete an expense category.
harvest_get_ expenseRetrieves the expense with the given ID.
harvest_get_ expense_ categoryRetrieves the expense category with the given ID.
harvest_update_ expenseUpdates the specific expense by setting the values of the parameters passed.
harvest_update_ expense_ categoryUpdates the specific expense category by setting the values of the parameters passed.
harvest_withdraw_ expenseWithdraws an approved expense, returning it to submitted status, with the same effect as the Approvals page’s withdraw action.
harvest_create_ custom_ roleCreates a custom role.
harvest_create_ roleCreates a new role object.
harvest_delete_ custom_ roleDeletes the custom role with the given ID.
harvest_delete_ roleDelete a role.
harvest_get_ custom_ roleRetrieves the custom role with the given ID.
harvest_get_ roleRetrieves the role with the given ID.
harvest_list_ custom_ rolesReturns a list of the account’s custom roles, sorted by descending ID.
harvest_list_ permissionsReturns the account’s permission catalogue, sorted by ascending ID.
harvest_list_ rolesReturns a list of roles in the account.
harvest_update_ custom_ roleUpdates the custom role with the given ID by setting the values of the parameters passed.
harvest_update_ roleUpdates the specific role by setting the values of the parameters passed.
harvest_create_ contactCreates a new contact object.
harvest_delete_ clientDelete a client.
harvest_delete_ contactDelete a contact.
harvest_get_ contactRetrieves the contact with the given ID.
harvest_list_ contactsReturns a list of your contacts.
harvest_update_ clientUpdates the specific client by setting the values of the parameters passed.
harvest_update_ contactUpdates the specific contact by setting the values of the parameters passed.
harvest_bulk_ create_ gusto_ user_ mappingsLinks several teammates to Gusto people in one request.
harvest_create_ gusto_ sync_ runCreates and queues a time-sheet sync run for a date range or a Gusto payroll.
harvest_create_ gusto_ user_ mappingLinks a teammate to a Gusto person.
harvest_delete_ gusto_ user_ mappingUnlinks a teammate from their Gusto person.
harvest_delete_ time_ entry_ external_ referenceDelete a time entry’s external reference.
harvest_get_ gusto_ settingsReturns the account’s Gusto settings object.
harvest_get_ gusto_ sync_ runRetrieves an existing sync run.
harvest_get_ notification_ preferencesReturns the notification preferences for the authenticated user.
harvest_get_ unread_ notification_ countReturns the number of unread notifications for the authenticated user, with a breakdown by category.
harvest_list_ notificationsReturns a list of the authenticated user’s notifications, newest first.
harvest_mark_ all_ notifications_ readMarks all of the authenticated user’s unread notifications as read and returns the updated unread count.
harvest_mark_ notification_ readMarks a single notification as read and returns the updated unread count.
harvest_peek_ notificationsReturns up to six of the authenticated user’s most recent notifications, along with the unread count.
harvest_preview_ gusto_ sync_ runPreviews a time-sheet sync for a date range or a Gusto payroll.
harvest_put_ notification_ preferencesThe PUT form of harvest_update_notification_preferences: the same body, and it merges the same way (omitted keys keep their value).
harvest_update_ gusto_ settingsUpdates the FLSA workweek anchor and the sync-reminder schedule.
harvest_update_ notification_ preferencesUpdates the authenticated user’s notification preferences.
harvest_disconnect_ e_ invoicingDisconnects the company’s Peppol enrollment.
harvest_enroll_ e_ invoicingEnrolls the company as a Peppol sender.
harvest_get_ reimbursement_ settingsRetrieves the company’s expense reimbursement preferences.
harvest_update_ companyUpdates the company setting the values of the parameters passed.
harvest_update_ reimbursement_ settingsUpdates the company’s expense reimbursement preferences.
harvest_create_ importStarts a CSV import and returns the import object.
harvest_create_ taskCreates a new task object.
harvest_delete_ taskDelete a task.
harvest_download_ import_ csv_ errorsDownloads the rows that failed to import, as a text/csv file.
harvest_get_ importRetrieves the details of an existing import run.
harvest_get_ taskRetrieves the task with the given ID.
harvest_list_ importsReturns the account’s recent import runs, newest first.
harvest_revert_ importUndoes a finished import by deleting the records it created.
harvest_update_ taskUpdates the specific task by setting the values of the parameters passed.
harvest_list_ reimbursementsReturns a list of reimbursement requests, scoped to what the caller can see.
harvest_reject_ reimbursementRejects a reimbursement request.
harvest_restore_ reimbursementRestores a rejected reimbursement request, clearing its rejection reason.
harvest_list_ approvalsReturns one period’s approvals, grouped by user.
harvest_submit_ timesheet_ for_ approvalSubmits an user’s timesheet for a date range, moving their time entries and expenses in that range into the submitted bucket.
Authorize once, then an endpoint your client signs into. Nothing to deploy, and nothing to install on the Harvest side.
Open Harvest in PopMCP, click Connect Harvest, sign in and approve. If your login has several Harvest accounts, choose the one this connection is for. There is no developer app or callback URL to set up, and no Account ID to look up. If you would rather use a personal access token, it goes under More options.
your-harvest-value••••••••••••3f7aReading changes nothing, and what the AI can see follows your role in Harvest: Administrators see everything, Managers what they manage, Members their own time and expenses. Logging time, invoicing and every other change waits until an owner or admin allows write actions in PopMCP, and new connections start read-only. Each connection is locked to the one Harvest account you chose.
Drop the PopMCP URL into Claude, ChatGPT, Claude Code, Codex or any other supported client. It signs in through PopMCP with OAuth, so your Harvest credential never leaves the server.
app.popmcp.com/mcpAsk for something harmless before the agent changes anything. Writes run as soon as it calls them, so confirm it reads the right account first.
Log 2 hours to the Acme website project under Design for today, with the note "homepage review"
harvest_log_timeok
Then just ask for the work
“Log 2 hours to the Acme website project under Design for today, with the note "homepage review"”
“How many hours did the team log this month, per client, and how much of it is still unbilled?”
“Which active projects are close to their budget?”
“Create a draft invoice for Acme from last month's unbilled time and expenses, grouped by task”
One hosted endpoint, registered once per client. The same tools and the same permissions, whichever window the request comes from.
Add the PopMCP URL under Customize → Connectors and the tools appear in every chat.
The same endpoint, registered in the browser. Nothing to install on the machine you are working from.
Register PopMCP as a custom connector, then let ChatGPT read and update the account.
Wire the endpoint into Codex or the Codex CLI when a task needs live business context, not a fixture.
Register the remote MCP server in OpenCode's config for terminal-first and scripted agent runs.
Add PopMCP as an MCP server in Z.ai's desktop app and work the account from the same window.
FAQ
What teams ask before putting Harvest behind an AI client.
No. Click Connect Harvest, sign in and approve. PopMCP is already registered with Harvest ID, so there is no developer app or callback URL, and the picker lists your accounts so you never look up an Account ID. If you prefer a token, a personal access token from id.getharvest.com/developers works instead under More options, and PopMCP still finds your accounts by itself.
You choose one when you connect, and that connection only ever reaches that account. A request that names another account or token is refused. To work with a second account, connect it as a second connection.
What your Harvest role allows. Administrators reach the whole account, Managers the projects and people they manage, and Members their own time and expenses. A sign-in or a token acts as you, so PopMCP cannot widen that, and connecting with an Administrator's login gives the fullest picture.
Only if you allow write actions and ask for it. Creating an invoice makes a draft and emails nobody. Sending is a separate tool, and the AI is told to confirm with you first. New connections start read-only.
Yes. Harvest accounts track time either by duration or by start and end time, and use one 12-hour or 24-hour clock. The connector checks which your account uses, turns a start and end into hours on a duration account, and writes times the way your account expects.
Harvest allows 100 requests every 15 seconds per account, and only 100 report requests every 15 minutes. Adding up hours with the summary tool reads time entries instead of reports, so it does not use the smaller limit. When a limit is reached, the AI is told how long to wait.
No. PopMCP hosts it and gives you a Streamable HTTP MCP URL. There is nothing to deploy, no callback URL to register, and no infrastructure to keep running or patch.
Any client that supports a remote Streamable HTTP MCP server: Claude Desktop, Claude Web, Claude Code, ChatGPT custom connectors, Codex and the Codex CLI, OpenCode and Z.ai's ZCode, as well as editors such as Cursor, Windsurf and Zed. Your client signs in to PopMCP with OAuth; the provider credential never leaves the server.
Connect Harvest in PopMCP first, then run claude mcp add --transport http popmcp https://app.popmcp.com/mcp in a terminal. Inside Claude Code, run /mcp and sign in to PopMCP in the browser window it opens, ticking Harvest on the consent screen. The Harvest tools are then available in that session, and no Harvest credential is stored on your machine.
Loading 217 tool definitions into every conversation burns context before the work starts. PopMCP loads a curated 39-tool set covering the everyday workflows and keeps the rest searchable, so your AI pulls a specialist tool only when a task needs it. Every tool stays searchable, and on Scale the owner can load the full catalog for a teammate's connection.
A tool is something your AI calls, and there are 217 here. A trigger is something PopMCP watches for you: 10 Harvest events that can start work on the PopMCP side. Triggers never enter your AI client's context, and none of them ask you to paste a callback URL into Harvest.
Launch a hosted MCP endpoint for Harvest, keep tool access under control, and start testing real workflow prompts right away.