Harvest ACTION
List Time Entries
Retrieve a list of time entries from Harvest, with optional filters, automatically following pagination up to 200 entries. Use this to discover time entry IDs for Get Time Entry, Update Time Entry, or Delete Time Entry. For a pure "how many entries are there" question, set
countOnly to skip fetching any entries and just return the true total — safe even on a huge, unfiltered result set that would otherwise exceed the response-size limit. Pass notes to filter results to entries whose notes contain that text (client-side, case-insensitive substring) — useful for finding one entry inside a large result set without hitting the output-size limit. Example: call with projectId set to a project's ID and from/to set to a date range to total up hours logged that week. See the documentation.- Action
- Read only
- OAuth
- SDK
- MCP
IMPLEMENTATION
Call this tool
Connect a user's Harvest account once, then configure and run List Time Entries from your backend or agent.
import { PipedreamClient } from "@pipedream/sdk"
const pd = new PipedreamClient({
projectId: process.env.PIPEDREAM_PROJECT_ID!,
clientId: process.env.PIPEDREAM_CLIENT_ID!,
clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
projectEnvironment: "production",
})
const result = await pd.actions.run({
id: "harvest-list-time-entries",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
harvest: { authProvisionId: "apn_xxxxxxx" },
accountId: "Account ID",
userId: "User ID",
},
})
console.log(result)curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
-H "Content-Type: application/json" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}" \
-d '{
"external_user_id": "{external_user_id}",
"id": "harvest-list-time-entries",
"configured_props": {
"harvest": { "authProvisionId": "apn_xxxxxxx" },
"accountId": "Account ID",
"userId": "User ID"
}
}'// accessToken: mint a short-lived token with the Connect SDK — see the MCP guide
const transport = new StreamableHTTPClientTransport(
new URL("https://remote.mcp.pipedream.net/v3"),
{
requestInit: {
headers: {
Authorization: `Bearer ${accessToken}`,
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
"x-pd-app-slug": "harvest",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// listTools() hands your model this tool's input schema, so it can
// fill the arguments itself:
const result = await mcp.callTool({
name: "harvest-list-time-entries",
arguments: {
accountId: "Account ID",
userId: "User ID",
},
})SCHEMA
Inputs
Pipedream supplies the connected account. Your application provides the operation-specific values below. Dynamic inputs are resolved against that user's account.
| Property | Type | Description |
|---|---|---|
accountId Account ID | string | Your Harvest account ID, e.g. 1234567. Run List Account ID Options to find it. Required |
userId User ID | string | Free-form user ID, e.g. 1782959. Run List Users first to find valid IDs. Optional |
clientId Client ID | string | Free-form client ID, e.g. 5735776. Run List Clients first to find valid IDs. Optional |
projectId Project ID | string | Free-form project ID, e.g. 14308069. Run Get Projects first to find valid IDs. Optional |
taskId Task ID | string | Free-form task ID, e.g. 1467097. Run List Tasks first to find valid IDs. Optional |
isBilled Is Billed | boolean | Only return entries that have or have not been invoiced. Optional |
isRunning Is Running | boolean | Only return running or non-running entries. Optional |
updatedSince Updated Since | string | Only return records updated since this UTC datetime, e.g. 2019-06-25T15:30:00Z. Optional |
from From | string | Only return entries with a spent_date on or after this date, format YYYY-MM-DD, e.g. 2026-09-01. Optional |
to To | string | Only return entries with a spent_date on or before this date, format YYYY-MM-DD, e.g. 2026-09-10. Optional |
notes Notes Contains | string | Only return entries whose notes contain this text (case-insensitive substring match, applied client-side). Use this to find a specific entry inside a large result set instead of paging through everything. Optional |
countOnly Count Only | boolean | Skip fetching entries entirely and just return the true total for the given filters (via Harvest's own count). Use this for "how many" questions — safe on any result size, since it never fetches the entries themselves. Optional |
REFERENCE
Tool details
Behavior hints are published with the component in the Pipedream registry and surface as MCP tool annotations, so an agent can reason about a tool before it calls it.
- Registry key
- harvest-list-time-entries
- Version
- 0.0.1
- App
- Harvest
- Authentication
- OAuth
- Read-only
- Yes
- Destructive
- No
- Open world
- Yes
- Source
- View on GitHub ↗