100+ integrations are ready to connect to your AI.Connect your first MCP

Harvest MCP server for your AI

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

Log 2 hours to the Acme website project under Design for today, with the note "homepage review"

Supported Harvest tools

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_invoice

Create a free-form invoice from line items you write yourself.

harvest_create_invoice_from_tracked_time

Create an invoice that pulls in a client's unbilled tracked time and expenses.

harvest_create_invoice_payment

Creates a new invoice payment object.

harvest_get_invoice

Retrieves the invoice with the given ID.

harvest_list_invoices

Returns a list of your invoices.

harvest_send_invoice_message

Creates a new invoice message object and sends it.

harvest_get_project_budget_report

Budget against spend for every project: budget, budget_spent, budget_remaining.

harvest_get_time_report_by_project

Hours and billable amounts per project for a date range.

harvest_get_time_report_by_team

Hours and billable amounts per person for a date range: use it for utilisation.

harvest_get_uninvoiced_report

What is tracked but not invoiced yet, per project: uninvoiced hours, expenses and amount for a date range.

harvest_create_project

Creates a new project object.

harvest_get_project

Retrieves the project with the given ID.

harvest_list_project_task_assignments

Returns a list of your task assignments for the project identified by PROJECT_ID.

harvest_list_project_user_assignments

Returns a list of user assignments for the project identified by PROJECT_ID.

harvest_list_projects

Returns a list of your projects.

harvest_update_project

Updates the specific project by setting the values of the parameters passed.

harvest_create_estimate

Creates a new estimate object.

harvest_get_current_user

Retrieves the currently authenticated user.

harvest_list_estimates

Returns a list of your estimates.

harvest_list_my_project_assignments

Returns a list of your active project assignments for the currently authenticated user.

harvest_list_users

Returns a list of your users.

harvest_create_expense

Creates a new expense object.

harvest_list_expense_categories

Returns a list of your expense categories.

harvest_list_expenses

Returns a list of your expenses.

harvest_create_client

Creates a new client object.

harvest_get_client

Retrieves the client with the given ID.

harvest_list_clients

Returns a list of your clients.

harvest_create_time_entry

Log time or start a timer for a project and task.

harvest_delete_time_entry

Delete a time entry.

harvest_get_time_entry

Retrieves the time entry with the given ID.

harvest_list_time_entries

Returns a list of time entries.

harvest_restart_time_entry

Restarting a time entry is only possible if it isn’t currently running.

harvest_stop_time_entry

Stopping a time entry is only possible if it’s currently running.

harvest_update_time_entry

Updates the specific time entry by setting the values of the parameters passed.

harvest_get_company

Retrieves the company for the currently authenticated user.

harvest_list_tasks

Returns a list of your tasks.

harvest_find_records

Find 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_summary

Add 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_time

Log time to Harvest, or start a timer, from a project and task name: "2 hours on Acme website, Design, today".

harvest_approve_time_off_request

Approves a pending or changes_requested request.

harvest_bulk_approve_time_off_requests

Approves every pending request in the given set.

harvest_bulk_decline_time_off_requests

Declines every pending request in the given set.

harvest_bulk_update_pto_allocations

Updates or resets per-user yearly allocation overrides for many users in one request.

harvest_cancel_time_off_request

Cancels a time off request.

harvest_create_holiday_calendar

Creates a new holiday calendar.

harvest_create_holiday_calendar_entry

Creates one or more holiday entries in a calendar.

harvest_create_time_off_policy

Creates a new time off policy.

harvest_create_time_off_request

Creates a new time off request.

harvest_create_work_schedule

Creates a new work schedule.

harvest_deactivate_work_schedule

Deactivates a non-default work schedule.

harvest_decline_time_off_request

Declines a time off request.

harvest_delete_holiday_calendar

Deletes a holiday calendar.

harvest_delete_holiday_calendar_entry

Deletes a holiday calendar entry.

harvest_delete_time_off_policy

Deletes or deactivates an existing time off policy.

harvest_get_holiday_calendar

Retrieves the details of an existing holiday calendar.

harvest_get_time_off_balances

Returns time off balances broken down per policy for a specific user and year.

harvest_get_time_off_policy

Retrieves the details of an existing time off policy.

harvest_get_time_off_request

Retrieves the details of an existing time off request.

harvest_get_work_schedule

Retrieves the details of an existing work schedule.

harvest_list_holiday_calendar_entries

Returns a list of holiday entries for the calendar identified by HOLIDAY_CALENDAR_ID.

harvest_list_holiday_calendars

Returns a list of holiday calendars.

harvest_list_pto_allocations

Returns a list of customized and yearly time off allocations across users.

harvest_list_pto_user_assignments

Returns a list of users alongside their assigned holiday calendars, assigned work schedules, and effective working hours.

harvest_list_time_off_policies

Returns a list of time off policies.

harvest_list_time_off_requests

Returns a list of time off requests.

harvest_list_work_schedules

Returns a list of work schedules.

harvest_request_time_off_changes

Requests changes on a time off request.

harvest_update_holiday_calendar

Updates an existing holiday calendar.

harvest_update_holiday_calendar_entry

Updates an existing holiday calendar entry.

harvest_update_pto_allocation

Updates or resets per-user yearly allocation overrides.

harvest_update_pto_user_assignment

Assigns or unassigns a holiday calendar and work schedule for a specific user.

harvest_update_time_off_policy

Updates an existing time off policy.

harvest_update_time_off_request

Updates an unreviewed time off request.

harvest_update_work_schedule

Updates an existing work schedule.

harvest_close_invoice

Mark an open invoice as closed (written off).

harvest_create_invoice_item_category

Creates a new invoice item category object.

harvest_delete_invoice

Delete an invoice.

harvest_delete_invoice_item_category

Delete an invoice item category.

harvest_delete_invoice_message

Delete an invoice message.

harvest_delete_invoice_payment

Delete an invoice payment.

harvest_get_e_invoice_status

Retrieves the Peppol readiness and the latest submission status for an invoice.

harvest_get_invoice_item_category

Retrieves the invoice item category with the given ID.

harvest_get_invoice_message_template

Returns the subject and body text as configured in Harvest of an invoice message for a specific invoice.

harvest_list_invoice_item_categories

Returns a list of your invoice item categories.

harvest_list_invoice_messages

Returns a list of messages associated with a given invoice.

harvest_list_invoice_payments

Returns a list of payments associate with a given invoice.

harvest_mark_invoice_draft

Move an open invoice back to draft.

harvest_mark_invoice_sent

Mark a draft invoice as sent, with no email.

harvest_reopen_invoice

Re-open a closed (written-off) invoice.

harvest_send_e_invoice

Sends an invoice over the Peppol network.

harvest_update_invoice

Updates the specific invoice by setting the values of the parameters passed.

harvest_update_invoice_item_category

Updates the specific invoice item category by setting the values of the parameters passed.

harvest_create_report_export

Creates a report export.

harvest_create_saved_report

Creates a saved report.

harvest_delete_saved_report

Deletes a saved report.

harvest_download_report_export

Serves the completed export file with attachment headers, and returns a 200 OK response code.

harvest_generate_report

Runs a report definition supplied in the request.

harvest_get_expense_detailed_report

Expenses row by row for a date range, with totals per currency.

harvest_get_expense_report_by_category

Expense totals per expense category for a date range.

harvest_get_expense_report_by_client

Expense totals per client for a date range.

harvest_get_expense_report_by_project

Expense totals per project for a date range.

harvest_get_expense_report_by_team

Expense totals per person for a date range.

harvest_get_profitability_report

Revenue, costs and margin for a date range, grouped by project, client, team or task.

harvest_get_report_export

Retrieves the status of an export.

harvest_get_saved_report

Retrieves a saved report.

harvest_get_time_detailed_report

Time entries row by row for a date range, with totals: who, client, project, task, hours and amounts.

harvest_get_time_report_by_client

Hours and billable amounts per client for a date range.

harvest_get_time_report_by_task

Hours and billable amounts per task for a date range.

harvest_list_saved_reports

Returns a list of saved reports, ordered by updated_at descending, then id descending.

harvest_run_saved_report

Runs the stored definition of a saved report.

harvest_update_saved_report

Updates a saved report.

harvest_create_task_assignment

Creates a new task assignment object.

harvest_create_user_assignment

Creates a new user assignment object.

harvest_delete_project

Deletes a project and any time entries or expenses tracked to it.

harvest_delete_task_assignment

Delete a task assignment.

harvest_delete_user_assignment

Delete an user assignment.

harvest_get_task_assignment

Retrieves the task assignment with the given ID.

harvest_get_user_assignment

Retrieves the user assignment with the given ID.

harvest_list_tags

Returns the tag vocabulary for the account.

harvest_list_task_assignments

Returns a list of your task assignments.

harvest_list_user_assignments

Returns a list of your projects user assignments, active and archived.

harvest_update_task_assignment

Updates the specific task assignment by setting the values of the parameters passed.

harvest_update_user_assignment

Updates the specific user assignment by setting the values of the parameters passed.

harvest_archive_user

Archive an user (is_active false): they can no longer sign in, and their history stays.

harvest_create_estimate_item_category

Creates a new estimate item category object.

harvest_create_estimate_message

Creates a new estimate message object.

harvest_create_user

Creates a new user object and sends an invitation email to the address specified in the email parameter.

harvest_create_user_billable_rate

Creates a new billable rate object.

harvest_create_user_cost_rate

Creates a new cost rate object.

harvest_delete_estimate

Delete an estimate.

harvest_delete_estimate_item_category

Delete an estimate item category.

harvest_delete_estimate_message

Delete an estimate message.

harvest_delete_user

Delete an user.

harvest_get_estimate

Retrieves the estimate with the given ID.

harvest_get_estimate_item_category

Retrieves the estimate item category with the given ID.

harvest_get_user

Retrieves the user with the given ID.

harvest_get_user_billable_rate

Retrieves the billable rate with the given ID.

harvest_get_user_cost_rate

Retrieves the cost rate with the given ID.

harvest_list_estimate_item_categories

Returns a list of your estimate item categories.

harvest_list_estimate_messages

Returns a list of messages associated with a given estimate.

harvest_list_user_billable_rates

Returns a list of billable rates for the user identified by USER_ID.

harvest_list_user_cost_rates

Returns a list of cost rates for the user identified by USER_ID.

harvest_list_user_project_assignments

Returns a list of active project assignments for the user identified by USER_ID.

harvest_list_user_teammates

Returns a list of assigned teammates for the user identified by USER_ID.

harvest_mark_estimate_accepted

Mark an open estimate as accepted.

harvest_mark_estimate_declined

Mark an open estimate as declined.

harvest_mark_estimate_sent

Mark a draft estimate as sent, with no email.

harvest_reopen_estimate

Re-open a closed estimate.

harvest_update_estimate

Updates the specific estimate by setting the values of the parameters passed.

harvest_update_estimate_item_category

Updates the specific estimate item category by setting the values of the parameters passed.

harvest_update_user

Updates the specific user by setting the values of the parameters passed.

harvest_update_user_teammates

Updates the the assigned teammates for a specific user.

harvest_approve_expense

Approves a submitted expense, with the same effect as the Approvals page’s approve action.

harvest_attach_expense_receipt

Attach or replace the receipt on an existing expense.

harvest_create_expense_category

Creates a new expense category object.

harvest_create_expense_with_receipt

Create an expense and attach a receipt file in one step.

harvest_delete_expense

Delete an expense.

harvest_delete_expense_category

Delete an expense category.

harvest_get_expense

Retrieves the expense with the given ID.

harvest_get_expense_category

Retrieves the expense category with the given ID.

harvest_update_expense

Updates the specific expense by setting the values of the parameters passed.

harvest_update_expense_category

Updates the specific expense category by setting the values of the parameters passed.

harvest_withdraw_expense

Withdraws an approved expense, returning it to submitted status, with the same effect as the Approvals page’s withdraw action.

harvest_create_custom_role

Creates a custom role.

harvest_create_role

Creates a new role object.

harvest_delete_custom_role

Deletes the custom role with the given ID.

harvest_delete_role

Delete a role.

harvest_get_custom_role

Retrieves the custom role with the given ID.

harvest_get_role

Retrieves the role with the given ID.

harvest_list_custom_roles

Returns a list of the account’s custom roles, sorted by descending ID.

harvest_list_permissions

Returns the account’s permission catalogue, sorted by ascending ID.

harvest_list_roles

Returns a list of roles in the account.

harvest_update_custom_role

Updates the custom role with the given ID by setting the values of the parameters passed.

harvest_update_role

Updates the specific role by setting the values of the parameters passed.

harvest_create_contact

Creates a new contact object.

harvest_delete_client

Delete a client.

harvest_delete_contact

Delete a contact.

harvest_get_contact

Retrieves the contact with the given ID.

harvest_list_contacts

Returns a list of your contacts.

harvest_update_client

Updates the specific client by setting the values of the parameters passed.

harvest_update_contact

Updates the specific contact by setting the values of the parameters passed.

harvest_bulk_create_gusto_user_mappings

Links several teammates to Gusto people in one request.

harvest_create_gusto_sync_run

Creates and queues a time-sheet sync run for a date range or a Gusto payroll.

harvest_create_gusto_user_mapping

Links a teammate to a Gusto person.

harvest_delete_gusto_user_mapping

Unlinks a teammate from their Gusto person.

harvest_delete_time_entry_external_reference

Delete a time entry’s external reference.

harvest_get_gusto_settings

Returns the account’s Gusto settings object.

harvest_get_gusto_sync_run

Retrieves an existing sync run.

harvest_get_notification_preferences

Returns the notification preferences for the authenticated user.

harvest_get_unread_notification_count

Returns the number of unread notifications for the authenticated user, with a breakdown by category.

harvest_list_notifications

Returns a list of the authenticated user’s notifications, newest first.

harvest_mark_all_notifications_read

Marks all of the authenticated user’s unread notifications as read and returns the updated unread count.

harvest_mark_notification_read

Marks a single notification as read and returns the updated unread count.

harvest_peek_notifications

Returns up to six of the authenticated user’s most recent notifications, along with the unread count.

harvest_preview_gusto_sync_run

Previews a time-sheet sync for a date range or a Gusto payroll.

harvest_put_notification_preferences

The PUT form of harvest_update_notification_preferences: the same body, and it merges the same way (omitted keys keep their value).

harvest_update_gusto_settings

Updates the FLSA workweek anchor and the sync-reminder schedule.

harvest_update_notification_preferences

Updates the authenticated user’s notification preferences.

harvest_disconnect_e_invoicing

Disconnects the company’s Peppol enrollment.

harvest_enroll_e_invoicing

Enrolls the company as a Peppol sender.

harvest_get_reimbursement_settings

Retrieves the company’s expense reimbursement preferences.

harvest_update_company

Updates the company setting the values of the parameters passed.

harvest_update_reimbursement_settings

Updates the company’s expense reimbursement preferences.

harvest_create_import

Starts a CSV import and returns the import object.

harvest_create_task

Creates a new task object.

harvest_delete_task

Delete a task.

harvest_download_import_csv_errors

Downloads the rows that failed to import, as a text/csv file.

harvest_get_import

Retrieves the details of an existing import run.

harvest_get_task

Retrieves the task with the given ID.

harvest_list_imports

Returns the account’s recent import runs, newest first.

harvest_revert_import

Undoes a finished import by deleting the records it created.

harvest_update_task

Updates the specific task by setting the values of the parameters passed.

harvest_list_reimbursements

Returns a list of reimbursement requests, scoped to what the caller can see.

harvest_reject_reimbursement

Rejects a reimbursement request.

harvest_restore_reimbursement

Restores a rejected reimbursement request, clearing its rejection reason.

harvest_list_approvals

Returns one period’s approvals, grouped by user.

harvest_submit_timesheet_for_approval

Submits an user’s timesheet for a date range, moving their time entries and expenses in that range into the submitted bucket.

Connect Harvest to Claude, ChatGPT and Claude Code

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.

How you connectyour-harvest-value
Personal access token (instead of signing in)••••••••••••3f7a
Authorize PopMCP on HarvestAuthorize

Then just ask for the work

  • “Log 2 hours to the Acme website project under Design for today, with the note "homepage review"”

    • log_time
  • “How many hours did the team log this month, per client, and how much of it is still unbilled?”

    • get_time_summary
    • get_uninvoiced_report
  • “Which active projects are close to their budget?”

    • get_project_budget_report
  • “Create a draft invoice for Acme from last month's unbilled time and expenses, grouped by task”

    • find_records
    • get_uninvoiced_report
    • create_invoice_from_tracked_time

Use Harvest from the assistant you already open

One hosted endpoint, registered once per client. The same tools and the same permissions, whichever window the request comes from.

Claude DesktopCustom connector

Add the PopMCP URL under Customize → Connectors and the tools appear in every chat.

Claude WebCustom connector

The same endpoint, registered in the browser. Nothing to install on the machine you are working from.

ChatGPTCustom connector

Register PopMCP as a custom connector, then let ChatGPT read and update the account.

CodexDesktop & CLI

Wire the endpoint into Codex or the Codex CLI when a task needs live business context, not a fixture.

OpenCodeCoding agent

Register the remote MCP server in OpenCode's config for terminal-first and scripted agent runs.

ZCodeDesktop app

Add PopMCP as an MCP server in Z.ai's desktop app and work the account from the same window.

Harvest MCP server questions

What teams ask before putting Harvest behind an AI client.

Do I need a Harvest API token or Account ID?

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.

My login has several Harvest accounts. What happens?

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 can the AI see?

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.

Can it send invoices to my clients?

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.

Does it handle accounts that track start and end times?

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.

Are there rate limits?

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.

Do I have to run or host the Harvest MCP server myself?

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.

Which AI clients can use this MCP server?

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.

How do I connect Harvest to Claude Code?

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.

Why do only 39 of the 217 tools load by default?

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.

What is the difference between a tool and a trigger?

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.

Connect Harvest to your AI in minutes

Launch a hosted MCP endpoint for Harvest, keep tool access under control, and start testing real workflow prompts right away.

Connect your first MCP