Local services & SaaS
Faire
Orders, inventory, reorders and messages for wholesale brands.
12 endpoints
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.
13 tools Read and write
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.
| What you need | API + Zapier | GitHub server | Cotlet |
|---|---|---|---|
| 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
Once, in a browser we run for you.
Paste one address.
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
Three steps, then one code block for your client.
Enable Procore for agents. Sign up, sign in to Procore in its Cloud Browser with your own login, then press Enable for agents.
Add the Cotlet address. Enter https://cotlet.dev/mcp/v1 as a custom MCP server or connector in your agent.
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.
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" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-procore": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-procore]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: procore_read 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 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.
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
| Name | Type | Description |
|---|---|---|
| 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. |
{
"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
} 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
| Name | Type | Description |
|---|---|---|
| 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. |
{
"project_id": "project_8c41d2"
} {
"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
} 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}
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. |
| rfi_id string required | string | RFI ID from list_rfis. |
{
"project_id": "project_8c41d2",
"rfi_id": "rfi_8c41d2"
} {
"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"
]
} 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
| Name | Type | Description |
|---|---|---|
| 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. |
{
"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"
} {
"rfi_id": "90431",
"number": 32,
"subject": "Roof drain location at gridline D",
"status": "draft",
"rfi_manager": "Dana Whitfield",
"ball_in_court": "Dana Whitfield"
} Read only. The status filter takes a name exactly as your project's Submittals log shows it.
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
| Name | Type | Description |
|---|---|---|
| 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. |
{
"project_id": "project_8c41d2"
} {
"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
} A new item reaches nobody until send_punch_list_items goes out, the same as Send All Items in Procore.
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
| Name | Type | Description |
|---|---|---|
| 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. |
{
"project_id": "project_8c41d2"
} {
"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
} 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
| Name | Type | Description |
|---|---|---|
| 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. |
{
"project_id": "project_8c41d2",
"title": "title"
} {
"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
} 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
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. |
{
"project_id": "project_8c41d2"
} {
"project_id": "5518204",
"items_sent": 3,
"notified": [
"Priya Nair",
"Marcus Hale"
]
} The status move follows Procore's own steps: the assignee sets Ready for Review, the creator closes.
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
| Name | Type | Description |
|---|---|---|
| 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. |
{
"project_id": "project_8c41d2"
} {
"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
} 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
| Name | Type | Description |
|---|---|---|
| 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. |
{
"project_id": "project_8c41d2",
"title": "title"
} {
"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"
} 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
| Name | Type | Description |
|---|---|---|
| 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. |
{
"project_id": "project_8c41d2",
"observation_id": "observation_8c41d2",
"status": "ready_for_review"
} {
"observation_id": "41250",
"number": 8,
"status": "closed"
} Different hours per worker need a separate manpower entry.
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
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. |
| date date | date | The log day. Default: today. |
{
"project_id": "project_8c41d2"
} {
"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
}
]
} 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
| Name | Type | Description |
|---|---|---|
| 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. |
{
"project_id": "project_8c41d2",
"company": "company",
"workers": 1,
"hours": 1
} {
"entry_id": "66120",
"date": "2026-11-04",
"company": "Summit Concrete",
"workers": 4,
"hours": 8,
"total_hours": 32,
"location": "Level 2"
} Your signed-in Procore browser profile, encrypted with AES-256-GCM, in Finland. Not the password.
The 13 Procore tools. Never the cookie or the login.
The projects your Procore user can open: RFIs, submittals, punch items, observations, daily logs.
Budgets, commitments, payments, drawings, users and company settings.
You sign in through it yourself, and a 2-step code goes to you. We never type it.
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.
| Tool | What Procore asks for |
|---|---|
| create_rfi | Admin on the RFIs tool, or Standard with Act as RFI Manager. With Standard only, the RFI is saved as a draft for review. |
| get_rfi | A Standard or Read-Only user sees every response only if the project does not limit them to official responses. |
| create_punch_list_item | Standard users can assign only a Punch Item Manager. Read Only users cannot be assigned. |
| create_observation | The assignee needs Standard or Admin on the Observations tool. |
| add_manpower_entry | Standard or Admin on the Daily Log tool. |
Draft RFIs are the safe start: nobody is asked until an RFI is opened.
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.
| Action | Undo |
|---|---|
| Create a draft RFI | Edit it in Procore; nobody was asked |
| Open an RFI | The assignees hold the ball; edit or close it in Procore |
| Create a punch item | Edit it in Procore before you send; nobody hears about it |
| Send the punch list | No, the emails are out |
| Create an observation | Edit it in Procore; with no assignee nobody is notified |
| Set an observation status | No tool undoes it; Ready for Review already emailed the creator |
| Add a manpower entry | Edit 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.
{
"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"
}
} 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"}' {
"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.
About $25 a monthfor a contractor with 6 active projects, 4,280 credits. Your Procore contract is billed as before.
| Job | Calls | Credits |
|---|---|---|
| Draft RFIs from site notes, 4 per batch | 6 × 8 | 480 |
| Overdue RFIs and submittals, 6 projects | 12 × 4 | 480 |
| Daily manpower log, busiest project | 5 × 22 | 1,100 |
| Walkthrough punch list, 8 items, then send | 10 × 4 | 400 |
| Close fixed observations | 4 × 8 | 320 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 4,280 |
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.
| 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.
| Option | What it does | Where it stops |
|---|---|---|
| Procore REST API | Official: 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 Procore | The 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 MCP | Hosted 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-server | Open-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-mcp | Server 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. |
| Carly | A 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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
No. Cotlet is independent and not affiliated with Procore Technologies, Inc.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy