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.
Похожие серверы
Scout Monitoring MCP
спонсорPut performance and error data directly in the hands of your AI assistant.
Alpha Vantage MCP Server
спонсорAccess financial market data: realtime & historical stock, ETF, options, forex, crypto, commodities, fundamentals, technical indicators, & more
TLS MCP Server
Analyze TLS certificates using OpenSSL and zlint.
Context Portal MCP (ConPort)
A server for managing structured project context using SQLite, with support for vector embeddings for semantic search and Retrieval Augmented Generation (RAG).
Ollama
Integrates with Ollama to run local large language models. Requires a running Ollama instance.
ServeMyAPI
A personal server for securely storing and accessing API keys using the macOS Keychain.
x402engine
50+ pay-per-call APIs for AI agents via HTTP 402 crypto micropayments. $0.001–$0.12 per call with USDC and USDm.
weibaohui/kom
Provides multi-cluster Kubernetes management and operations using MCP, It can be integrated as an SDK into your own project and includes nearly 50 built-in tools covering common DevOps and development scenarios. Supports both standard and CRD resources.
MCP SSH Server
Securely execute remote commands and perform file operations over SSH, with support for both password and key-based authentication.
Authless Remote MCP Server
An authentication-free, remote MCP server designed for deployment on Cloudflare Workers.
MCP Server Starter
A starter project for building MCP servers with TypeScript and Bun.
Togello MCP Server
An MCP server for managing application context using the Togello API.