Procore MCP server Let your AI agent do the Procore paperwork.

Draft RFIs, chase overdue submittals, log manpower and send punch lists from your AI agent. It signs in to Procore as you, so there is no developer app to register. Cotlet runs it hosted, around the clock.

  • Free 7-day trial, no card
  • Unofficial, not affiliated with Procore
Procore logo Procore Cloud Browser

13 tools Read and write

RFIs to punch lists

What can your AI agent do in Procore? Site notes in, project records out.

  • Draft RFIs from your site notes

  • Chase overdue RFIs and submittals

  • Log daily manpower from a crew message

  • Turn walkthrough notes into punch items

  • Send the punch list to its assignees

  • Close observations once they are fixed

API yes, MCP no

Does Procore have an MCP server or an API? A REST API and a Zapier app, no MCP server for your agent.

Procore has a REST API with OAuth 2.0 and a sandbox, and we found no Procore MCP server for your own AI agent (checked 6 Nov 2026). Cotlet adds 13 Procore tools for Claude, ChatGPT and scripts: no API key to request, no developer app to register, hosted all day, and one account for your other apps too.

  • The API runs through an app registered in the Developer Portal and installed by a company admin. Calls are limited per hour and per 10 seconds, and going over returns a 429.
  • Zapier has a Procore app with 26 triggers and more than 36 actions, among them Create RFI, Create Punch Item and Create Observation. Zapier MCP offers the same actions at 2 Zapier tasks a call.
  • Procore's own AI (Helix, Copilot, Agent Builder) works inside Procore. The Developer Portal lets Marketplace apps declare MCP servers, but we found no Procore-run server for your own agent.
The Procore API with Zapier, a GitHub MCP server and Cotlet compared
What you need API + ZapierGitHub serverCotlet
Create an RFI or punch item Yes Yes, any endpoint Yes, after your OK
Send all punch list items Not in the action list If your agent builds it Yes, after your OK
Works as you, with your role As the installed app As your own app Yes, your login
No developer app to register Zapier has one Register your own Yes
Runs with your computer off Yes Mostly no Yes, hosted
Inside the Claude and ChatGPT apps Through Zapier MCP Claude Desktop and Code Yes

Checked 6 Nov 2026. Sources: Procore Developers · Procore Developers: Rate limiting · Procore Support: Install a Custom App · Zapier: Procore integrations · Zapier MCP for Procore

Set up once

How does the Procore MCP server work? Your login, your role, your agent.

  1. 1Sign in to Procore

    Once, in a browser we run for you.

  2. 2Connect your AI agent

    Paste one address.

  3. 3Ask in plain words

    The agent works in your projects.

We never keep your Procore password, and every call that emails a person or saves a record waits for your OK. Who can see your session

Any MCP client

How to connect Procore to your AI agent

Three steps, then one code block for your client.

  1. 1

    Enable Procore for agents. Sign up, sign in to Procore in its Cloud Browser with your own login, then press Enable for agents.

  2. 2

    Add the Cotlet address. Enter https://cotlet.dev/mcp/v1 as a custom MCP server or connector in your agent.

  3. 3

    Approve the connection. Chat apps open a Cotlet sign-in page. Editors, n8n and scripts use an API key from the console.

One shared address, https://cotlet.dev/mcp/v1, also carries Procore next to your other apps. Turned Procore on after connecting? Refresh the connector so the agent sees the 13 new tools.

Claude
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect

Claude Code:
claude mcp add --transport http cotlet-procore \
  https://cotlet.dev/mcp/v1 \
  --header "Authorization: Bearer $COTLET_API_KEY"
ChatGPT
Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth
Cursor
// ~/.cursor/mcp.json
{
  "mcpServers": {
    "cotlet-procore": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
    }
  }
}
Codex
# ~/.codex/config.toml
[mcp_servers.cotlet-procore]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY"
n8n
MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: procore_read
Make, Zapier
Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: procore_write
7 read, 6 write

All 13 Procore MCP tools

Projects and RFIs4

Every other tool takes a project_id from list_projects. An RFI is saved as a draft unless you give it a number, assignees and a due date.

  • list_projects Procore projects of your company that you can open, with name and ID. read

    Returns the projects your Procore login can open, 25 to a page by default. Use project_id in every other tool. Projects you have no access to are not listed. Pass next_cursor back as cursor for the next page.

    MCP callprocore_read → list_projects

    REST endpointGET https://cotlet.dev/api/v1/procore/projects

    Parameters

    Parameters: list_projects
    NameTypeDescription
    query string string Only projects whose name contains this text.
    limit integer integer 1 to 50. Default: 25.
    cursor string string Next page cursor from the previous call.

    Example response

    {
      "projects": [
        {
          "project_id": "5518204",
          "name": "Harbor Street Offices",
          "number": "HS-24",
          "active": true
        },
        {
          "project_id": "5518377",
          "name": "Elm Court Apartments",
          "number": "EC-25",
          "active": true
        }
      ],
      "next_cursor": null
    }
  • list_rfis RFIs of one project with status, RFI Manager, assignees, due date and who has the ball in court. read

    Lists RFIs of one project, newest number first. Each row carries the subject, the status, the RFI Manager, the assignees, the due date, the Ball In Court and the cost and schedule impact. A Standard user sees fewer fields and can open a draft only if they created it. Pass next_cursor back as cursor for the next page.

    MCP callprocore_read → list_rfis

    REST endpointGET https://cotlet.dev/api/v1/procore/projects/{project_id}/rfis

    Parameters

    Parameters: list_rfis
    NameTypeDescription
    project_id string required string Project ID from list_projects.
    status enum enum draft, open or closed. Default: all.
    assignee string string Only RFIs assigned to this person, by name.
    overdue boolean boolean Only open RFIs past their due date.
    limit integer integer 1 to 50. Default: 25.
    cursor string string Next page cursor from the previous call.

    Example input

    {
      "project_id": "project_8c41d2"
    }

    Example response

    {
      "rfis": [
        {
          "rfi_id": "90417",
          "number": 31,
          "subject": "Slab edge at level two stair",
          "status": "open",
          "rfi_manager": "Dana Whitfield",
          "assignees": [
            "Marcus Hale"
          ],
          "ball_in_court": "Marcus Hale",
          "due_date": "2026-11-03",
          "cost_impact": "TBD",
          "schedule_impact": "No"
        },
        {
          "rfi_id": "90402",
          "number": 30,
          "subject": "Door hardware schedule conflict",
          "status": "open",
          "rfi_manager": "Dana Whitfield",
          "assignees": [
            "Priya Nair"
          ],
          "ball_in_court": "Priya Nair",
          "due_date": "2026-11-07",
          "cost_impact": "No",
          "schedule_impact": "No"
        }
      ],
      "next_cursor": null
    }
  • get_rfi One RFI with its question, responses, attachments and distribution list. read

    Returns the full question, every response with its author and date, the attachment names, the distribution list and the location, spec section and drawing number. A Standard or Read-Only user sees every response only if the project does not limit them to official responses; otherwise only the official response is returned.

    MCP callprocore_read → get_rfi

    REST endpointGET https://cotlet.dev/api/v1/procore/projects/{project_id}/rfis/{rfi_id}

    Parameters

    Parameters: get_rfi
    NameTypeDescription
    project_id string required string Project ID from list_projects.
    rfi_id string required string RFI ID from list_rfis.

    Example input

    {
      "project_id": "project_8c41d2",
      "rfi_id": "rfi_8c41d2"
    }

    Example response

    {
      "rfi_id": "90417",
      "number": 31,
      "subject": "Slab edge at level two stair",
      "status": "open",
      "question": "Drawing S-201 shows the slab edge flush with the stair wall. Detail 4 on S-501 shows a 2 inch step. Which one governs?",
      "location": "Level 2, Stair B",
      "spec_section": "03 30 00",
      "drawing_number": "S-201",
      "responses": [],
      "attachments": [
        "S-201-markup.pdf"
      ],
      "distribution": [
        "Dana Whitfield",
        "Priya Nair"
      ]
    }
  • create_rfi Create an RFI as a draft or as open, with subject, question, RFI Manager and assignees. writeasks first

    Creates an RFI. As a draft, the Ball In Court stays with the RFI Manager and nobody else is asked. As open, the assignees get the Ball In Court. Open needs number, subject, assignees, due date and question. Open and draft both need Admin on the RFIs tool, or Standard with the Act as RFI Manager permission; with Standard only, the RFI is saved as a draft for review. By default you confirm each call; you can switch that off for this tool.

    MCP callprocore_write → create_rfi

    REST endpointPOST https://cotlet.dev/api/v1/procore/projects/{project_id}/rfis

    Parameters

    Parameters: create_rfi
    NameTypeDescription
    project_id string required string Project ID from list_projects.
    subject string required string Short subject of the RFI.
    question string required string The question, in full.
    status enum enum draft or open. Default: draft.
    number string string RFI number. Needed for an open RFI; duplicates are not allowed.
    rfi_manager string string RFI Manager, by name. Default: you.
    assignees array array Names of the people who must respond. Needed for an open RFI.
    due_date date date Needed for an open RFI.
    location string string Location from the project list.
    spec_section string string Spec section, e.g. 03 30 00.
    cost_impact enum enum yes, yes_unknown, no, tbd or na.
    schedule_impact enum enum yes, yes_unknown, no, tbd or na.

    Example input

    {
      "project_id": "5518204",
      "subject": "Roof drain location at gridline D",
      "question": "Drawing A-301 puts the roof drain 2 feet off gridline D. The structural plan shows a beam there. Please confirm the drain location.",
      "status": "draft",
      "spec_section": "22 14 00"
    }

    Example response

    {
      "rfi_id": "90431",
      "number": 32,
      "subject": "Roof drain location at gridline D",
      "status": "draft",
      "rfi_manager": "Dana Whitfield",
      "ball_in_court": "Dana Whitfield"
    }

Submittals1

Read only. The status filter takes a name exactly as your project's Submittals log shows it.

  • list_submittals Submittals of one project with number, title, spec section, type, status, responsible contractor and ball in court. read

    Lists submittals of one project in log order. Each row carries the number and revision, title, spec section, type, status, responsible contractor, Submit By date and the Ball In Court. Procore sets the Ball In Court to the Submittal Manager when there is no workflow, and to the current workflow step when there is one. Pass next_cursor back as cursor for the next page.

    MCP callprocore_read → list_submittals

    REST endpointGET https://cotlet.dev/api/v1/procore/projects/{project_id}/submittals

    Parameters

    Parameters: list_submittals
    NameTypeDescription
    project_id string required string Project ID from list_projects.
    status string string A status name exactly as your project's Submittals log shows it.
    spec_section string string Only submittals under this spec section, e.g. 08 71 00.
    overdue boolean boolean Only submittals past their Submit By date.
    limit integer integer 1 to 50. Default: 25.
    cursor string string Next page cursor from the previous call.

    Example input

    {
      "project_id": "project_8c41d2"
    }

    Example response

    {
      "submittals": [
        {
          "submittal_id": "70133",
          "number": "08 71 00-1",
          "revision": 0,
          "title": "Door hardware, Level 1 and 2",
          "spec_section": "08 71 00",
          "type": "Product Information",
          "status": "Open",
          "responsible_contractor": "Ridgeline Doors",
          "ball_in_court": "Dana Whitfield",
          "submit_by": "2026-10-30"
        }
      ],
      "next_cursor": null
    }

Punch list3

A new item reaches nobody until send_punch_list_items goes out, the same as Send All Items in Procore.

  • list_punch_list_items Punch list items of one project with location, assignee, final approver, priority and due date. read

    Lists punch list items of one project. Each row carries the title, number, punch manager, assignees, final approver, location, trade, priority, due date and whether it has been sent. Private items appear only if you are the creator, an assignee, on the distribution list or a Punch List Admin. Pass next_cursor back as cursor for the next page.

    MCP callprocore_read → list_punch_list_items

    REST endpointGET https://cotlet.dev/api/v1/procore/projects/{project_id}/punch-list-items

    Parameters

    Parameters: list_punch_list_items
    NameTypeDescription
    project_id string required string Project ID from list_projects.
    assignee string string Only items assigned to this person, by name.
    location string string Only items at this location.
    priority enum enum low, medium or high.
    overdue boolean boolean Only items past their due date.
    limit integer integer 1 to 50. Default: 25.
    cursor string string Next page cursor from the previous call.

    Example input

    {
      "project_id": "project_8c41d2"
    }

    Example response

    {
      "items": [
        {
          "item_id": "30871",
          "number": 14,
          "title": "Touch up paint at corridor door frames",
          "location": "Level 1 > Corridor",
          "assignee": "Priya Nair",
          "final_approver": "Dana Whitfield",
          "priority": "Medium",
          "due_date": "2026-11-12",
          "sent": true
        }
      ],
      "next_cursor": null
    }
  • create_punch_list_item Add a punch list item with location, assignee, final approver, priority and due date. Nobody is notified until you send. writeasks first

    Creates one punch list item and returns its ID and number. Procore sends no notification on save: assignees and the distribution list hear about the item only after send_punch_list_items. Standard users can assign only a Punch Item Manager, and Read Only users cannot be assigned. By default you confirm each call; you can switch that off for this tool.

    MCP callprocore_write → create_punch_list_item

    REST endpointPOST https://cotlet.dev/api/v1/procore/projects/{project_id}/punch-list-items

    Parameters

    Parameters: create_punch_list_item
    NameTypeDescription
    project_id string required string Project ID from list_projects.
    title string required string Title shown in the list.
    location string string A location from the project, up to two tiers, e.g. Level 1 > Corridor.
    assignee string string Person who resolves the item, by name. Must be in the project directory.
    final_approver string string Person who can close the item. Default: you.
    priority enum enum low, medium or high.
    due_date date date Default: the number of days set in the project settings.
    trade string string A trade set up in your company.
    description string string What is wrong and how to fix it.

    Example input

    {
      "project_id": "project_8c41d2",
      "title": "title"
    }

    Example response

    {
      "item_id": "30884",
      "number": 15,
      "title": "Replace cracked tile at the lobby threshold",
      "location": "Level 1 > Lobby",
      "assignee": "Priya Nair",
      "priority": "Medium",
      "due_date": "2026-11-12",
      "sent": false
    }
  • send_punch_list_items Send every unsent punch list item of a project to its assignees and distribution list by email. writeasks first

    Does what Send All Items does in the Punch List banner: assignees and distribution list members get an email for each unsent item. Returns how many items went out and to whom. After the first send, assignees get daily emails about overdue items, which end after 45 days. By default you confirm each call; you can switch that off for this tool.

    MCP callprocore_write → send_punch_list_items

    REST endpointPOST https://cotlet.dev/api/v1/procore/projects/{project_id}/punch-list-items/send-punch-list-items

    Parameters

    Parameters: send_punch_list_items
    NameTypeDescription
    project_id string required string Project ID from list_projects.

    Example input

    {
      "project_id": "project_8c41d2"
    }

    Example response

    {
      "project_id": "5518204",
      "items_sent": 3,
      "notified": [
        "Priya Nair",
        "Marcus Hale"
      ]
    }

Observations3

The status move follows Procore's own steps: the assignee sets Ready for Review, the creator closes.

  • list_observations Observations of one project with type, status, priority, assignee and due date. read

    Lists observations of one project. Each row carries the number, title, type, status, priority, trade, assignee, due date and location. Initiated means the observation waits for the assignee, Ready for Review waits for the creator, and Not Accepted has gone back to the assignee. Pass next_cursor back as cursor for the next page.

    MCP callprocore_read → list_observations

    REST endpointGET https://cotlet.dev/api/v1/procore/projects/{project_id}/observations

    Parameters

    Parameters: list_observations
    NameTypeDescription
    project_id string required string Project ID from list_projects.
    status enum enum initiated, ready_for_review, not_accepted or closed. Default: all.
    priority enum enum low, medium, high or urgent.
    assignee string string Only observations assigned to this person, by name.
    limit integer integer 1 to 50. Default: 25.
    cursor string string Next page cursor from the previous call.

    Example input

    {
      "project_id": "project_8c41d2"
    }

    Example response

    {
      "observations": [
        {
          "observation_id": "41250",
          "number": 8,
          "title": "Open floor edge near the loading dock",
          "type": "Safety",
          "status": "ready_for_review",
          "priority": "High",
          "trade": "Concrete",
          "assignee": "Marcus Hale",
          "due_date": "2026-11-04",
          "location": "Level 1 > Loading dock"
        }
      ],
      "next_cursor": null
    }
  • create_observation Create an observation with type, priority, assignee, trade, location and due date. writeasks first

    Creates an observation in the status Initiated, which waits for the assignee. Procore does not send observation emails automatically. With no assignee, nobody is notified; adding an assignee and saving triggers an email. By default you confirm each call; you can switch that off for this tool.

    MCP callprocore_write → create_observation

    REST endpointPOST https://cotlet.dev/api/v1/procore/projects/{project_id}/observations

    Parameters

    Parameters: create_observation
    NameTypeDescription
    project_id string required string Project ID from list_projects.
    title string required string Title that names the topic.
    type string string A type set up in the project.
    assignee string string Person who does the work. Must have Standard or Admin on the Observations tool.
    priority enum enum low, medium, high or urgent.
    trade string string A trade set up in your company.
    location string string Location from the project list.
    due_date date date Default: the number of days set in the project settings.
    description string string What was observed and what the work should be.

    Example input

    {
      "project_id": "project_8c41d2",
      "title": "title"
    }

    Example response

    {
      "observation_id": "41266",
      "number": 9,
      "title": "Missing guardrail at the Level 2 stair",
      "status": "initiated",
      "priority": "Urgent",
      "assignee": "Marcus Hale",
      "due_date": "2026-11-06"
    }
  • set_observation_status Move an observation to Ready for Review, Not Accepted or Closed. writeasks first

    The assignee sets Ready for Review, which emails the creator. The creator sets Closed to finish the item; Not Accepted sends it back to the assignee. The call fails if your login is not the right person for that step. By default you confirm each call; you can switch that off for this tool.

    MCP callprocore_write → set_observation_status

    REST endpointPUT https://cotlet.dev/api/v1/procore/projects/{project_id}/observations/{observation_id}/status

    Parameters

    Parameters: set_observation_status
    NameTypeDescription
    project_id string required string Project ID from list_projects.
    observation_id string required string Observation ID from list_observations.
    status enum required enum ready_for_review, not_accepted or closed.

    Example input

    {
      "project_id": "project_8c41d2",
      "observation_id": "observation_8c41d2",
      "status": "ready_for_review"
    }

    Example response

    {
      "observation_id": "41250",
      "number": 8,
      "status": "closed"
    }

Daily log2

Different hours per worker need a separate manpower entry.

  • get_daily_log The daily log of one project for one day: how many entries each section has, and the manpower entries. read

    Returns the daily log of one project for one day. entries_by_section counts the entries in each section that has any, such as Manpower, Deliveries, Visitors or Notes. The manpower entries come with company, workers, hours and total hours. Collaborator entries that wait for approval are marked pending.

    MCP callprocore_read → get_daily_log

    REST endpointGET https://cotlet.dev/api/v1/procore/projects/{project_id}/daily-log

    Parameters

    Parameters: get_daily_log
    NameTypeDescription
    project_id string required string Project ID from list_projects.
    date date date The log day. Default: today.

    Example input

    {
      "project_id": "project_8c41d2"
    }

    Example response

    {
      "date": "2026-11-04",
      "entries_by_section": {
        "Manpower": 2,
        "Deliveries": 1
      },
      "manpower": [
        {
          "company": "Ridgeline Doors",
          "workers": 3,
          "hours": 7,
          "total_hours": 21,
          "location": "Level 1",
          "pending": false
        },
        {
          "company": "Summit Concrete",
          "workers": 4,
          "hours": 8,
          "total_hours": 32,
          "location": "Level 2",
          "pending": false
        }
      ]
    }
  • add_manpower_entry Add a manpower entry to the daily log: company, number of workers and hours each. writeasks first

    Adds one entry to the Manpower section of the daily log and returns it with total hours (workers times hours). Creating manpower entries needs Standard or Admin on the Daily Log tool. The entry reaches nobody by itself. By default you confirm each call; you can switch that off for this tool.

    MCP callprocore_write → add_manpower_entry

    REST endpointPOST https://cotlet.dev/api/v1/procore/projects/{project_id}/manpower-entries

    Parameters

    Parameters: add_manpower_entry
    NameTypeDescription
    project_id string required string Project ID from list_projects.
    company string required string Company or person doing the work. Must be in the project directory.
    workers integer required integer Number of workers from that company on the job.
    hours number required number Hours each worker worked. Different hours need a separate entry.
    date date date The log day. Default: today.
    location string string Location from the project list.
    comments string string Anything that clarifies the entry.

    Example input

    {
      "project_id": "project_8c41d2",
      "company": "company",
      "workers": 1,
      "hours": 1
    }

    Example response

    {
      "entry_id": "66120",
      "date": "2026-11-04",
      "company": "Summit Concrete",
      "workers": 4,
      "hours": 8,
      "total_hours": 32,
      "location": "Level 2"
    }
Encrypted, revocable

Who can see my Procore session, and how do I revoke it?

  • What we store

    Your signed-in Procore browser profile, encrypted with AES-256-GCM, in Finland. Not the password.

  • What your agent gets

    The 13 Procore tools. Never the cookie or the login.

  • What the session sees

    The projects your Procore user can open: RFIs, submittals, punch items, observations, daily logs.

  • What no tool touches

    Budgets, commitments, payments, drawings, users and company settings.

  • If your company uses SSO

    You sign in through it yourself, and a 2-step code goes to you. We never type it.

  • How to cut access

    Disable for agents, reset the browser or delete the API key. The next call fails.

cotlet.dev gets A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.

Follows your role

Which Procore permissions does my agent have? Exactly yours.

What a Procore tool needs from your role
ToolWhat Procore asks for
create_rfiAdmin on the RFIs tool, or Standard with Act as RFI Manager. With Standard only, the RFI is saved as a draft for review.
get_rfiA Standard or Read-Only user sees every response only if the project does not limit them to official responses.
create_punch_list_itemStandard users can assign only a Punch Item Manager. Read Only users cannot be assigned.
create_observationThe assignee needs Standard or Admin on the Observations tool.
add_manpower_entryStandard or Admin on the Daily Log tool.

What that means for you

  • The agent never sees a project you cannot open
  • A call your role may not make fails and costs nothing
  • Private punch items show only if you created them or are assigned
  • No admin has to install a developer app for you

Draft RFIs are the safe start: nobody is asked until an RFI is opened.

Tested every 12 h

What happens when Procore changes? We repair the tool; your prompts stay the same.

between tests of the Procore tools
12 h
for a call to a Procore tool paused for repair
$0

Procore projects differ: each company sets its own locations, trades, RFI types and submittal statuses, so the tools read them as your project shows them. When Procore moves a button or renames a field, the fix is on our side. status.cotlet.dev checks the site, console and API every 3 minutes.

6 tools ask first

Approvals, undo and mistakes Nobody is asked or emailed until you say so.

  1. 01 Reads the notes One question per RFI, with the drawing or spec section named.
  2. 02 Checks open RFIs list_rfis on the project finds a duplicate before anything is saved.
  3. 03 Waits for your OK Each draft shows up in your Cotlet console first.
  4. 04 Reports back RFI numbers, who holds the ball, and notes it could not place.
Which Procore actions can be undone
ActionUndo
Create a draft RFIEdit it in Procore; nobody was asked
Open an RFIThe assignees hold the ball; edit or close it in Procore
Create a punch itemEdit it in Procore before you send; nobody hears about it
Send the punch listNo, the emails are out
Create an observationEdit it in Procore; with no assignee nobody is notified
Set an observation statusNo tool undoes it; Ready for Review already emailed the creator
Add a manpower entryEdit the entry in the Daily Log; nobody was told

All 6 write tools ask first, including the drafts. The 7 reads run at once. Turn the wait off per tool for a scheduled run, such as a daily manpower log at 5 pm.

After the first send, Procore emails assignees about overdue punch items every day for 45 days.

MCP call
{
  "name": "create_rfi",
  "arguments": {
    "project_id": "5518204",
    "subject": "Roof drain location at gridline D",
    "question": "Drawing A-301 puts the roof drain 2 feet off gridline D. The structural plan shows a beam there. Please confirm the drain location.",
    "status": "draft",
    "spec_section": "22 14 00"
  }
}
REST
curl -X POST https://cotlet.dev/api/v1/procore/projects/5518204/rfis \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subject":"Roof drain location at gridline D","question":"Drawing A-301 puts the roof drain 2 feet off gridline D. The structural plan shows a beam there. Please confirm the drain location.","status":"draft","spec_section":"22 14 00"}'
Tool output
{
  "rfi_id": "90431",
  "number": 32,
  "subject": "Roof drain location at gridline D",
  "status": "draft",
  "rfi_manager": "Dana Whitfield",
  "ball_in_court": "Dana Whitfield"
}

Scripts and cron jobs reach the same tools over REST at /api/v1/procore, with the same key and price. A write answers 202 while it waits for your OK. Each row in the tools table shows its REST path.

Pay per call

How much does the Procore MCP server cost?

About $25 a monthfor a contractor with 6 active projects, 4,280 credits. Your Procore contract is billed as before.

A month of Procore jobs for 6 active projects, in credits
JobCallsCredits
Draft RFIs from site notes, 4 per batch6 × 8480
Overdue RFIs and submittals, 6 projects12 × 4480
Daily manpower log, busiest project5 × 221,100
Walkthrough punch list, 8 items, then send10 × 4400
Close fixed observations4 × 8320
Cloud Browser, 30 days1,500
Total4,280
  • Free 7-day trial, no card
  • 10 credits per successful call, MCP or REST
  • 50 credits a day for the Cloud Browser
  • One-time packs, valid 12 months, no subscription

The month is our example. A study of 1,362 projects counted 9.9 RFIs per $1 million of construction, so six projects of about $8 million come to roughly 40 new RFIs a month. Procore sells by annual construction volume and publishes no price list. Dollars at the $29 pack rate.

Cotlet credit packs: price, credits and calls at 10 credits each
Credits Price, one time Calls at 10 credits Per 1,000 credits
5,000 $29 500 $5.80
15,000 $79 1,500 $5.27
32,000 $149 3,200 $4.66
60,000 $249 6,000 $4.15

Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.

Other options

Procore MCP server: API, Zapier, GitHub or hosted Own the OAuth app, or sign in as yourself.

Procore MCP options, checked 6 Nov 2026
OptionWhat it doesWhere it stops
Procore REST APIOfficial: projects, RFIs, submittals, punch items, observations, daily logs, webhooks and a sandbox.You register an app, an admin installs it, and you build the tool layer; hourly and 10-second limits.
Zapier MCP for ProcoreThe Zapier Procore app as an MCP server: create RFIs, punch items, observations, submittals, tasks and more.2 Zapier tasks a call; no "send punch list" action in the list we read.
Pipedream MCPHosted MCP for Procore over the OAuth API, for Cursor, Claude and Windsurf.The Procore app still needs your admin to authorize it.
TylerIlunga/procore-mcp-serverOpen-source server for the whole REST API: 7 discovery tools reach every endpoint. MIT, 18 stars, last commit 21 Aug 2026.Runs on your computer with your own OAuth app and client secret in a file.
LiamDGray/procore-mcpServer with a mock mode, SSE and a Helm chart. Source-available BSL 1.1, 0 stars, last commit 4 Nov 2026.For teams that host it themselves.
CarlyA Claude connector plus triggers on Procore events, with emails and texts to people outside Procore.Your admin authorizes the app first; AI agents from $35 a month.

If you already have a developer and need Procore events pushed into your own system, the REST API and its webhooks are the direct route. Cotlet is for the project engineer or superintendent who wants an agent in Claude or ChatGPT working in their own projects, with no app to register.

EU company, since 2019

Who runs Cotlet A company you can look up.

Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Write to contact@cotlet.dev with questions about the Procore tools.

Procore MCP server: questions

How do I connect Procore to ChatGPT or Claude?

Sign up at cotlet.dev, log in to Procore once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your Procore account through Cotlet, in their phone apps too.

What can ChatGPT do in Procore?

With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in Procore: draft RFIs from site notes; weekly overdue RFI and submittal report; log daily manpower from a crew message. You ask in plain words, and anything that reaches other people waits for your OK first.

How do I get access?

Create a free account at https://cotlet.dev, open Procore under Integrations in the console and sign in to Procore in its Cloud Browser. The trial starts with your first app, no card asked.

Does Procore have an MCP server?

We found none from Procore for your own AI agent (checked 6 Nov 2026). Procore's AI works inside Procore, and its Developer Portal lets Marketplace apps declare MCP servers. Cotlet gives Claude, ChatGPT and scripts the Procore tools above, hosted.

Which Procore permissions does my agent need to create an RFI?

It uses your own role. Draft or open RFIs need Admin on the project's RFIs tool, or Standard with the Act as RFI Manager permission. With Standard only, an RFI can be saved as a draft and sent to the RFI Manager for review (Procore Support, Create an RFI).

Does Procore notify people when my agent creates a punch list item or an observation?

Not on save. Punch list items are emailed after Send All Items, and observation emails are not sent automatically. Your agent sends punch list items with send_punch_list_items, and by default you confirm that call first.

Do I need a developer app or an admin to connect?

Cotlet registers no Procore app for you. You sign in with your own login, and your role on each project sets what the agent can do. If your company asks for single sign-on, you sign in through it.

Does Procore send events to my agent?

Not through Cotlet. Procore webhooks and the Zapier triggers push events; Cotlet reads and writes when your agent asks. For a morning check of overdue RFIs, run your agent on a schedule.

Which Procore tools do I need to buy?

The tools follow what your company has on the project: RFIs, Submittals, Punch List, Observations and Daily Log. A call to a tool your project does not have fails and costs nothing.

Is the MCP server different from the REST API?

Only the door is different. Both expose the same 13 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and cron jobs use REST.

Is Cotlet affiliated with Procore?

No. Cotlet is independent and not affiliated with Procore Technologies, Inc.

Give your agent access to Procore.

Free 7-day trial with 2,000 credits, no card needed.