# io.usefulapi/harvest (remote · harvest.usefulapi.io)

Read time entries, projects, clients, tasks and invoices; log and update tracked time.

- Trust score: 70/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `harvest.usefulapi.io`: 70/100 (this document), [markdown](https://verifymcp.io/servers/io-usefulapi-harvest/harvest.md), [page](https://verifymcp.io/servers/io-usefulapi-harvest/harvest)

## Channel facts

- Endpoint: `https://harvest.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 78/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS not yet verified: we couldn't determine whether a plaintext access path exists.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 79/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2204 tokens (~110/item across 20 items; 20 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 3/100
  - Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http io-usefulapi-harvest https://harvest.usefulapi.io/mcp
```

### Codex

```toml
[mcp_servers.io-usefulapi-harvest]
url = "https://harvest.usefulapi.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-usefulapi-harvest": {
      "type": "remote",
      "url": "https://harvest.usefulapi.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-usefulapi-harvest --url https://harvest.usefulapi.io/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-usefulapi-harvest:
    url: "https://harvest.usefulapi.io/mcp"
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-harvest": {
      "type": "http",
      "url": "https://harvest.usefulapi.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 70, 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-08-02 (score 70, +52)

- [security improvement] Authorization: unverified → pass
- [security improvement] Transport: fail → pass
- [security] First check of Authorization: partial
- [functional regression] MCP protocol: unverified → fail
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: excellent
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 100
- [functional] First check of Schema quality: fail

### 2026-08-01 (score 18)

First indexed and scored.

## MCP tools (20)

### `harvest_list_time_entries` (~238 tokens)

List time entries

List time entries, optionally filtered by user, project, client, task, date range, running/billed status, or updated-since. Paginated. Harvest REST: GET /time_entries.

Input parameters:

- `client_id` (integer): Filter to a single client id.
- `from` (string): Only entries on/after this date, yyyy-mm-dd.
- `is_billed` (boolean): Only billed (true) or unbilled (false) entries.
- `is_running` (boolean): Only running (true) or only stopped (false) entries.
- `page` (integer): Page number (1-based) for pagination.
- `per_page` (integer): Results per page (1–2000, Harvest default 2000).
- `project_id` (integer): Filter to a single project id.
- `task_id` (integer): Filter to a single task id.
- `to` (string): Only entries on/before this date, yyyy-mm-dd.
- `updated_since` (string): Only entries updated since this ISO-8601 datetime.
- `user_id` (integer): Filter to a single user id.

### `harvest_get_time_entry` (~43 tokens)

Get time entry

Retrieve a single time entry by id. Harvest REST: GET /time_entries/{id}.

Input parameters:

- `time_entry_id` (integer, required): The time entry id (required).

### `harvest_list_projects` (~123 tokens)

List projects

List projects, optionally filtered by active status or client, or updated-since. Paginated. Harvest REST: GET /projects.

Input parameters:

- `client_id` (integer): Filter to a single client id.
- `is_active` (boolean): Only active (true) or archived (false) projects.
- `page` (integer): Page number (1-based) for pagination.
- `per_page` (integer): Results per page (1–2000, Harvest default 2000).
- `updated_since` (string): Only projects updated since this ISO-8601 datetime.

### `harvest_get_project` (~38 tokens)

Get project

Retrieve a single project by id. Harvest REST: GET /projects/{id}.

Input parameters:

- `project_id` (integer, required): The project id (required).

### `harvest_list_clients` (~106 tokens)

List clients

List clients, optionally filtered by active status or updated-since. Paginated. Harvest REST: GET /clients.

Input parameters:

- `is_active` (boolean): Only active (true) or archived (false) clients.
- `page` (integer): Page number (1-based) for pagination.
- `per_page` (integer): Results per page (1–2000, Harvest default 2000).
- `updated_since` (string): Only clients updated since this ISO-8601 datetime.

### `harvest_get_client` (~38 tokens)

Get client

Retrieve a single client by id. Harvest REST: GET /clients/{id}.

Input parameters:

- `client_id` (integer, required): The client id (required).

### `harvest_list_tasks` (~122 tokens)

List tasks

List tasks (the billable/non-billable work categories that can be assigned to projects), optionally filtered by active status or updated-since. Paginated. Harvest REST: GET /tasks.

Input parameters:

- `is_active` (boolean): Only active (true) or archived (false) tasks.
- `page` (integer): Page number (1-based) for pagination.
- `per_page` (integer): Results per page (1–2000, Harvest default 2000).
- `updated_since` (string): Only tasks updated since this ISO-8601 datetime.

### `harvest_list_users` (~109 tokens)

List users

List users in the account, optionally filtered by active status or updated-since. Paginated. Harvest REST: GET /users.

Input parameters:

- `is_active` (boolean): Only active (true) or archived (false) users.
- `page` (integer): Page number (1-based) for pagination.
- `per_page` (integer): Results per page (1–2000, Harvest default 2000).
- `updated_since` (string): Only users updated since this ISO-8601 datetime.

### `harvest_get_current_user` (~32 tokens)

Get current user

Retrieve the currently authenticated user (whom the access token belongs to). Harvest REST: GET /users/me.

### `harvest_list_project_assignments` (~101 tokens)

List my project assignments

List the authenticated user's active project assignments — the projects and their assignable tasks the current user can log time against (use this to find the project_id + task_id for harvest_create_time_entry). Paginated. Harvest REST: GET /users/me/project_assignments.

Input parameters:

- `page` (integer): Page number (1-based) for pagination.
- `per_page` (integer): Results per page (1–2000, Harvest default 2000).

### `harvest_list_invoices` (~181 tokens)

List invoices

List invoices, optionally filtered by client, project, state, date range, or updated-since. Paginated. Harvest REST: GET /invoices.

Input parameters:

- `client_id` (integer): Filter to a single client id.
- `from` (string): Only invoices issued on/after this date, yyyy-mm-dd.
- `page` (integer): Page number (1-based) for pagination.
- `per_page` (integer): Results per page (1–2000, Harvest default 2000).
- `project_id` (integer): Filter to a single project id.
- `state` (string): Filter by invoice state: draft, open, paid or closed.
- `to` (string): Only invoices issued on/before this date, yyyy-mm-dd.
- `updated_since` (string): Only invoices updated since this ISO-8601 datetime.

### `harvest_get_invoice` (~44 tokens)

Get invoice

Retrieve a single invoice by id, including its line items. Harvest REST: GET /invoices/{id}.

Input parameters:

- `invoice_id` (integer, required): The invoice id (required).

### `harvest_list_estimates` (~165 tokens)

List estimates

List estimates, optionally filtered by client, state, date range, or updated-since. Paginated. Harvest REST: GET /estimates.

Input parameters:

- `client_id` (integer): Filter to a single client id.
- `from` (string): Only estimates issued on/after this date, yyyy-mm-dd.
- `page` (integer): Page number (1-based) for pagination.
- `per_page` (integer): Results per page (1–2000, Harvest default 2000).
- `state` (string): Filter by estimate state: draft, sent, accepted or declined.
- `to` (string): Only estimates issued on/before this date, yyyy-mm-dd.
- `updated_since` (string): Only estimates updated since this ISO-8601 datetime.

### `harvest_list_expenses` (~198 tokens)

List expenses

List expenses, optionally filtered by user, client, project, date range, billed status, or updated-since. Paginated. Harvest REST: GET /expenses.

Input parameters:

- `client_id` (integer): Filter to a single client id.
- `from` (string): Only expenses on/after this date, yyyy-mm-dd.
- `is_billed` (boolean): Only billed (true) or unbilled (false) expenses.
- `page` (integer): Page number (1-based) for pagination.
- `per_page` (integer): Results per page (1–2000, Harvest default 2000).
- `project_id` (integer): Filter to a single project id.
- `to` (string): Only expenses on/before this date, yyyy-mm-dd.
- `updated_since` (string): Only expenses updated since this ISO-8601 datetime.
- `user_id` (integer): Filter to a single user id.

### `harvest_get_company` (~40 tokens)

Get company

Retrieve the company/account settings for the authenticated account (name, currency, time/date formats, week start, feature flags). Harvest REST: GET /company.

### `harvest_create_time_entry` (~260 tokens)

Create time entry

Create a time entry. Requires project_id, task_id and spent_date. Provide `hours` to log a specific duration; OR provide `started_time` (+ optional `ended_time`) for a timestamped entry; OR omit both to start a running timer (on a timestamp-tracking account). Use harvest_list_project_assignments to find valid project_id + task_id. Harvest REST: POST /time_entries. WRITE — creates data.

Input parameters:

- `ended_time` (string): End time for a timestamped entry, e.g. '9:30am'.
- `hours` (number): Duration in decimal hours, e.g. 1.5. Omit to start a running timer.
- `notes` (string): Notes for the time entry.
- `project_id` (integer, required): The project id to log time against (required).
- `spent_date` (string, required): The date the time was spent, yyyy-mm-dd (required).
- `started_time` (string): Start time for a timestamped entry, e.g. '8:00am'.
- `task_id` (integer, required): The task id within the project (required).
- `user_id` (integer): Log on behalf of another user (defaults to the authenticated user; requires permission).

### `harvest_update_time_entry` (~185 tokens)

Update time entry

Update an existing time entry's hours, notes, spent date, or project/task. Only the fields you provide are changed. Harvest REST: PATCH /time_entries/{id}. WRITE — modifies data.

Input parameters:

- `ended_time` (string): Change the end time, e.g. '9:30am'.
- `hours` (number): Change the duration in decimal hours, e.g. 2.25.
- `notes` (string): Change the notes.
- `project_id` (integer): Reassign to a different project id.
- `spent_date` (string): Change the date, yyyy-mm-dd.
- `started_time` (string): Change the start time, e.g. '8:00am'.
- `task_id` (integer): Reassign to a different task id.
- `time_entry_id` (integer, required): The time entry id to update (required).

### `harvest_stop_time_entry` (~61 tokens)

Stop running time entry

Stop a currently running time entry (no-op error if it is already stopped). Harvest REST: PATCH /time_entries/{id}/stop. WRITE — modifies data.

Input parameters:

- `time_entry_id` (integer, required): The running time entry id to stop (required).

### `harvest_restart_time_entry` (~64 tokens)

Restart stopped time entry

Restart a previously stopped time entry, resuming its timer (error if it is already running). Harvest REST: PATCH /time_entries/{id}/restart. WRITE — modifies data.

Input parameters:

- `time_entry_id` (integer, required): The stopped time entry id to restart (required).

### `harvest_delete_time_entry` (~56 tokens)

Delete time entry

Permanently delete a time entry by id. This cannot be undone. Harvest REST: DELETE /time_entries/{id}. WRITE — destroys data.

Input parameters:

- `time_entry_id` (integer, required): The time entry id to delete (required).

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-usefulapi-harvest/harvest#diagnostics

## Score history

- 2026-08-03: 70
- 2026-08-02: 70
- 2026-08-01: 18

## Links

- Remote endpoint: https://harvest.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-harvest/harvest/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-harvest/harvest/changelog.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-harvest/harvest
