pipeyard
Curated MCP connector marketplace for industry verticals — Construction, Finance, Healthcare, and Logistics with full docs, curl examples and sandbox testing.
Procore MCP Server
This project implements a Model Context Protocol (MCP) server that connects Claude (and other MCP‑aware clients) to the Procore API. It exposes tools for working with:
- Projects
- RFIs
- Submittals
- Documents
- Budget & cost
All tools return clean JSON responses, validate inputs with zod, and include robust error handling for 401, 403, 404, and 429 (rate limit) responses from Procore.
Prerequisites
- Node.js: v18+ (recommended)
- npm: v9+ (comes with recent Node.js)
- Procore Developer account with:
- A registered OAuth2 client using Client Credentials flow
- API access to the relevant projects/modules (RFIs, Submittals, Documents, Budget, etc.)
Installation
cd C:\Procore
npm install
If you created the folder elsewhere, adjust the cd path accordingly.
Getting Procore API credentials
- Go to the Procore Developer Portal.
- Create an OAuth Client using the Client Credentials grant type.
- Note the following values:
- Client ID
- Client Secret
- Ensure the client has access scopes appropriate for:
- Projects
- RFIs
- Submittals
- Documents
- Budget & cost management
You will use these values in your .env file.
Environment variable setup
Create a .env file in the project root (next to package.json) based on .env.example:
cp .env.example .env
Then edit .env:
PROCORE_CLIENT_ID=your_real_client_id
PROCORE_CLIENT_SECRET=your_real_client_secret
PROCORE_BASE_URL=https://api.procore.com
- PROCORE_CLIENT_ID: From the Procore developer portal.
- PROCORE_CLIENT_SECRET: From the Procore developer portal.
- PROCORE_BASE_URL: Typically
https://api.procore.com(you can override for sandbox/test environments).
Build and run locally
Install dependencies:
npm install
Run in development mode (TypeScript via tsx):
npm run dev
Build TypeScript to dist/:
npm run build
Run the compiled server:
npm start
The MCP server uses stdio (standard input/output), so it is normally launched and managed by an MCP client such as Claude Desktop. You generally do not call it directly in a terminal except for debugging.
Available tools
All tools return JSON. Arguments shown below are the tool arguments, not raw HTTP calls.
-
Projects
list_projects- Description: List Procore projects for the authenticated client, optionally filtered by
company_id. - Inputs:
company_id(optional, integer): Filter projects by company.
- Description: List Procore projects for the authenticated client, optionally filtered by
get_project- Description: Get details of a single project by ID.
- Inputs:
id(required, integer): Project ID.
-
RFIs
list_rfis- Description: List RFIs for a project.
- Inputs:
project_id(required, integer): Project ID.
get_rfi- Description: Get a single RFI by ID for a project.
- Inputs:
project_id(required, integer): Project ID.id(required, integer): RFI ID.
create_rfi- Description: Create a new RFI in a project.
- Inputs:
project_id(required, integer): Project ID.payload(required, object): Raw JSON payload matching Procore’s create RFI API body.
-
Submittals
list_submittals- Description: List submittals for a project.
- Inputs:
project_id(required, integer): Project ID.
get_submittal- Description: Get a single submittal by ID for a project.
- Inputs:
project_id(required, integer): Project ID.id(required, integer): Submittal ID.
create_submittal- Description: Create a new submittal in a project.
- Inputs:
project_id(required, integer): Project ID.payload(required, object): Raw JSON payload matching Procore’s create Submittal API body.
-
Documents
list_folders- Description: List document folders for a project.
- Inputs:
project_id(required, integer): Project ID.
list_files- Description: List document files for a project.
- Inputs:
project_id(required, integer): Project ID.
-
Budget
list_budget_line_items- Description: List budget line items for a project.
- Inputs:
project_id(required, integer): Project ID.
get_budget_summary- Description: Get overall budget summary for a project.
- Inputs:
project_id(required, integer): Project ID.
Example curl-style tool calls (via MCP JSON-RPC)
MCP servers speak JSON-RPC over stdio; you normally don’t call them directly with curl. These examples illustrate the payload structure a client like Claude Desktop would send.
Replace 123 / 456 etc. with your real IDs.
- List projects
echo '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_projects",
"arguments": {
"company_id": 123
}
}
}' | node dist/index.js
- Get a project
echo '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_project",
"arguments": {
"id": 123
}
}
}' | node dist/index.js
- List RFIs
echo '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "list_rfis",
"arguments": {
"project_id": 123
}
}
}' | node dist/index.js
- Create RFI
echo '{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "create_rfi",
"arguments": {
"project_id": 123,
"payload": {
"subject": "RFI subject here",
"question": "Describe the question...",
"responsible_contractor_id": 456
}
}
}
}' | node dist/index.js
- List submittals
echo '{
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "list_submittals",
"arguments": {
"project_id": 123
}
}
}' | node dist/index.js
- Create submittal
echo '{
"jsonrpc": "2.0",
"id": 6,
"method": "tools/call",
"params": {
"name": "create_submittal",
"arguments": {
"project_id": 123,
"payload": {
"subject": "Submittal subject",
"spec_section": "01 30 00",
"responsible_contractor_id": 456
}
}
}
}' | node dist/index.js
- List folders
echo '{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "list_folders",
"arguments": {
"project_id": 123
}
}
}' | node dist/index.js
- List files
echo '{
"jsonrpc": "2.0",
"id": 8,
"method": "tools/call",
"params": {
"name": "list_files",
"arguments": {
"project_id": 123
}
}
}' | node dist/index.js
- List budget line items
echo '{
"jsonrpc": "2.0",
"id": 9,
"method": "tools/call",
"params": {
"name": "list_budget_line_items",
"arguments": {
"project_id": 123
}
}
}' | node dist/index.js
- Get budget summary
echo '{
"jsonrpc": "2.0",
"id": 10,
"method": "tools/call",
"params": {
"name": "get_budget_summary",
"arguments": {
"project_id": 123
}
}
}' | node dist/index.js
Error handling behavior
All tools include consistent JSON error responses. Typical shape:
{
"error": "unauthorized",
"message": "Procore API returned 401 Unauthorized.",
"status": 401,
"statusText": "Unauthorized",
"url": "/rest/v1.0/projects",
"method": "get",
"data": { /* raw Procore response body, if any */ }
}
Handled HTTP statuses:
- 401:
unauthorized - 403:
forbidden - 404:
not_found - 429:
rate_limited - Other 4xx/5xx:
procore_api_error - Validation / other errors:
tool_error
How to connect to Claude Desktop (MCP config)
In Claude Desktop, add a new MCP server configuration in your claude_desktop_config.json (path may vary by OS).
Example entry:
{
"mcp_servers": {
"procore": {
"command": "node",
"args": [
"C:/Procore/procore-mcp-server/dist/index.js"
],
"env": {
"PROCORE_CLIENT_ID": "your_real_client_id",
"PROCORE_CLIENT_SECRET": "your_real_client_secret",
"PROCORE_BASE_URL": "https://api.procore.com"
}
}
}
}
- command:
node(or an explicit path to your Node binary). - args: Path to the compiled
index.jsindist/. - env: You can either:
- Inline your secrets here (be cautious), or
- Omit
envso that Claude Desktop inherits your system environment variables.
After saving the config, restart Claude Desktop. The procore MCP server should appear as an available toolset, and the tools listed above (list_projects, get_project, list_rfis, etc.) will be callable directly from within Claude.
Related Servers
Alpha Vantage MCP Server
sponsorAccess financial market data: realtime & historical stock, ETF, options, forex, crypto, commodities, fundamentals, technical indicators, & more
portkey-admin-mcp
Full MCP server for the https://portkey.ai AI Gateway Admin API with 151 tools across 18 domains.
Image MCP Server
An MCP server for AI image generation using OpenAI and Replicate APIs.
iOS MCP Server
An iOS mobile automation server using Appium and WebDriverAgent, built with clean architecture and SOLID principles.
JVM MCP Server
A server for monitoring and analyzing Java Virtual Machine (JVM) processes using Arthas, with a Python interface.
MCP ZAP Server
Exposes OWASP ZAP as an MCP server, enabling AI agents to orchestrate security scans, import OpenAPI specs, and generate reports.
MCP Code Sandbox Server
Execute code securely in isolated sandbox environments using the E2B API.
BlenderMCP
Connects Blender to Claude AI via the Model Context Protocol (MCP), enabling direct interaction and control for prompt-assisted 3D modeling, scene creation, and manipulation.
PI API MCP Server
An MCP server for interacting with the PI Dashboard API.
MCP-Inscription Server
Interact with Ordinals Inscriptions and display content from transactions.
Bedrock Server Manager
Manage your Bedrock server with natural language commands using the Bedrock Server Manager API.