# Forecast MCP connector

The Forecast connector brings Forecast clients, company contacts, departments, exchange rates, labels and custom fields to Claude, ChatGPT, Cursor and the Elaichi Agent, so each person can read and update them inside their own Forecast access.

Source: https://elaichi.ai/connectors/forecast/

## Facts

| | |
| --- | --- |
| Application | Forecast |
| Category | Product Development |
| AI tools | 324 |
| Authentication | Connects with an API key |
| Bring your own OAuth app | No |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, any MCP client, and the Elaichi Agent |
| Tools advertised by name | No. Connected tools are never listed one by one, however few there are. The endpoint advertises `search_tools` and `execute_tool` instead |

## What you can ask once Forecast is connected

- Create a client called Northwind and add its two contacts
- Update the EUR to USD exchange rate to 1.08
- Which Forecast clients belong to the Copenhagen department?

## Connect Forecast in Elaichi

This happens once for the organization, before any client is involved.

1. Open Connections, choose Add connection, and pick Forecast.
2. Optionally set Share with, then press Connect.
3. Paste a Forecast API key. One person generates a token in Forecast and pastes it once. Everyone else works through Share with, and never sees it.

Credentials are vaulted and nobody, including the AI, reads them back. The connection becomes a toolbox immediately, so you can curate which Forecast tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## Forecast MCP connector for Claude

Endpoint: https://api.elaichi.ai/mcp

1. Open Customize, then Connectors.
2. Press Add.
3. Name it, paste the MCP server URL, then Continue.
4. Sign in and approve.

On Team and Enterprise, an Owner adds it once. Everyone else turns it on for themselves.

## Forecast MCP connector for ChatGPT

Endpoint: https://api.elaichi.ai/mcp

1. Open Plugins, then press the + button.
2. Name it and paste the endpoint into Server URL.
3. Leave Authentication on OAuth, then tick the risk acknowledgement.
4. Press Create, then sign in and approve.

Works on the web today. The plugin directory lives at chatgpt.com/plugins.

## Forecast MCP connector for Cursor

Endpoint: https://api.elaichi.ai/mcp

1. Open `~/.cursor/mcp.json`.
2. Add the endpoint under `mcpServers`.
3. Reload Cursor, then sign in and approve.

Set up per machine, so repeat it on each computer you work from.

## Connect Forecast to any MCP client

Endpoint: https://api.elaichi.ai/mcp

1. Add the endpoint as a remote MCP server.
2. Sign in and approve.

The Elaichi Agent already has these tools, with nothing to set up.

## What the consent screen decides

Only Read is granted by default, which is not enough to call a Forecast tool. Over MCP there is no trusted place to confirm a write in the moment, so the consent screen is the standing approval rather than a formality. Grant Read and Run tools. Think hard before granting Delete, which reaches into connected apps and cannot be undone.

## What teams do with Forecast through Elaichi

### Set up a new client before kickoff

Account Management. Create the client in Forecast, add its company contacts and apply the right labels in one ask, so the record is ready before the first project is planned.

### Keep exchange rates current every month

Finance. Update the exchange rates Forecast uses for multi-currency projects when the month closes, and check which rates exist without opening the settings pages.

### Clean up company contacts in bulk

Operations. Fix titles, emails and ownership across dozens of Forecast company contacts at once, and remove the ones that have gone stale.

### Fill in custom fields on phases and tasks

Project Management. Set the custom field values on phases, tasks and time registrations after a planning session, so reports filter correctly later.

### Answer client questions from live records

Delivery. Ask which Forecast clients belong to a department, pull up a single client by name, and get the answer from what is in Forecast right now.

### Review departments and permission profiles

Leadership. See how departments and permission profiles are laid out in Forecast before a reorganization, without asking an administrator to export anything.

## Frequently asked questions

### How do I connect Forecast to Claude?

Connect Forecast in Elaichi first: paste a Forecast API key when asked, and Elaichi does the rest. There is no OAuth application to register and no client ID or secret to generate. Then open Claude, go to Customize, then Connectors, then Add, and paste https://api.elaichi.ai/mcp as the endpoint. Sign in with your Elaichi account and Forecast is available in your next chat.

### Does Forecast work with ChatGPT and Cursor as well as Claude?

Yes. Once Forecast is connected in Elaichi, the same endpoint, https://api.elaichi.ai/mcp, works in Claude, ChatGPT, Cursor, any other MCP client and the Elaichi Agent. You connect Forecast once and every client picks it up.

### What can an AI agent actually do with my Forecast data?

An agent can list your Forecast clients, open a single client, create or update one, and add, update or remove company contacts in bulk. It can also update exchange rates, set custom fields on phases, tasks and time registrations, and look up departments, labels and permission profiles. Short concrete asks such as "create a client called Northwind" work better than long paragraphs.

### Does connecting Forecast give the AI access to everything in my Forecast account?

No. Every call to Forecast runs as the person who signed in, so the agent can only see and change what that person's Forecast permission profile already allows. Elaichi can narrow that further with roles and restrictions, but it can never widen it beyond what Forecast itself grants.

### Can my team share one Forecast connection?

Yes. One person connects Forecast with an API key and shares the connection with a team in Elaichi, and nobody else ever handles the key. Each teammate still signs in to Elaichi as themselves, so the audit log names the person behind every Forecast change.

### Can I stop an agent from deleting or changing things in Forecast?

Yes. Restrictions in Elaichi apply per action, so you can allow reading Forecast clients while blocking deletes, or allow contact updates while blocking anything to do with exchange rates. A restricted action is never advertised to Claude, ChatGPT or Cursor at all, so no prompt can reach it.

### What happens to a Forecast connection when someone leaves?

Offboarding the person in Elaichi ends their access to Forecast through every client at once. A shared Forecast connection keeps working for everyone else on the team. If you want Forecast gone entirely, disconnecting it once in Elaichi removes it from Claude, ChatGPT, Cursor and every other client.

### Does the Forecast MCP connector work with Gemini, Codex, Claude Code or other MCP clients?

Yes. Forecast is reached over the same MCP endpoint every client uses, so anything that speaks MCP can call it — Gemini, Codex, Claude Code, Windsurf, Cline, Zed and OpenCode among them — alongside Claude, ChatGPT, Cursor, and the Elaichi Agent. The tools on offer and the access behind them are identical whichever client asks. Only the setup screen differs.

## All 324 Forecast tools

Every tool below is callable through https://api.elaichi.ai/mcp once Forecast is connected, subject to the toolbox it is in and the restrictions on the caller.

- **List all Forecast clients** (List). List all clients in forecast. Returns each client with id, name, street, city, country, notes, created_at, and updated_at.
- **Get single Forecast client by ID** (Get). Get a single client in forecast by id. Returns the client with id, name, street, city, country, notes, created_at, and updated_at. Required: id.
- **Create a Forecast client** (Create). Create a new client in forecast. Returns the created client with id, name, street, city, country, notes, created_at, and updated_at. Required: name.
- **Update a Forecast client by ID** (Update). Update an existing client in forecast by id. Returns the updated client with id, name, street, city, country, notes, created_at, and updated_at. Required: id.
- **Delete a Forecast client by ID** (Delete). Delete a client in forecast by id. Returns an empty 204 response on success. Required: id.
- **List all Forecast company** (List). Get your Forecast company data. Returns: city, contact_email, contact_name, contact_phone, country, currency, company_name, seats, vat_id, virtual_seats, zip, company_target.
- **Forecast company bulk update** (Update). Update your Forecast company data. Returns the updated company record: company_name, city, country, currency, contact_email, seats, and company_target. Supply only the fields to change; no field is required.
- **List all Forecast departments** (List). List all departments in Forecast. Returns: id, name.
- **Get single Forecast department by ID** (Get). Get a specific department in Forecast by id. Returns: id, name. Required: id.
- **List all Forecast company contacts** (List). List all company contacts in Forecast. Returns each contact's id, person_id, and contact_type (e.g. PRIMARY).
- **Forecast company contacts bulk update** (Update). Set the person for a specific company contact type in Forecast. Returns: person_id, contact_type. Required: person_id and contact_type (one of PRIMARY, BILLING, DECISION_MAKER, ONBOARDING, TECHNICAL).
- **Forecast company contacts bulk delete** (Delete). Remove the person set for a specific company contact type in Forecast. Returns an empty 204 response on success. Required: contact_type.
- **Forecast custom fields update phase** (Update). Set custom field values on a Forecast phase. The body is a map of custom-field keys to values, where keys must be pre-defined in the admin UI for the PHASE entity type. Returns the set key/value pairs (key1, key2, key3). Required: project_id, phase_id.
- **Forecast custom fields update time registration** (Update). Set custom field values on a Forecast time registration. The body is a map of custom-field keys to values, where keys must be pre-defined in the admin UI for the TIME_REG entity type. Returns the set key/value pairs (key1, key2, key3). Required: time_registration_id.
- **Forecast custom fields update task** (Update). Set custom field values on a Forecast task. The body is a map of custom-field keys to values, where keys must be pre-defined in the admin UI for the TASK entity type. Returns the set key/value pairs (key1, key2, key3). Required: task_id.
- **Forecast custom fields list options** (List). List the available options for a dropdown-type custom field in Forecast. Returns an array of option records, each with id and name. Required: entity_type (PROJECT, PHASE, TASK, or TIME_REG) and key (the custom field key).
- **Forecast custom fields bulk update** (Update). Set custom field values on a Forecast project. The body is a map of custom-field keys to values, where keys must be pre-defined in the admin UI for the PROJECT entity type. Returns the set key/value pairs (key1, key2, key3). Required: project_id.
- **List all Forecast exchange rates** (List). List all exchange rates configured in Forecast. Returns each entry's currency and rate. No parameters required.
- **Get single Forecast exchange rate by ID** (Get). Get a single exchange rate in Forecast by id. Returns: currency, rate. Required: id (the currency code, e.g. EUR).
- **Create a Forecast exchange rate** (Create). Create a new exchange rate in Forecast. Returns the created exchange rate object with its currency and rate. Required: currency, rate.
- **Update a Forecast exchange rate by ID** (Update). Update an exchange rate in Forecast by id. Returns the updated exchange rate object with its currency and rate. Required: id (the currency code, e.g. EUR), currency, and rate.
- **Delete a Forecast exchange rate by ID** (Delete). Delete an exchange rate in Forecast by id. Returns an empty 204 response on success. Required: id (the currency code, e.g. EUR).
- **List all Forecast profiles** (List). List all company profiles in Forecast. Returns each profile's id, name, can_be_edited flag, person_count, and profile_permission list.
- **List all Forecast labels** (List). List all labels in Forecast. Returns each label with id, name, color, categoryId, created_by, updated_by, created_at, and updated_at.
- **Get single Forecast label by ID** (Get). Get a single label in Forecast by id. Returns: id, name, color, categoryId, created_by, updated_by, created_at, updated_at. Required: id.
- **Create a Forecast label** (Create). Create a new label in Forecast. Returns the created label with id, name, color, categoryId, created_at, and updated_at. Required: name.
- **Update a Forecast label by ID** (Update). Update a label in Forecast by id. Returns the updated label with id, name, color, categoryId, created_at, and updated_at. Required: id. Set categoryId to null to remove the label from its label_category.
- **Delete a Forecast label by ID** (Delete). Delete a label in Forecast by id. Returns an empty 204 response on success.
- **List all Forecast label categories** (List). List all label categories in Forecast. Returns a collection of label category objects including: id, name, allowOnTasks, allowOnProjects, allowOnPeople, created_by, updated_by, created_at, updated_at.
- **Get single Forecast label category by ID** (Get). Get a specific label category in Forecast by id. Returns the label category object including: id, name, allowOnTasks, allowOnProjects, allowOnPeople, created_by, updated_by, created_at, updated_at. Required: id.
- **Create a Forecast label category** (Create). Create a new label category in Forecast. Returns the created label category object (same shape as getting a single one), including: id, name, allowOnTasks, allowOnProjects, allowOnPeople, created_by, created_at, updated_at. Requires name, allowOnTasks, allowOnProjects, and allowOnPeople.
- **Update a Forecast label category by ID** (Update). Update a Forecast label category by id. Returns the updated label category with id, name, allowOnTasks, allowOnProjects, allowOnPeople, created_by, updated_by, created_at, and updated_at. All body fields are optional. Required: id.
- **Delete a Forecast label category by ID** (Delete). Delete a Forecast label category by id. Returns an empty 204 response on success. Required: id.
- **List all Forecast deleted data** (List). List deleted time registrations in Forecast. Returns a paginated list of deleted registrations including id, minutesRegistered, person, registeredOn, datetime, deletedBy, and deletedAt.
- **List all Forecast non project time** (List). List all non project time entries in Forecast. Returns: id, name, is_internal_time, created_by, updated_by, created_at, updated_at.
- **Get single Forecast non project time by ID** (Get). Get a single non project time entry in Forecast by id. Returns the entry's id, name, is_internal_time, created_by, and created_at. Required: id.
- **Create a Forecast non project time** (Create). Create a new non project time entry in Forecast. Returns the created entry with id, name, is_internal_time, created_by, and created_at. Required: name. is_internal_time defaults to true.
- **Update a Forecast non project time by ID** (Update). Update a non project time entry in Forecast by id. Returns the updated entry with id, name, is_internal_time, created_by, and updated_at. Required: id.
- **Delete a Forecast non project time by ID** (Delete). Delete a non project time entry in Forecast by id. Returns an empty 204 response on success. Required: id.
- **List all Forecast person cost periods** (List). List all person cost periods in Forecast, optionally filtered to one or more people by repeating the pid query parameter. Returns: id, person_id, start_year, start_month, start_day, cost, created_by, updated_by, created_at, updated_at, project, person, start_date, end_date, monday, tuesday, wednesday, thursday, friday, saturday, sunday, notes, is_soft.
- **Forecast person labels list for person** (List). List the labels associated with a person in Forecast. Returns: id, name, project, person, start_date, end_date, monday, tuesday, wednesday, thursday, friday, saturday, sunday, notes, is_soft, created_by, updated_by, created_at, updated_at. Required: person_label_id.
- **List all Forecast priority levels** (List). List all priority levels in Forecast in their configured order. Returns: id, name, weight, created_at, created_by, updated_at, updated_by, use_count, disabled.
- **Create a Forecast priority level** (Create). Add one or more priority levels in Forecast; new levels are appended to the end of the existing list (lowest priorities) and can be reordered afterwards. Returns the created priority level including id, name, weight, and disabled. Required: body — an array of objects each with a name.
- **Update a Forecast priority level by ID** (Update). Update the name or disabled status of a single priority level in Forecast. Returns the updated priority level including id, name, weight, updated_at, and disabled. Required: id, plus at least one of name or disabled in the body.
- **Delete a Forecast priority level by ID** (Delete). Delete a priority level in Forecast by id; any projects set with this priority are subsequently set to "No priority". Returns an empty 204 response on success.
- **Forecast priority levels delete with replacement** (Delete). Delete a priority level in forecast and reassign the projects using it to a replacement priority level. Returns an empty 204 response on success. Required: priority_level_id, replacement_id.
- **Forecast priority levels bulk update** (Update). Update the ordering, names, and disabled status of all existing priority levels in one call. Returns the updated priority level including id, name, and disabled. Required: body — an array containing every existing priority level with id, name, and disabled; omitting an existing level results in an error.
- **List all Forecast roles** (List). List all roles in Forecast. Returns each role with id, name, created_by, updated_by, created_at, and updated_at.
- **Get single Forecast role by ID** (Get). Get a single role in Forecast by id. Returns: id, name, created_by, updated_by, created_at, updated_at. Required: id.
- **Create a Forecast role** (Create). Create a new role in Forecast. Returns the created role with id, name, created_by, updated_by, created_at, and updated_at. Requires name.
- ...and 274 more tools. Call `tools/list` via the MCP endpoint, or see the full catalog via the API, for the complete set.
