# Harvest — MCP server on mcp.ai > Harvest is a time-tracking and invoicing tool designed for teams and freelancers, helping them log billable hours, manage projects, and streamline payments By: mcp.ai · official Page: https://mcp.ai/harvest ## Connect (MCP protocol) Remote MCP endpoint (HTTP, streamable): https://api.mcp.ai/p_harvest?ms=1781543520000 Add it as a custom/remote MCP connector, then authenticate when prompted. ## REST API (no MCP client required) Every tool is also a REST endpoint, authed with a workspace API key. Discover: GET https://api.mcp.ai/api/harvest/_endpoints # public; lists every endpoint Call: POST https://api.mcp.ai/api/harvest/ Authorization: Bearer sk_live_… # create one at https://mcp.ai/settings/api-keys Content-Type: application/json Body: { …args } → { "ok": true, "tool": "", "result": { … } } ## Developer docs How to use (MCP or REST), markdown: https://mcp.ai/harvest/skill.md Postman collection (v2.1): https://mcp.ai/harvest/postman.json ## Tools - harvest_create_client(name: string, address?: string, currency?: string, is_active?: boolean) — Tool to create a new client. use after gathering client details to register a new client in harvest. - harvest_create_client_contact(fax?: string, email?: string, title?: string, client_id: integer, last_name?: string, first_name: string, phone_mobile?: string, phone_office?: string) — Tool to create a new client contact. use when you need to add a contact under an existing client. call after you've retrieved or confirmed the client id. - harvest_create_estimate(tax?: number, tax2?: number, notes?: string, number?: string, subject?: string, currency?: string, discount?: number, client_id: integer, issue_date?: string, line_items?: object[], purchase_order?: string) — Tool to create a new estimate. use after gathering client and line item details. - harvest_create_estimate_item_category(name: string) — Tool to create a new estimate item category in harvest. use after deciding to categorize line items within an estimate. - harvest_create_estimate_message(body?: string, subject?: string, event_type?: string, recipients?: object[], estimate_id: integer, send_me_a_copy?: boolean) — Tool to create a new message for an estimate. use when you have an estimate id and want to send a message or run an event (send, accept, decline, re-open) on the estimate. - harvest_create_expense(notes?: string, units?: number, receipt?: string, user_id?: integer, billable?: boolean, project_id: integer, spent_date: string, total_cost?: number, expense_category_id: integer) — Tool to create a new expense entry. use when recording costs against projects. ensure either units or total cost is provided. - harvest_create_invoice(tax?: number, tax2?: number, notes?: string, state?: string, number?: string, subject?: string, currency?: string, discount?: number, due_date?: string, client_id: integer, issue_date?: string, line_items: object[], purchase_order?: string) — Tool to create a new invoice. use when you have gathered all invoice details and need to bill a client in harvest. - harvest_create_invoice_item_category(name: string) — Tool to create a new invoice item category. use after you have decided on the category name to register it in harvest. - harvest_create_invoice_message(body?: string, subject?: string, thank_you?: boolean, attach_pdf?: boolean, event_type?: string, invoice_id: integer, recipients?: object[], send_me_a_copy?: boolean, include_link_to_client_invoice?: boolean) — Tool to create a new message for an invoice. use after confirming the invoice id when you need to notify a client with invoice details. - harvest_create_invoice_payment(notes?: string, amount: number, paid_at?: string, paid_date?: string, invoice_id: integer, send_thank_you?: boolean) — Tool to create a new payment on an invoice. use when recording a payment against an existing invoice. - harvest_create_project(fee?: number, code?: string, name: string, notes?: string, budget?: number, bill_by?: string, ends_on?: string, budget_by?: string, client_id: integer, is_active?: boolean, starts_on?: string, cost_budget?: number, hourly_rate?: number, is_billable?: boolean, is_fixed_fee?: boolean, budget_is_monthly?: boolean, show_budget_to_all?: boolean, notify_when_over_budget?: boolean, cost_budget_include_expenses?: boolean, over_budget_notification_percentage?: number) — Tool to create a new project. use after confirming the client exists. - harvest_create_task(name: string, is_active?: boolean, is_default?: boolean, billable_by_default?: boolean, default_hourly_rate?: number) — Tool to create a new task. use after identifying task details to register it in harvest. - harvest_create_time_entry(hours?: number, notes?: string, task_id: integer, user_id?: integer, ended_time?: string, project_id: integer, spent_date: string, started_time?: string, external_reference?: object) — Tool to create a new time entry. use when logging hours for a project by specifying start/end times or duration. - harvest_create_user(email: string, roles?: string[], timezone?: string, cost_rate?: number, is_active?: boolean, last_name: string, first_name: string, access_roles?: string[], is_contractor?: boolean, weekly_capacity?: integer, default_hourly_rate?: number, has_access_to_all_future_projects?: boolean) — Tool to create a new user. use after gathering user details to invite them to harvest. - harvest_delete_client(client_id: integer) — Tool to delete a client. use when you need to remove a client that has no associated projects, invoices, or estimates. call after confirming the client id exists and has no dependent resources. - harvest_delete_client_contact(contact_id: integer) — Tool to delete a client contact. use when you need to remove a contact that is no longer relevant. call after confirming the contact id exists. - harvest_delete_estimate(estimate_id: integer) — Tool to delete an estimate. use when you need to remove an estimate that is no longer needed. call after confirming the estimate id exists and has no dependent resources. - harvest_delete_estimate_message(message_id: integer, estimate_id: integer) — Tool to delete an estimate message. use when you need to remove a message from an estimate. call after confirming estimate id and message id are correct. - harvest_delete_invoice(invoice_id: integer) — Tool to delete an invoice. use when you need to remove an invoice that has no associated payments. call after confirming the invoice id exists. - harvest_delete_invoice_item_category(invoice_item_category_id: integer) — Tool to delete an invoice item category. use when you need to remove an obsolete or incorrect invoice item category. call after confirming the invoice item category id exists. - harvest_delete_invoice_message(invoice_id: integer, message_id: integer) — Tool to delete a message from an invoice. use when you need to remove a specific message that is no longer relevant. call after confirming the invoice id and message id. - harvest_delete_invoice_payment(invoice_id: integer, payment_id: integer) — Tool to delete an invoice payment. use when you need to remove a payment from an invoice after confirming payment details. - harvest_delete_project(project_id: integer) — Tool to delete a project. use when you need to remove a project and all its associated time entries and expenses; invoices remain intact. call after confirming the project id exists. - harvest_delete_task(task_id: integer) — Tool to delete a task. use when you need to remove a task that has no associated time entries. call after confirming the task id exists and has no dependent time entries. - harvest_delete_time_entry(time_entry_id: integer) — Tool to delete a time entry. use when removing an existing time entry that is deletable (not closed or on archived projects/tasks). call after confirming the time entry id exists. - harvest_delete_user(user_id: integer) — Tool to delete a user. use when you need to remove a user that has no associated time entries or expenses. call after confirming the user id exists and has no dependent time entries or expenses. - harvest_get_client(client_id: integer) — Tool to retrieve a specific client by id. use when you need details of a client before invoicing or reporting. - harvest_get_client_contact(client_id: integer, contact_id: integer) — Tool to retrieve a specific client contact. use when you have client id and contact id to fetch and verify contact details. - harvest_get_company_info() — Tool to retrieve information about the authenticated user's company. use after authentication to fetch company settings for display or configuration. - harvest_get_estimate(estimate_id: integer) — Tool to retrieve a specific estimate by id. use after confirming the estimate id. example: "get estimate with id 123456". - harvest_get_invoice(invoice_id: integer) — Tool to retrieve a specific invoice by id. use when you need the full details of an invoice after selecting or creating it. example: 'get invoice with id 13150378.' - harvest_get_project(project_id: integer) — Tool to retrieve a specific harvest project by id. use when you have a project id and need its details. - harvest_get_task(task_id: integer) — Tool to retrieve a specific task by id. use when you have a task id and need its detailed information. - harvest_get_time_entry(time_entry_id: integer) — Tool to retrieve a single time entry by id. use when you have a specific time entry id and need its full details. - harvest_get_user(user_id: integer) — Tool to retrieve a specific user by id. use after obtaining a valid user id (for example via list users). example: "get details of user 3230547". - harvest_list_client_contacts(page?: integer, per_page?: integer, client_id?: integer, updated_since?: string) — Tool to list client contacts. use when you need to retrieve contacts with optional filtering and pagination. - harvest_list_clients(page?: integer, per_page?: integer, is_active?: boolean, updated_since?: string) — Tool to list clients. use when you need to retrieve a paginated list of clients from harvest. ensure you have a valid access token in metadata before calling. - harvest_list_estimate_messages(page?: integer, per_page?: integer, estimate_id: integer, updated_since?: string) — Tool to list messages for an estimate. use after obtaining an estimate id to retrieve associated messages, supports pagination and filtering by update time. - harvest_list_expense_categories(page?: integer, per_page?: integer, is_active?: boolean, updated_since?: string) — Tool to list expense categories. use when you need to retrieve a paginated list of expense categories, optionally filtering by active status or last update timestamp. - harvest_list_invoice_item_categories(page?: integer, per_page?: integer, updated_since?: string) — Tool to retrieve invoice item categories. use when you need to fetch a paginated list of invoice item categories in harvest. - harvest_list_invoice_messages(page?: integer, per_page?: integer, invoice_id: integer, updated_since?: string) — Tool to list messages associated with a given invoice. use when you need to retrieve invoice messages with optional filtering by update time and pagination. - harvest_list_invoice_payments(page?: integer, per_page?: integer, invoice_id: integer, updated_since?: string) — Tool to retrieve payments for a specific invoice. use when you need to list all payments applied to an invoice after confirming the invoice exists. - harvest_list_invoices(page?: integer, state?: string, to_date?: string, per_page?: integer, client_id?: integer, from_date?: string, project_id?: integer, updated_since?: string) — Tool to list invoices. use when you need to retrieve invoices filtered by client, project, date range, or state. example: 'list invoices for client 5735776 from 2023-01-01 to 2023-01-31.' - harvest_list_projects(page?: integer, client?: integer, per_page?: integer, updated_since?: string) — Tool to list projects. use when you need to retrieve a paginated list of projects from harvest. ensure a valid access token is present in metadata before calling. - harvest_list_tasks(page?: integer, per_page?: integer, is_active?: boolean, is_default?: boolean, updated_since?: string) — Tool to list tasks. use when you need to retrieve a paginated list of tasks from harvest. ensure you have a valid access token in metadata before calling. - harvest_list_time_entries(to?: string, page?: integer, task_id?: integer, user_id?: integer, per_page?: integer, client_id?: integer, from_date?: string, is_billed?: boolean, is_running?: boolean, project_id?: integer, updated_since?: string, external_reference_id?: string) — Tool to retrieve a list of time entries. use when you need to fetch tracked hours with filters or date ranges for reporting or invoicing. example: "list time entries for project 123 between 2023-01-01 - harvest_list_users(page?: integer, per_page?: integer, is_active?: boolean, updated_since?: string) — Tool to list users. use when you need to retrieve a paginated list of users from harvest. - harvest_update_client(name?: string, address?: string, currency?: string, client_id: integer, is_active?: boolean) — Tool to update an existing client. use after retrieving client details to modify its properties. supports partial updates; omit fields to leave them unchanged. - harvest_update_client_contact(email?: string, title?: string, last_name?: string, contact_id: integer, first_name?: string, phone_mobile?: string, phone_office?: string) — Tool to update a client contact. use when you have a contact id and need to modify its details. - harvest_update_company_info(name?: string, currency?: string, timezone?: string, color_scheme?: string, decimal_symbol?: string, week_start_day?: string, thousands_separator?: string) — Tool to update information about the company. use to modify company settings such as name, timezone, or formatting options. use after obtaining current settings to apply changes. - harvest_update_estimate(tax?: number, tax2?: number, notes?: string, number?: string, subject?: string, currency?: string, discount?: number, client_id?: integer, issue_date?: string, line_items?: object[], estimate_id: integer, purchase_order?: string) — Tool to update an existing estimate. use when you need to modify specific fields of an estimate; omit parameters to leave other fields unchanged. - harvest_update_estimate_item_category(name?: string, estimate_item_category_id: integer) — Tool to update an estimate item category. use after retrieving the category to change its name. - harvest_update_expense(notes?: string, units?: number, billable?: boolean, expense_id: integer, project_id?: integer, spent_date?: string, total_cost?: number, delete_receipt?: boolean, expense_category_id?: integer) — Tool to update an existing expense. use after retrieving an expense to modify project, category, date, cost, or delete a receipt; omit fields to leave unchanged. - harvest_update_invoice(tax?: number, tax2?: number, notes?: string, number?: string, subject?: string, currency?: string, discount?: number, due_date?: string, client_id?: integer, invoice_id: integer, issue_date?: string, line_items?: object[], estimate_id?: integer, retainer_id?: integer, payment_term?: string, purchase_order?: string, payment_options?: string[]) — Tool to update an existing invoice. use after retrieving invoice details to modify its fields. supports partial updates; omit fields to leave unchanged. - harvest_update_project(fee?: number, code?: string, name?: string, notes?: string, budget?: number, bill_by?: string, ends_on?: string, budget_by?: string, client_id?: integer, is_active?: boolean, starts_on?: string, project_id: integer, cost_budget?: number, hourly_rate?: number, is_billable?: boolean, is_fixed_fee?: boolean, budget_is_monthly?: boolean, show_budget_to_all?: boolean, notify_when_over_budget?: boolean, cost_budget_include_expenses?: boolean, over_budget_notification_percentage?: number) — Tool to update an existing project. use when you need to modify one or more fields of a project by its id. invoke after confirming the project id and desired changes. - harvest_update_task(name?: string, task_id: integer, is_active?: boolean, is_default?: boolean, billable_by_default?: boolean, default_hourly_rate?: number) — Tool to update an existing task. use after retrieving task details to modify its attributes such as name, billing defaults, or status. supports partial updates; omit fields to leave them unchanged. - harvest_update_time_entry(hours?: number, notes?: string, task_id?: integer, ended_time?: string, project_id?: integer, spent_date?: string, started_time?: string, time_entry_id: integer) — Tool to update an existing time entry. use after retrieving the entry to adjust hours, notes, project, or task details. supports partial updates; omit fields to leave unchanged. - harvest_update_user(email?: string, roles?: string[], user_id: integer, timezone?: string, is_active?: boolean, last_name?: string, first_name?: string, access_roles?: string[], is_contractor?: boolean, weekly_capacity?: integer, has_access_to_all_future_projects?: boolean) — Tool to update an existing user. use when you need to modify a user's profile or settings after confirming the user id. ## Links Docs: https://mcp.ai/docs/mcps/harvest Website: https://mcp.ai/mcps/harvest