@iiinigence/harvest-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@iiinigence/harvest-mcpHow many hours did I log this week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@iiinigence/harvest-mcp
Track time, run timers, and read time reports — by just asking your AI.
An open-source MCP server for Harvest, developed by IIInigence. Works with Claude Desktop, Claude Code, and any MCP-compatible client.
🎥 Setup tutorial video: coming soon — subscribe
Easiest install — one file, no terminal (Claude Desktop)
Download
iiinigence-harvest.mcpbfrom the latest releaseIn Claude Desktop: Settings → Extensions → Advanced settings → Install Extension → pick the downloaded file. Claude shows what you're getting; click Install.
Paste your Harvest Personal Access Token and Account ID (both from id.getharvest.com/developers) into the settings form, then click the Disabled button so it reads Enabled. Done.
No Node, no config files — Claude Desktop runs the bundle with its built-in runtime. Nervous about giving an AI write access to your timesheet? Flip on Read-only mode in the same form: Claude can read projects, entries, and reports but can't log or change a thing until you turn it off.
Related MCP server: harvest-mcp-server
Quick start (manual / npx route)
1. Get your credentials — id.getharvest.com/developers → Create new personal access token. Note the token and the numeric Account ID shown with it.
2. Add to Claude Desktop — Settings → Developer → Edit Config:
{
"mcpServers": {
"harvest": {
"command": "npx",
"args": ["-y", "@iiinigence/harvest-mcp"],
"env": {
"HARVEST_ACCESS_TOKEN": "your_token_here",
"HARVEST_ACCOUNT_ID": "1234567",
"READ_ONLY": "false"
}
}
}
}Restart Claude Desktop, then try: "How many hours did I log this week?"
What it's like to use
"Start a timer on the Acme website project — task: development, note: fixing the checkout bug."
"Stop my timer."
"Log 2 hours yesterday on Acme — client meeting."
"How many hours did we spend per client this month, and how much of it was billable?"
"Who on the team logged the most hours last week?"
"Find my unbilled overtime — compare this month's hours to the project budgets."
Tools
Tool | What it does |
| Verify the connection; your user id, roles, timezone |
| Clients in the account |
| Projects with client, code, and budget info |
| Tasks available on a project (needed to log time) |
| Entries with filters: date range, project, person, running |
| Aggregated hours by client / project / task / team member |
| Create a completed time entry |
| Start a running timer (auto-stops any other running timer) |
| Stop the running timer |
| Edit hours, notes, date, project, or task |
| Team members (admin/manager) |
Configuration
Env var | Required | Description |
| ✅ | Personal Access Token from id.getharvest.com/developers |
| ✅ | Numeric account id shown next to the token |
| — |
|
Safety notes
No delete tool — by design. This server can log and edit time, but it can never delete an entry. If something truly needs deleting, do it in Harvest.
Read-only mode is a hard block enforced by the server, not a suggestion to the model.
Your Personal Access Token carries your Harvest permissions. Treat it like a password; revoke it at id.getharvest.com/developers if unsure.
Keep yourself as the approval step for edits: ask your assistant to show entries before changing them.
Privacy
This connector runs locally, collects no data, has no telemetry, and talks only to Harvest's API. Your token is stored on your device by Claude Desktop and sent only to Harvest. Full policy: PRIVACY.md.
Who built this
IIInigence — a software development agency: custom software, AI automations, full platforms. This connector is part of our video series on connecting Claude to your business tools, one at a time. See also our SendGrid connector.
Want something like this built for your business? Tell us what you'd build.
Development
git clone https://github.com/iiinigence/harvest-mcp.git
cd harvest-mcp
npm install
npm run build
HARVEST_ACCESS_TOKEN=xxx HARVEST_ACCOUNT_ID=1234567 node dist/index.jsMIT licensed. PRs welcome.
This is an independent project by IIInigence. It is not affiliated with, endorsed, or sponsored by Harvest. "Harvest" is a trademark of Iridesco, LLC, used here only to describe compatibility.
Available Tools
11 toolsget_meWho am IARead-only
Get the authenticated Harvest user (name, email, id, roles, timezone). Useful to resolve 'my' time entries and check the connection.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include readOnlyHint: true, covering the safety profile. The description adds value by listing the exact data returned (name, email, id, roles, timezone) and indicating it can be used to verify connectivity, which enriches behavioral understanding beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the core function and return fields, the second gives practical use cases. There is no redundancy or unnecessary detail, making it efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (no parameters, no output schema), the description fully covers the necessary context: what data is returned, how it can be used to resolve 'my' entries, and as a connection check. No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100% (empty), so the baseline is 4. The description does not need to explain parameters; instead, it adds context about the output fields and use cases, which is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to get the authenticated Harvest user with a specific list of fields (name, email, id, roles, timezone). The verb 'Get' and resource 'authenticated Harvest user' are specific, and it distinguishes from sibling tools like list_users by focusing on the current user.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear use case: 'resolve my time entries and check the connection.' This implies when to use the tool, though it does not explicitly name alternatives. It offers enough context for an agent to decide to use it for current-user identification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_time_reportTime reportARead-only
Aggregated hours for a date range, grouped by clients, projects, tasks, or team members. Includes billable vs total hours and billable amounts (when permitted). Perfect for 'how many hours did we spend on X this month?'
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End date YYYY-MM-DD | |
| from | Yes | Start date YYYY-MM-DD | |
| group_by | Yes | How to group the report |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, which already conveys this is a safe read operation. The description adds useful behavioral detail: it returns aggregated hours, includes billable vs total hours, and billable amounts only when permitted. This goes beyond the annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The first sentence front-loads the core function and options; the second gives a natural-language example. Every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description tells the user what the report contains (aggregated hours, billable/total hours, billable amounts) and how it can be grouped. This is enough for a simple reporting tool with only three parameters, though it does not specify response format or pagination, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters (from, to, group_by) with clear descriptions, including enum values for group_by. The description adds only a slight restatement ('date range', 'grouped by'), which is minimal extra value over the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool aggregates hours over a date range with grouping options (clients, projects, tasks, team members), and the title 'Time report' reinforces this. It is distinct from siblings like list_time_entries (detailed entries vs aggregated summary) and log_time (write vs read).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a concrete use case ('how many hours did we spend on X this month?') and implies it is for reporting/aggregation rather than listing individual entries or logging time. However, it does not explicitly name alternatives or state when not to use this tool, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_clientsList clientsBRead-only
List clients in the Harvest account. Returns id, name, active state.
| Name | Required | Description | Default |
|---|---|---|---|
| active_only | No | Only active clients (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals that the operation is safe. The description adds that the response includes id, name, and active state, but it does not disclose other behavioral nuances such as default filtering (though the schema covers active_only's default). This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the action and the output fields. There is no wasted wording or redundancy, earning full marks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter, the description is sufficiently complete given the annotations and schema. The return fields are specified, and the tool's low complexity means few gaps remain. A half-point is lost for lacking any mention of pagination or edge cases, though this is not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage of the sole parameter with its description ('Only active clients (default true)'), so the description need not add parameter semantics. The description adds no extra meaning beyond the schema, matching the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('List') and resource ('clients in the Harvest account'), and it distinguishes the resource from sibling tools that list other entities. However, it lacks explicit scoping or differentiation statements, so it does not fully earn a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention context, prerequisites, or when not to use it. The sibling tools are unrelated resources, but no explicit usage guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList projectsARead-only
List projects with their client, code, and budget info. Filter by client_id or include archived projects.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Only projects for this client | |
| active_only | No | Only active projects (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares this as a safe read operation. The description adds that projects are listed with budget info and can be filtered, but does not discuss pagination, default sort order, or other behavioral details. It neither contradicts annotations nor provides substantial extra transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loads the main action, and includes no redundant information. It is highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with two documented parameters and a readOnlyHint, the description adequately conveys the purpose and basic filtering options. Missing pagination or return-structure details are minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described in the schema (client_id and active_only with defaults). The description mirrors the filtering capability but does not add new syntax or format details, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('projects'), and specifies the information returned ('client, code, and budget info'). This clearly distinguishes it from sibling tools like list_project_tasks or list_time_entries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for filtering by client_id and including archived projects, which are parameters. However, it does not explicitly mention when to use this over alternatives such as list_project_tasks or list_clients, nor does it state any exclusions. So guidance is clear but lacks explicit differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_tasksList tasks on a projectARead-only
List the task assignments for a project (task_id + name). You need a task_id to log time or start a timer on that project.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The Harvest project id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only behavior is covered. The description adds the functional output (task_id + name) and the prerequisite for time logging, but does not disclose other behaviors like pagination, filtering, or whether it returns all tasks. This is acceptable for a simple read-only tool but not exceptionally informative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loaded with the verb and resource. The first sentence states the action and output; the second sentence provides essential context for its use. No redundant information or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter, a read-only annotation, and no output schema, so the description does not need to explain return values. It explains the practical purpose (getting a task_id for time logging) and is therefore sufficiently complete for this complexity level. Minor missing details like scope or limitations are not critical here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of the parameter details: project_id is a required number with a clear description ('The Harvest project id'). The description does not add additional parameter semantics, but the schema already provides full clarity, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists task assignments for a project, specifying the exact fields returned (task_id + name). It distinguishes itself from sibling tools by focusing on tasks rather than time entries or projects, and connects to the workflow of needing a task_id before logging time or starting a timer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when this tool is needed ('to log time or start a timer on that project'), which directly guides the agent to use it before invoking log_time or start_timer. It does not explicitly exclude alternative tools, but the context is clear enough for a simple list operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_time_entriesList time entriesARead-only
List time entries, newest first. Filter by date range (from/to, YYYY-MM-DD), project_id, user_id, or only_running. Use mine=true to limit to the authenticated user. Returns up to 300 entries per call.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date YYYY-MM-DD (inclusive) | |
| from | No | Start date YYYY-MM-DD (inclusive) | |
| mine | No | Only the authenticated user's entries | |
| user_id | No | ||
| project_id | No | ||
| only_running | No | Only currently running timers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With the readOnlyHint annotation already signaling safety, the description adds valuable behavioral details: newest-first ordering, the 300-entry per-call limit, and filter capabilities. It does not expose potential rate limits or pagination nuances, but the added context goes beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and ordering, then enumerates filters and the limit. Every word earns its place with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with 6 optional parameters and no output schema, the description covers the essential behavior: listing, ordering, all filter options, and the page size limit. It omits pagination behavior (what happens when more than 300 entries exist), but the core functionality is well-covered for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (4/6 params have descriptions), so the description partially compensates. It explicitly lists all filter dimensions and clarifies date format (YYYY-MM-DD) and the mine=true semantics. It does not deeply explain user_id/project_id, but theirnames are self-explanatory and the filter list is helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List time entries' with a specific resource and action, and adds 'newest first' for ordering. It does not explicitly differentiate from sibling tools like list_project_tasks, but the name and resource are unambiguous. A sibling-differentiating phrase would earn a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on how to use the tool: filters by date range, project_id, user_id, or only_running, and the mine=true option. It does not explicitly state when to use an alternative tool (e.g., get_time_report for aggregates), but the usage scenarios are well implied by the parameter descriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersList team membersARead-only
List users in the Harvest account (id, name, email, roles). Needed for per-person filters and team reports. Requires admin/manager access.
| Name | Required | Description | Default |
|---|---|---|---|
| active_only | No | Only active users (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds value by disclosing the required permission level (admin/manager) and the specific output fields (id, name, email, roles). This goes beyond the annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and resource, then includes usage context and access requirements. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one optional parameter, no output schema). The description covers the returned fields, usage purpose, and access requirements, which is adequate for an agent to select and invoke it. It does not mention pagination or ordering, but these are not critical for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage for the single parameter 'active_only' with a clear description. The tool description does not add any parameter-specific detail, so it relies fully on the schema, meeting the baseline but not exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'users in the Harvest account', and specifies the returned fields (id, name, email, roles). This distinguishes it from sibling tools like list_clients and list_projects, which target different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context: 'Needed for per-person filters and team reports', and mentions the access prerequisite (admin/manager access). However, it does not explicitly state when not to use it or name alternative tools, so it misses the top bar for 'when-not/alternatives'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_timeLog timeA
Create a completed time entry: project, task, date, and duration in hours (e.g. 1.5). Use list_projects and list_project_tasks first to get ids. Add a short note describing the work.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | Yes | Duration in decimal hours, e.g. 1.5 | |
| notes | No | What was worked on | |
| task_id | Yes | ||
| project_id | Yes | ||
| spent_date | Yes | YYYY-MM-DD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a write operation (readOnlyHint=false) and non-destructive behavior. The description adds that the entry is 'completed' (as opposed to running), and instructs to add a note, which is a behavioral expectation not captured by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the main purpose and prerequisite. Every sentence earns its place with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers the workflow (list tools first), all required fields, and the optional note. With annotations covering the safety profile and schema covering most formats, the description is sufficiently complete for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents hours, notes, and spent_date, but leaves project_id and task_id undocumented. The description fills this gap by mentioning 'project, task' and instructing to get IDs, clarifying they are ID references. It also provides an example for hours format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Create') and resource ('completed time entry'), distinguishing it from siblings like start_timer by emphasizing 'completed'. It lists the key fields (project, task, date, duration), making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to call list_projects and list_project_tasks first to obtain IDs, which is a clear prerequisite for correct usage. It doesn't explicitly exclude start_timer or update_time_entry, but the 'completed' qualifier provides enough context to differentiate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_timerStart a timerA
Start a running timer on a project + task for today (authenticated user). Any other running timer for the user is stopped automatically by Harvest. Use list_project_tasks to get the task_id.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | What is being worked on | |
| task_id | Yes | ||
| project_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses that any other running timer is stopped automatically, a meaningful side effect. It also notes the scope ('for today') and authentication requirement, adding useful context without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first states the action and scope, the second provides the side effect and a prerequisite. It is front-loaded and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple timer tool, the description covers the main behavior, a critical side effect, and a prerequisite for one parameter. It does not discuss error conditions or return values, but given the absence of an output schema and the presence of annotations, this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (only 'notes' has a description). The description adds semantic value by indicating that task_id should be obtained from list_project_tasks, but it does not explain project_id beyond the name. It partially compensates for the low schema coverage but leaves a gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Start a running timer'), the resource ('a project + task for today'), and the authentication context ('authenticated user'). It distinguishes from siblings like stop_timer and log_time by specifying 'running timer'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it is for the authenticated user's timer for today, and it explicitly mentions that any other running timer is stopped. It also directs users to list_project_tasks to obtain task_id, which is a helpful prerequisite. However, it does not explicitly differentiate from log_time (manual entry) as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_timerStop the running timerA
Stop a running timer. If time_entry_id is omitted, finds and stops the authenticated user's currently running timer.
| Name | Required | Description | Default |
|---|---|---|---|
| time_entry_id | No | Specific entry to stop (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only action. The description adds the auto-find behavior for the currently running timer but fails to disclose what happens if no timer is running or if the timer is not owned by the user, which is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action, and contains no fluff. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description sufficiently covers main behavior and conditional logic. It could mention error cases, but overall completeness is adequate for selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, providing a baseline of 3. The description adds valuable meaning to the optional parameter by explaining what happens when time_entry_id is omitted (auto-find current timer), exceeding baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Stop a running timer.' It is specific and distinct from siblings like start_timer or log_time, with a clear verb+resource structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the conditional usage when time_entry_id is omitted, providing context for when to use this tool. It implies use for stopping timers but does not explicitly contrast with alternatives like update_time_entry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_time_entryUpdate a time entryA
Edit an existing time entry's hours, notes, date, project, or task. Only provided fields are changed. (This server intentionally has no delete tool — set hours or move entries instead, and delete in Harvest itself if truly needed.)
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| notes | No | ||
| task_id | No | ||
| project_id | No | ||
| spent_date | No | YYYY-MM-DD | |
| time_entry_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-destructive operation. The description adds valuable context by stating partial-update behavior and the intentional absence of a delete tool, which informs the agent of workarounds. It does not contradict annotations, and the added context goes beyond the structured safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: purpose, behavior, and contextual note. Every sentence earns its place, with no fluff. The key information is front-loaded, and the structure is tight and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the presence of annotations, and absence of an output schema, the description covers the essential usage: what is edited, partial update semantics, and the no-delete policy. It does not mention return values or error handling, but for a straightforward update tool this is acceptable. The description is sufficiently complete for an agent to select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 17% (only spent_date has a description). While the description lists editable fields and explains partial updates, it does not explicitly map 'date' to spent_date, nor does it mention the required time_entry_id or constraints like hours > 0. It partially compensates for low coverage but leaves gaps that the schema alone does not fill.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: "Edit an existing time entry's hours, notes, date, project, or task." This clearly identifies what the tool does and lists the editable fields. It also distinguishes itself from siblings by noting the absence of a delete tool, reinforcing that this is for editing not deleting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear partial-update guidance ("Only provided fields are changed") and explicit alternatives for deletion ("set hours or move entries instead, and delete in Harvest itself"). However, it does not explicitly contrast with log_time or start_timer for creating new entries, so it stops short of a full when/when-not differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.0- First observed
get_me - First observed
get_time_report - First observed
list_clients - First observed
list_project_tasks - First observed
list_projects - First observed
list_time_entries - First observed
list_users - First observed
log_time - First observed
start_timer - First observed
stop_timer - First observed
update_time_entry
TDQS
Scored across 11 tools
Each tool targets a distinct resource or action. The only potential overlap is between log_time and start_timer, but descriptions clearly separate completed entries from running timers. list_time_entries and get_time_report serve different purposes (raw vs aggregated).
All tool names follow a consistent verb_noun pattern using snake_case. Read operations use list_ for collections and get_ for single entities (get_me, get_time_report), which is a predictable and logical variation. No mixed naming conventions are present.
11 tools is well within the ideal 3-15 range. Each tool addresses a core time-tracking workflow: listing entities, logging/editing entries, managing timers, and generating reports. No tool seems redundant or unnecessary.
The surface covers the essential lifecycle of time entries: create (log_time, start_timer), read (list_time_entries, get_time_report), and update (update_time_entry). Delete is intentionally omitted with a clear rationale, making it a minor gap. Project/client/task management is limited to listing, but that is suitable for a time-tracking integration.
Maintenance
Related MCP Connectors
MCP server for generating rough-draft project plans from natural-language prompts.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
- TimequipOAuthcom.timequip
Manage Timequip projects, tasks, comments, members, and dashboards through MCP.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceProvides MCP integration for Harvest's time tracking, project management, and invoicing functionality, enabling natural language interaction with Harvest API through tools for managing clients, time entries, projects, tasks, and users.-
- AlicenseBqualityBmaintenanceMCP server for Harvest time tracking. Manage time entries, start/stop timers, handle projects, clients, tasks, and generate time and expense reports via the Harvest API v2.5442 npm8MIT
- AlicenseAqualityCmaintenanceAn MCP server for Productive.io that enables users to log time, inspect projects, and manage time entries using natural language commands. It features fuzzy project matching, local caching, and remembers default services per project for streamlined time tracking.14MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for time tracking and billing that allows freelancers to control timers, manage projects, and export invoices via natural language in any MCP-compatible AI assistant.1 npmMIT