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.
Verwandte Server
Scout Monitoring MCP
SponsorPut performance and error data directly in the hands of your AI assistant.
Alpha Vantage MCP Server
SponsorAccess financial market data: realtime & historical stock, ETF, options, forex, crypto, commodities, fundamentals, technical indicators, & more
Remote MCP Server on Cloudflare
A template for deploying a remote MCP server on Cloudflare Workers, customizable by defining tools in the source code.
CIE - Code Intelligence Engine
Local code analysis MCP server with 25+ tools: semantic search, call graph tracing, dependency analysis, and symbol navigation. Built with Tree-sitter and CozoDB. Supports Go, Python, JS, TS.
MCP Reticle
Reticle intercepts, visualizes, and profiles JSON-RPC traffic between your LLM and MCP servers in real-time, with zero latency overhead. Stop debugging blind. Start seeing everything.
AST2LLM for Go
A local AST-powered context enhancement tool for LLMs that analyzes Go project structure for faster context resolution.
mcp-nodejs
A Node.js MCP server example for the OpenWeather API, requiring an API key.
Svelte Documentation
Remote server (SSE/Streamable) for the latest Svelte and SvelteKit documentation
Kai
Kai provides a bridge between large language models (LLMs) and your Kubernetes clusters, enabling natural language interaction with Kubernetes resources. The server exposes a comprehensive set of tools for managing clusters, namespaces, pods, deployments, services, and other Kubernetes resources
Fused MCP
A Python-based MCP server for data scientists to run Python code with a Claude client.
TCC
Automatically generates MCP servers from OpenAPI specifications, enabling conversational AI agents to interact with existing web systems.
Frappe MCP Server
An MCP server for the Frappe Framework, enabling AI assistants to interact with Frappe's REST API for document management and schema operations.