Procore MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PROCORE_CLIENT_ID | Yes | Your Procore OAuth client ID from the Procore Developer Portal | |
| PROCORE_COMPANY_ID | Yes | Your Procore company ID | |
| PROCORE_CLIENT_SECRET | Yes | Your Procore OAuth client secret from the Procore Developer Portal |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| procore_discover_categoriesA | Lists Procore's API surface as a Category > Module tree with an endpoint count for each. Start here when you do not yet know which part of Procore holds the data you need; if you already know the resource by name ('RFI', 'budget'), procore_search_endpoints gets you there in one step instead of three. The category and module names returned are the exact values procore_discover_endpoints expects. Takes no arguments and returns a JSON object. Reads the catalog bundled with this server, so it makes no Procore request and needs no authentication — it cannot fail with 401/403 and costs no rate limit. Step 1 of the discover -> detail -> call workflow. |
| procore_discover_endpointsA | Lists the Procore endpoints inside one category or module, optionally narrowed by a summary substring or HTTP method. Use it after procore_discover_categories to enumerate a focused area; prefer procore_search_endpoints when you have a keyword but no category. Every argument is optional, but omitting all of them returns the entire ~3,100-endpoint catalog, so pass at least a category or a search term. Returns a JSON array of {operationId, summary, method, path}; feed an operationId to procore_get_endpoint_details. Filters that match nothing return an empty array, not an error. Reads the bundled catalog: no Procore request, no authentication, no rate-limit cost. Step 2 of the workflow. |
| procore_get_endpoint_detailsA | Returns the complete parameter schema for one Procore endpoint: every path, query, and body field with its type and required flag, plus the response shape. Call this after discovery and before procore_api_call — api_call needs exact parameter names, and guessing them is the most common cause of a rejected request. Takes the operationId string that procore_discover_endpoints and procore_search_endpoints return; an unrecognized operation_id comes back as a not-found message rather than an error. Reads the bundled catalog: no Procore request, no authentication, no rate-limit cost. Step 3 of the workflow. |
| procore_api_callA | Executes any Procore REST API call. This is the only tool here that reaches Procore and the only one that can change data — resolve the exact method, path, and parameters with procore_get_endpoint_details first. WRITES ARE REAL: DELETE permanently removes the record, POST creates one, and PATCH/PUT overwrite fields, so confirm the target id before calling and prefer a GET to verify it exists. Handles OAuth from the saved tokens, substitutes {placeholders} from path_params, and rewrites double underscores in query keys into brackets (filters__status becomes filters[status]). company_id and project_id fall back to whatever procore_set_config holds when the path needs them and you omit them. Returns the parsed JSON response together with pagination and rate-limit metadata. Failures come back as an error payload carrying the HTTP status — commonly 401 when the token has expired, 403 without tool permission, 404 when an id does not resolve, 422 when the body fails validation, and 429 when the rate limit is exhausted. Step 4 of the workflow; this reaches every Procore endpoint, including any not exposed as a dedicated tool. |
| procore_search_endpointsA | Searches every Procore endpoint's summary, tag, and path for a term and returns the matches ranked by relevance. This is the fastest way in when you already know roughly what you want ('punch list', 'submittal', 'budget line item'); reach for procore_discover_categories instead when you want to browse the API surface rather than search it. Returns a JSON array of {operationId, summary, method, path}; feed an operationId to procore_get_endpoint_details to get its parameters. A term with no matches returns an empty array, so retry with a broader or singular form before concluding the endpoint does not exist. Reads the bundled catalog: no Procore request, no authentication, no rate-limit cost. |
| procore_get_configA | Reports this server's current state: whether Procore OAuth tokens are present and still valid, the default company_id, and the active project_id that procore_api_call substitutes when you omit those parameters. Check this first when a call fails with 401 or 403, or to confirm which project subsequent calls will target before running a write. Never returns token values or the client secret — only whether credentials are present. Takes no arguments and returns a JSON object. Reads local process state, so it makes no Procore request. Pair with procore_set_config to change any of it. |
| procore_set_configA | Sets the default company_id or project_id that later procore_api_call requests use when the path needs one and you omit it. Use it to switch project context mid-session instead of restarting the server, then call procore_get_config to confirm what took effect. Only 'company_id' and 'project_id' are accepted; both are coerced to integers, and a non-numeric value is reported back as a message rather than stored. The change lives in memory for this server process only — it is never written to disk and is lost on restart. Setting the same value twice is a no-op, and nothing in Procore is modified: this only changes which ids this server fills in for you. Returns a confirmation plus the full updated configuration. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/TylerIlunga/procore-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server