Skip to main content
Glama
harvest-forecast-mcp

harvest-forecast-mcp

by AZX-PBC-OSS

harvest-forecast-mcp

An MCP server for the Harvest and Forecast APIs — let AI agents like Claude track time, list projects, and manage assignments and scheduling.

What it does

harvest-forecast-mcp exposes Harvest (time tracking) and Forecast (resource scheduling) operations as Model Context Protocol tools. Once configured, an AI agent can:

  • Track time — list, create, and delete time entries in Harvest

  • Browse projects — list projects, clients, tasks, and users

  • Manage scheduling — list and create Forecast assignments, milestones, and holidays

The server speaks stdio MCP, so it drops cleanly into Claude Desktop, Claude Code, or any MCP-compatible client.

Related MCP server: harvest-mcp-server

Installation

# Run instantly without installing (recommended)
uvx harvest-forecast-mcp

# Or install with pip
pip install harvest-forecast-mcp

Configuration

The server reads credentials from environment variables. Harvest and Forecast use separate access tokens and account IDs, so you can configure one or both depending on which tools you need.

Variable

Required

Description

HARVEST_ACCESS_TOKEN

Harvest tools

Personal access token for the Harvest API

HARVEST_ACCOUNT_ID

Harvest tools

Harvest account ID (numeric)

FORECAST_ACCESS_TOKEN

Forecast tools

Personal access token for the Forecast API

FORECAST_ACCOUNT_ID

Forecast tools

Forecast account ID (numeric)

HARVEST_USER_AGENT

Yes

Identifying string for API requests (e.g. your-app (you@example.com))

Tip: Harvest requires a descriptive User-Agent header. Set HARVEST_USER_AGENT to your app name and contact email.

Claude Desktop configuration

Add the server to your claude_desktop_config.json:

{
  "mcpServers": {
    "harvest-forecast": {
      "command": "uvx",
      "args": ["harvest-forecast-mcp"],
      "env": {
        "HARVEST_ACCESS_TOKEN": "your-harvest-token",
        "HARVEST_ACCOUNT_ID": "123456",
        "FORECAST_ACCESS_TOKEN": "your-forecast-token",
        "FORECAST_ACCOUNT_ID": "123456",
        "HARVEST_USER_AGENT": "my-claude-agent (you@example.com)"
      }
    }
  }
}

Tools

The server exposes 28 tools across the Harvest and Forecast APIs, including cross-API combinations:

Harvest — time tracking & project management

Tool

Description

list_harvest_projects

List all projects with client info, optionally filtered by active status

list_harvest_users

List all users, optionally filtered by active status

list_harvest_clients

List all clients, optionally filtered by active status

list_harvest_tasks

List all tasks available for time tracking

list_time_entries

List time entries filtered by user, project, and date range (defaults to last 30 days)

create_time_entry

Log hours against a project + task with optional notes

list_project_assignments

List users assigned to a Harvest project with rates and budgets

harvest_whoami

Get the current authenticated Harvest user's identity and permissions

Forecast — scheduling & staffing

Tool

Description

list_forecast_projects

List all Forecast projects (for scheduling)

list_forecast_people

List all schedulable people with roles and teams

list_forecast_placeholders

List all placeholders (role-based slots)

list_forecast_roles

List all roles with their assigned people and placeholders

list_forecast_milestones

List all milestones across all projects

get_forecast_project

Get details for a single Forecast project by ID

get_forecast_person

Get details for a single Forecast person by ID

list_assignments

List scheduled assignments filtered by date range, project, or person

create_assignment

Schedule a person on a project with allocation and dates

update_assignment

Update an existing assignment

delete_assignment

Delete an assignment

get_remaining_budgeted_hours

Get remaining budgeted hours for all projects

get_future_scheduled_hours

Get future scheduled hours from a date

get_future_scheduled_hours_for_project

Same, filtered to a single project

get_assigned_people

Get a mapping of project IDs to assigned person IDs

get_project_heatmap

Scheduling load heatmap for a project

get_person_heatmap

Scheduling load heatmap for a person

get_placeholder_heatmap

Scheduling load heatmap for a placeholder

forecast_whoami

Get current Forecast user identity and account IDs

Cross-API — manager insights

Tool

Description

person_schedule

A person's complete schedule: Forecast assignments + Harvest time entries for the period

project_overview

Comprehensive project view: Harvest details + Forecast project + budget + recent time entries

team_utilization

Scheduled hours (Forecast) vs logged hours (Harvest) per person, with utilization %

who_is_available

Find people with capacity (not fully scheduled) in a date range

time_summary

Summarize time entries grouped by project, user, or client

budget_status

Budget burn-down: remaining budgeted hours vs logged hours last 30 days per project

all_projects_schedule

Per-project scheduling overview: people, assignments, milestones for a date range

Development

# Install dependencies
uv sync --group dev

# Run tests
uv run pytest

# Type check
uv run pyright src/harvest_forecast_mcp

# Lint
uv run ruff check .

# Format
uv run ruff format .

See CONTRIBUTING.md for full development guidelines.

License

MIT

Disclaimer

This project is unofficial and not affiliated with, endorsed by, or sponsored by Harvest Inc. or its subsidiaries. "Harvest" and "Forecast" are trademarks of their respective owners. This software is provided "as-is", without any warranty express or implied.

MIT — Copyright (c) 2025 AZX, PBC.

Available Tools

34 tools
all_projects_scheduleA

Get a scheduling overview for all projects: assignments, assigned people, and milestones.

Combines Forecast assignments, people, and milestones into a per-project
view showing who is working on what during the date range.

Args:
    start_date: Start of date range (YYYY-MM-DD).
    end_date: End of date range (YYYY-MM-DD).

Inputs: end_date (required), start_date (required). Returns: result

budget_statusA

Get budget burn-down: remaining budgeted hours (Forecast) vs logged hours (Harvest, last 30 days) per project.

Cross-references Forecast's remaining_budgeted_hours with recent Harvest
time entries to show which projects are burning through their budget fastest.

Inputs: no named parameters. Returns: result

create_assignmentA

Schedule a person on a Forecast project.

Args:
    project_id: Forecast project ID (must be >= 1).
    person_id: Forecast person ID (0 = Everyone).
    start_date: Assignment start date (YYYY-MM-DD).
    end_date: Assignment end date (YYYY-MM-DD).
    allocation: Allocation in minutes per day (e.g. 480 = 8 hours).
    notes: Optional notes for the assignment.

Inputs: end_date (required), person_id (required), project_id (required), start_date (required), +2 more. Returns: result

create_time_entryA

Log time against a Harvest project and task.

Args:
    project_id: Harvest project ID.
    task_id: Harvest task ID.
    spent_date: Date the time was spent (YYYY-MM-DD).
    hours: Number of hours to log (can be decimal, e.g. 1.5).
    notes: Optional notes for the time entry.

Inputs: hours (required), task_id (required), project_id (required), spent_date (required), +1 more. Returns: result

delete_assignmentA

Delete a Forecast assignment.

Args:
    assignment_id: ID of the assignment to delete (must be >= 1).

Inputs: assignment_id (required). Returns: result

forecast_whoamiA

Get the current Forecast user's identity and account IDs.

Inputs: no named parameters. Returns: result

get_assigned_peopleC

Get a mapping of Forecast project IDs to the person IDs assigned to each.

Args:
    start_date: Start of date range (YYYY-MM-DD).
    end_date: End of date range (YYYY-MM-DD).

Inputs: end_date (required), start_date (required). Returns: result

get_forecast_personB

Get details for a single Forecast person by ID.

Args:
    person_id: Forecast person ID.

Inputs: person_id (required). Returns: result

get_forecast_projectC

Get details for a single Forecast project by ID.

Args:
    project_id: Forecast project ID.

Inputs: project_id (required). Returns: result

get_future_scheduled_hoursA

Get future scheduled hours for all projects starting from a date.

Args:
    from_date: Starting date (YYYY-MM-DD).

Inputs: from_date (required). Returns: result

get_future_scheduled_hours_for_projectA

Get future scheduled hours for a specific Forecast project.

Args:
    from_date: Starting date (YYYY-MM-DD).
    project_id: Forecast project ID.

Inputs: from_date (required), project_id (required). Returns: result

get_person_heatmapC

Get a scheduling heatmap for a Forecast person.

Args:
    person_id: Forecast person ID.
    from_date: Start date (YYYY-MM-DD).
    to_date: End date (YYYY-MM-DD).
    scale: Time scale — "daily" or "weekly".

Inputs: to_date (required), from_date (required), person_id (required), scale. Returns: result

get_placeholder_heatmapA

Get a scheduling heatmap for a Forecast placeholder.

Args:
    placeholder_id: Forecast placeholder ID.
    from_date: Start date (YYYY-MM-DD).
    to_date: End date (YYYY-MM-DD).
    scale: Time scale — "daily" or "weekly".

Inputs: to_date (required), from_date (required), placeholder_id (required), scale. Returns: result

get_project_heatmapA

Get a scheduling heatmap for a Forecast project.

Args:
    project_id: Forecast project ID.
    from_date: Start date (YYYY-MM-DD).
    to_date: End date (YYYY-MM-DD).
    scale: Time scale — "daily" or "weekly".

Inputs: to_date (required), from_date (required), project_id (required), scale. Returns: result

get_remaining_budgeted_hoursA

Get remaining budgeted hours for all Forecast projects.

Inputs: no named parameters. Returns: result

harvest_whoamiA

Get the current authenticated Harvest user's identity and permissions.

Inputs: no named parameters. Returns: result

list_assignmentsA

List scheduled assignments in Forecast within a date range.

Args:
    start_date: Start of date range (YYYY-MM-DD). Required.
    end_date: End of date range (YYYY-MM-DD). Required.
    project_id: Filter to assignments for a specific project.
    person_id: Filter to assignments for a specific person.

Inputs: end_date (required), start_date (required), person_id, project_id. Returns: result

list_forecast_milestonesA

List all milestones across all Forecast projects.

Inputs: no named parameters. Returns: result

list_forecast_peopleA

List all people being scheduled in Forecast, with their roles and teams.

Inputs: no named parameters. Returns: result

list_forecast_placeholdersA

List all placeholders (unnamed/role-based slots) available for scheduling in Forecast.

Inputs: no named parameters. Returns: result

list_forecast_projectsB

List all projects in Forecast (for scheduling purposes).

Inputs: no named parameters. Returns: result

list_forecast_rolesA

List all roles defined in Forecast, with their assigned people and placeholders.

Inputs: no named parameters. Returns: result

list_harvest_clientsA

List all clients in Harvest.

Args:
    is_active: If True, only return active clients.

Inputs: is_active. Returns: result

list_harvest_projectsA

List all projects in Harvest with client information.

Args:
    is_active: If True, only return active projects. If False, only archived.

Inputs: is_active. Returns: result

list_harvest_tasksB

List all tasks available for time tracking in Harvest.

Args:
    is_active: If True, only return active tasks.

Inputs: is_active. Returns: result

list_harvest_usersB

List all users in Harvest.

Args:
    is_active: If True, only return active users.

Inputs: is_active. Returns: result

list_project_assignmentsA

List users assigned to a Harvest project with their rates and budgets.

Args:
    project_id: Harvest project ID.

Inputs: project_id (required). Returns: result

list_time_entriesB

List time entries from Harvest, optionally filtered by user, project, and date range.

Args:
    user_id: Filter to a specific user's entries.
    project_id: Filter to a specific project's entries.
    from_date: Start date (YYYY-MM-DD). Defaults to 30 days ago.
    to_date: End date (YYYY-MM-DD). Defaults to today.

Inputs: to_date, user_id, from_date, project_id. Returns: result

person_scheduleA

Get a person's complete schedule: Forecast assignments + Harvest time entries for the period.

Combines both APIs to show what a person is scheduled to work on (Forecast)
and what they've actually logged (Harvest) in one view.

Args:
    person_id: Forecast person ID (for assignments) — also used to look up
        the corresponding Harvest user if the person has a harvest_user_id.
    start_date: Start of date range (YYYY-MM-DD).
    end_date: End of date range (YYYY-MM-DD).

Inputs: end_date (required), person_id (required), start_date (required). Returns: result

project_overviewA

Get a comprehensive project overview combining Harvest and Forecast data.

Returns Harvest project details, Forecast project details (if linked),
remaining budgeted hours, future scheduled hours, and recent time entries.

Args:
    project_id: Harvest project ID.

Inputs: project_id (required). Returns: result

team_utilizationA

Get team utilization: scheduled hours (Forecast) vs logged hours (Harvest) per person.

For each Forecast person with a linked Harvest user, shows their total
scheduled allocation and total logged hours in the date range, with a
utilization percentage.

Args:
    start_date: Start of date range (YYYY-MM-DD).
    end_date: End of date range (YYYY-MM-DD).

Inputs: end_date (required), start_date (required). Returns: result

time_summaryA

Summarize Harvest time entries, grouped by project, user, or client.

Args:
    from_date: Start date (YYYY-MM-DD). Defaults to 7 days ago.
    to_date: End date (YYYY-MM-DD). Defaults to today.
    group_by: How to group the summary — "project", "user", or "client".

Inputs: to_date, group_by, from_date. Returns: result

update_assignmentB

Update an existing Forecast assignment.

Args:
    assignment_id: ID of the assignment to update (must be >= 1).
    project_id: Forecast project ID (must be >= 1).
    person_id: Forecast person ID.
    start_date: New start date (YYYY-MM-DD).
    end_date: New end date (YYYY-MM-DD).
    allocation: New allocation in minutes per day.
    notes: New notes.

Inputs: end_date (required), person_id (required), project_id (required), start_date (required), +3 more. Returns: result

who_is_availableA

Find people who have capacity (are not fully scheduled) in a date range.

Lists Forecast people whose total scheduled allocation in the period
is below the given threshold, so they can take on more work.

Args:
    start_date: Start of date range (YYYY-MM-DD).
    end_date: End of date range (YYYY-MM-DD).
    max_daily_minutes: Max allocation to be considered "available" (default 480 = 8h/day).

Inputs: end_date (required), start_date (required), max_daily_minutes. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 34 tools

    Disambiguation5/5

    Each tool targets a distinct resource or action, with clear separation between Forecast and Harvest operations. Overlaps like person_schedule vs get_person_heatmap are differentiated by purpose (combined view vs scheduling heatmap). No tools are redundant or confusing.

    Naming Consistency5/5

    Tools predominantly follow a consistent verb_noun pattern (e.g., create_assignment, list_forecast_people). Exceptions like all_projects_schedule and who_is_available are still descriptive and follow a logical naming scheme. No mixed casing or erratic patterns.

    Tool Count4/5

    With 34 tools, the set is comprehensive but slightly above average. However, given the dual-API coverage (Harvest and Forecast) and the inclusion of cross-reference tools, the count is justified and not excessive. Each tool serves a clear purpose.

    Completeness4/5

    The tool surface covers core CRUD for assignments and time entry creation, plus comprehensive listing and cross-referencing. Minor gaps exist (no time entry update/delete, no Harvest project creation), but these are likely out of scope for a scheduling/time-tracking integration server.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • -
      license
      Not graded
      quality
      Not graded
      maintenance
      Provides 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.
      -