# Procore MCP connector

The Procore connector lets Claude, ChatGPT, Cursor and the Elaichi Agent work with your Procore projects, budgets, budget line items and checklist responses, with every action running as the signed-in person and recorded in an audit log.

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

## Facts

| | |
| --- | --- |
| Application | Procore |
| Category | Product Development |
| AI tools | 125 |
| Authentication | Connects over OAuth |
| Bring your own OAuth app | Yes |
| 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 Procore is connected

- List open projects under Acme Builders in Procore
- Add these estimate lines as budget line items on the Riverside job
- Summarize failed checklist responses on the Oak Street project this week

## Connect Procore in Elaichi

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

1. Open Connections, choose Add connection, and pick Procore.
2. Optionally set Share with, then press Connect.
3. Supply your own Procore app, then approve. Procore needs an OAuth app you register yourself, so bring its client ID and secret. One person does this once for the organization.

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

## Procore 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.

## Procore 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.

## Procore 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 Procore 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 Procore 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 Procore through Elaichi

### See every active project across your companies

Project management. Ask which Procore projects are open under each company and get the list back without clicking through portfolios one by one.

### Add budget line items from an estimate

Finance. Paste the lines from an approved estimate and have them created as budget line items on the right Procore project, then check the budget totals.

### Lock a budget once it is approved

Finance. When the owner signs off, lock the Procore budget so nobody adjusts it, and unlock it later when a change order comes through.

### Record checklist responses from the field

Quality. Capture inspection answers as checklist responses on the project, and correct a single response later if the inspector picked the wrong option.

### Review checklist responses before a walkthrough

Safety. Pull the latest safety checklist responses for a site and get a short summary of what failed so the superintendent knows where to look.

### Keep timecard time types current

Payroll. Rename or adjust a timecard time type in Procore when the labor agreement changes so crews log hours against the right category.

## Elaichi vs Zapier MCP vs Composio for Procore

All three can connect Procore to an AI assistant, and all three have admin controls. They differ in where access lives and how you pay.

| What to check | Elaichi | Zapier MCP | Composio |
| --- | --- | --- | --- |
| Where the AI connects | One address for the whole organization. Endpoint: https://api.elaichi.ai/mcp | A server per member, created at sign-in. | An MCP endpoint per team, or an SDK. |
| Control over Procore tools | Allow or restrict single Procore tools, per role or user. | App and action restrictions on the account. | Role permissions, down to the action. |
| Record of calls | One audit entry per Procore call. | A History tab of tool calls. | A log of every tool call. |
| Single sign-on | SAML or OIDC, plus SCIM, on Gold. | SAML on Enterprise. | SAML and OIDC on Enterprise. |
| Price | $15 per user per month. | 2 tasks per successful call. | Billed per tool call. |

Sources: Zapier MCP [docs](https://docs.zapier.com/mcp/get-started/quickstart), [security](https://docs.zapier.com/mcp/manage/security), [usage](https://docs.zapier.com/mcp/features/usage); Composio [docs](https://docs.composio.dev/docs/composio-connect), [gateway](https://composio.dev/mcp-gateway), [enterprise](https://composio.dev/enterprise), [pricing](https://composio.dev/pricing). Checked September 2026.

Longer take: [Zapier MCP alternative](/blog/zapier-mcp-alternative/) and [when you don't need an MCP gateway](/blog/when-you-dont-need-an-mcp-gateway/).

## Frequently asked questions

### How do I connect Procore to Claude?

First connect Procore in Elaichi. Procore requires an OAuth application registered inside your own Procore account, so an administrator does that once, copies the client ID and secret it produces into Elaichi, and then signs in to Procore and approves access. Next, open Claude, go to Customize, then Connectors, then Add, and paste https://api.elaichi.ai/mcp. Nobody else on your team ever has to see or handle that client ID or secret again.

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

Yes. Once Procore 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 Procore once and every client picks it up.

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

With Procore connected, an agent can list your companies and the projects under each one, read a project budget and its line items, add new budget line items, lock or unlock a budget, and create, read, update or delete checklist responses. It can also list and update timecard time types. Short, concrete asks such as "add these three lines to the Riverside budget" work better than long paragraphs.

### Does connecting Procore give the AI access to every company and project?

No. Every call into Procore runs as the person who signed in, so the agent sees only the companies, projects and budgets that person can already open in Procore. Elaichi can narrow that further with roles and restrictions, but it can never widen it beyond what Procore itself allows that person.

### Can my team share one Procore connection?

Yes. One administrator connects Procore in Elaichi and shares the connection with a team, and nobody else handles the client ID, secret or any Procore credential. Each teammate still signs in to Elaichi as themselves, so the audit log names the actual person behind every budget change or checklist response.

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

Yes. Restrictions in Elaichi apply per action, so you can allow reading Procore budgets while blocking the ability to delete budget line items, delete checklist responses or unlock a budget. A restricted action is never advertised to Claude, ChatGPT or Cursor at all, so no prompt, however worded, can reach it.

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

When you offboard someone in Elaichi, their access to Procore through every AI client ends at once. A Procore connection shared with the team keeps working for everyone else. If you ever want it gone entirely, disconnecting Procore once in Elaichi removes it from Claude, ChatGPT, Cursor and every other client together.

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

Yes. Procore 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.

### Is Elaichi an alternative to Zapier MCP for Procore?

Yes. Both let Claude, ChatGPT or Cursor use Procore. Zapier MCP fits a team that already automates in Zapier, since each person signs in and acts as themselves in that account. Elaichi fits when IT wants one address for the whole company, per-tool rules by role, and a record of every Procore call.

### How is Elaichi different from Composio for Procore?

Composio gives AI agents tools and sign-in handling across 1,000+ apps, for developers building agents or people using an assistant, billed per tool call. Elaichi gives a company's own people governed access to Procore: one address, restrictions per role or user, and $15 per user per month. Both have role permissions and a log of every call.

## All 125 Procore tools

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

- **Create a Procore oauth token** (Create). Get or refresh a Procore OAuth access token. Returns: access_token, token_type, expires_in, refresh_token, created_at. Required: grant_type, client_id, client_secret. Use grant_type=authorization_code for a new token, grant_type=refresh_token to refresh an existing one, or grant_type=client_credentials for Procore Service Account authentication.
- **List all Procore oauth tokens** (List). Get details about the current Procore access token, such as the resource owner it belongs to and its remaining lifetime. Returns: resource_owner_id, scopes, expires_in_seconds, application, created_at.
- **Procore oauth tokens revoke** (Revoke). Revoke a Procore access token, invalidating both the access token and its refresh token; the authorization server returns success whether the token was revoked or was already invalid. Requires the Procore-Company-Id header. Returns an empty response body on success. Required: token, client_id, client_secret.
- **List all Procore webhook hooks** (List). List Procore webhook hooks scoped to a company and/or project. Returns: id, api_version, destination_headers, destination_url, owned_by_company_id, owned_by_project_id, owned_by_user_id, namespace, ulid, timestamp, metadata, user_id, company_id, project_id, event_type, resource_name, resource_id. Required: company_id or project_id — hooks cannot be listed without a scope.
- **Create a Procore webhook hook** (Create). Create a Procore webhook hook that delivers event payloads to a destination URL. Returns: id, api_version, destination_headers, destination_url, owned_by_company_id, owned_by_project_id, owned_by_user_id, namespace, ulid, timestamp, metadata, user_id, company_id, project_id, event_type, resource_name, resource_id. Required: hook (with api_version and destination_url), plus either company_id or…
- **Update a Procore webhook hook by ID** (Update). Update a Procore webhook hook by id. Returns: id, api_version, destination_headers, destination_url, owned_by_company_id, owned_by_project_id, owned_by_user_id, namespace, ulid, timestamp, metadata, user_id, company_id, project_id, event_type, resource_name, resource_id. Required: id, hook (with api_version and destination_url), plus either company_id or project_id.
- **Delete a Procore webhook hook by ID** (Delete). Delete a Procore webhook hook by id. Returns an empty 204 response on success. Required: id.
- **List all Procore webhook resources** (List). List Webhook Resources for the given scope in Procore. Returns: id, ulid, timestamp, metadata, user_id, company_id, project_id, api_version, event_type, resource_name, resource_id, related_resources, reason, resource_type. Deprecated v1.0 endpoint.
- **List all Procore companies** (List). List Procore companies visible to the current user. Returns: id, name, is_active, logo_url, pcn_business_experience, my_company. Supports an optional view parameter (defaults to compact) and does not require the Procore-Company-Id header.
- **List all Procore me** (List). Get information about the authenticated Procore user, including a globally unique user id (unique across companies). Returns: id, login, name, ulid, timestamp, metadata, user_id, company_id, project_id, api_version, event_type, resource_name, resource_id.
- **List all Procore company projects** (List). List Procore projects associated with a company that the current user can access. Returns: id, name, project_number, stage_name, description, active, company_id. Required: company_id.
- **Procore budget lock** (Action). Lock a Procore project's budget to prevent further budget modifications. Returns: locked. Required: project_id.
- **Procore budget unlock** (Action). Unlock a Procore project's budget so budget modifications can resume. Returns: locked. Required: project_id.
- **List all Procore budget** (List). Get budget metadata for a Procore project, including the current locked status of the budget. Returns: locked. Required: project_id.
- **List all Procore budget line items** (List). List budget line items for a Procore project. Returns a paginated list in a data array of budget line item records, each with its id; each page has a maximum of 100 items. Required: project_id.
- **Create a Procore budget line item** (Create). Create a new budget line item in a Procore project. Returns the created line item's id, original_budget_amount, uom, quantity, unit_cost, and calculation_strategy. Required: project_id, budget_line_item (with wbs_code_id inside it).
- **Procore budget line items bulk delete** (Delete). Delete Budget Line Items in bulk for a Procore project. Returns an empty 204 response on success. Required: project_id (the project whose budget line items are deleted).
- **List all Procore timecard time types** (List). List all Timecard Time Types for a Procore company. Returns: id, time_type, in_use. Required: company_id.
- **Update a Procore timecard time type by ID** (Update). Update a Timecard Time Type for a Procore company. Returns the updated time type record including its id, time_type, and in_use status. Required: id, company_id, and a timecard_time_type body with pay_rate, name, and abbreviated_time_type.
- **List all Procore checklist responses** (List). List checklist Responses for a Procore company. Returns the collection under data: data.id, data.login, data.name. Required: company_id.
- **Create a Procore checklist response** (Create). Create a checklist Response for a Procore company. Returns the created record wrapped in the data envelope: data.id, data.login, data.name. Required: company_id, response (name, corresponding_status).
- **Get single Procore checklist response by ID** (Get). Get a checklist Response by id for a Procore company. Returns the Response wrapped in the data envelope: data.id, data.login, data.name. Required: company_id, id.
- **Update a Procore checklist response by ID** (Update). Update a checklist Response by id for a Procore company. Returns the updated record wrapped in the data envelope: data.id, data.login, data.name. Required: company_id, id.
- **Delete a Procore checklist response by ID** (Delete). Delete a checklist Response by id for a Procore company. Returns an empty 204 response on success. Required: company_id, id.
- **List all Procore crews** (List). List all crews with details for a specified Procore project. Returns crew records including id, name, lead_party_id, party_ids, equipment_ids, and created_at. Required: project_id.
- **Create a Procore crew** (Create). Create a new crew in a Procore project. Returns the created crew record including id, name, lead_party_id, party_ids, and created_at. Required: project_id.
- **Get single Procore crew by ID** (Get). Get detailed information for a single crew in a Procore project. Returns: id, name, lead_party_id, party_ids, equipment_ids, created_at, updated_at. Required: project_id, id.
- **Update a Procore crew by ID** (Update). Update a Crew in Procore for the specified project. Returns the updated crew record including id, name, lead_party_id, party_ids, equipment_ids, created_at, and updated_at. Required: project_id, id, crew.
- **Delete a Procore crew by ID** (Delete). Delete a Crew in Procore for the specified project. Returns an empty 204 response on success. Required: project_id, id.
- **List all Procore webhook triggers** (List). List triggers configured on a Procore webhook hook. Returns an array of trigger records including id, timestamp, company_id, event_type, resource_name, and resource_id. Required: hook_id. The upstream v1.0 endpoint is deprecated.
- **Create a Procore webhook trigger** (Create). Create a trigger on a Procore company webhook hook. Returns the created trigger record including id, timestamp, event_type, resource_name, and resource_id. Requires hook_id, company_id, api_version, and a trigger object with resource_name and event_type. The upstream v1.0 endpoint is deprecated.
- **Procore webhook triggers bulk create** (Create). Create multiple triggers on a Procore company webhook hook in a single request. Returns the created trigger records including id, timestamp, event_type, resource_name, and resource_id. Requires hook_id, company_id, api_version, and a triggers array with resource_name and event_type per item. Max 500 triggers; the upstream v1.0 endpoint is deprecated.
- **Procore webhook triggers bulk delete** (Delete). Bulk delete Procore webhook triggers by id, removing up to 500 triggers from a hook in a single request. Returns an empty 204 response on success. Required: hook_id, company_id, triggers. The upstream v1.0 endpoint is deprecated.
- **Delete a Procore webhook trigger by ID** (Delete). Delete a single Procore webhook trigger from a hook by id. Deprecated v1.0 endpoint — prefer the v2.0 company/project trigger endpoints. Returns an empty 204 response on success. Required: hook_id and id.
- **List all Procore daily logs** (List). List counts of Procore daily logs by type for a project (v1.1 counts endpoint, replacement for the deprecated /daily_logs/count). Returns one entry per log module with module_name, count, and position. Required: project_id.
- **List all Procore rfi advanced exports** (List). Get the available advanced export options for an existing RFI in Procore. Returns option groups including slug, name, type, and the selectable options (id, name) that can be passed when requesting an export. Required: project_id, rfi_id.
- **Create a Procore rfi advanced export** (Create). Request an advanced export of an existing RFI in Procore, specifying the cover sheet and which associated attachments to include. Returns a confirmation message; the export is processed asynchronously and the compiled file is delivered by email when ready. Required: project_id, rfi_id, format, options.
- **List all Procore change event comments** (List). List comments on a Procore change event. Returns comment objects with id, body, rating, prostore_file_ids, created_at, and updated_at. Required: company_id, project_id, change_event_id.
- **Create a Procore change event comment** (Create). Create a comment on a Procore change event. Returns the created comment with id, body, rating, prostore_file_ids, created_at, and updated_at. Required: company_id, project_id, change_event_id, and comment.body.
- **Delete a Procore change event comment by ID** (Delete). Delete a comment on a Procore change event by id. Returns an empty 204 response on success. Required: company_id, project_id, change_event_id, and id.
- **List all Procore rfis** (List). List all RFIs in a Procore project. Returns RFI records with id, subject, number, status, questions, and assignees. Required: project_id. Supports filters (e.g. filters[status], filters[overdue]), search, sort[attribute], and serializer_view.
- **Create a Procore rfi** (Create). Create a new RFI in a Procore project. Returns the created RFI with id, subject, number, status, questions, and assignees. Required: project_id, rfi (with subject, question, and rfi_manager_id).
- **Get single Procore rfi by ID** (Get). Get detailed information about a specific RFI in a Procore project. Returns: id, subject, reference, number, status, translated_status, due_date, due_date_variance, drawing_number, priority, position, questions, assignees, distribution_list, created_at, updated_at, initiated_at, time_resolved, assigned_id, ball_in_court_id, cost_code_id, created_by_id, location_id, responsible_contractor_id,…
- **Update a Procore rfi by ID** (Update). Update a specified RFI in a Procore project. Returns the updated RFI with id, subject, number, status, questions, and updated_at. Required: project_id, id, rfi.
- **Procore rfis bulk update** (Update). Update multiple RFIs in a Procore project in a single batch request. Returns the updated RFI records with id, subject, number, status, questions, and assignees. Required: project_id and a body array of RFI objects each with an id.
- **List all Procore mpz** (List). Check which Multiple Procore Zones (MPZ) zone a company in Procore is routed to and which web URL serves it. Returns: zone, web_base_url.g. us02) and web_base_url (e.g. https://us02.procore.com).
- **List all Procore rfi replies** (List). List replies for a specified RFI in a Procore project. Returns each reply's id, official flag, answer_date, plain_text_body, rich_text_body, created_by, created_by_id, and attachments. Required: project_id, rfi_id.
- **Create a Procore rfi reply** (Create). Create a reply for a specified RFI in a Procore project. Returns the created reply including id, official, answer_date, plain_text_body, created_by, and attachments. Required: project_id, rfi_id, reply.
- **Get single Procore rfi reply by ID** (Get). Get detailed information on a specified RFI reply in a Procore project. Returns: id, official, answer_date, plain_text_body, rich_text_body, created_by, created_by_id, attachments. Required: project_id, rfi_id, id.
- **Update a Procore rfi reply by ID** (Update). Update a specified RFI reply in a Procore project. Returns the updated reply including id, official, answer_date, plain_text_body, created_by, and attachments. Required: project_id, rfi_id, id.
- ...and 75 more tools. Call `tools/list` via the MCP endpoint, or see the full catalog via the API, for the complete set.
