← Back to all MCPs

Procore MCP

A Procore MCP connector in development for projects, RFIs, submittals and commercial records. Explore planned coverage and join the waitlist.

Construction

What is Procore MCP?

MCP XYZ is building an independent Procore MCP connector for teams that want an AI assistant to work with authorised construction project records through the Model Context Protocol. Planned coverage includes projects, RFIs, submittals, daily logs and commercial records. Access is waitlist-based while provider approval and live acceptance are pending.

Use the catalogue to check the operations and fields your work needs. If an existing connector is missing a useful action, tell us about it when joining the waitlist. Your software’s permissions and API limits still apply.

Procore workflows to explore

Find project and directory records

Planned access to projects, company information, people and project directories, within the connected account’s authorised permissions.

Inspect documented operations

Explore RFIs, submittals and daily logs

Inspect documented requests for information, submittals, drawing records and daily logs before choosing a project workflow.

Inspect documented operations

Review change events and commitments

Explore documented commercial records, including change events, commitments and prime contracts. Live acceptance is still pending.

Inspect documented operations
Example request to try after setup and validation

“Find the open RFIs for this project.”

Getting access to Procore MCP

New access starts with the Procore waitlist. Tell us which assistant you use and the work you want to do. We’ll contact you about relevant access updates; joining does not create an account or guarantee an invitation date.

Procore is in development. Live use requires an authorised developer app, installation in the relevant company, applicable provider approval and live acceptance.

The implemented connection paths support a developer-managed service account or user OAuth. Acceptance must confirm the account, region, permissions and intended agent use. The detailed catalogue tracks documented coverage; these workflows have not passed live business testing.

Production use needs the applicable Procore app and use-case approval. Procore’s Agentic APIs programme is a separate approved pilot. Ordinary REST credentials do not establish access to that pilot or approval for every agent or bulk-data use.

External presigned transfers, large uploads, some environments and provider-side token revocation have outstanding limits. A documented file operation does not mean a complete file workflow has been verified.

Procore API usage guidelines
Procore Agentic APIs guidance

Register Procore interest

Procore MCP questions

What is the Procore MCP from MCP XYZ?
It is an independent Procore connector in development by Jiffi. It is intended to make documented Procore API operations available to authorised AI assistants through the Model Context Protocol. Planned coverage includes projects, RFIs, submittals, daily logs and commercial records.
Is this an official Procore MCP server?
No. MCP XYZ is an independent product by Jiffi. This listing does not imply Procore endorsement or approval. Production use requires the applicable Procore app and use-case approval; Procore’s Agentic APIs programme is a separate approved pilot.
Can I connect Procore to Claude or ChatGPT?
MCP XYZ authentication and catalogue discovery have been checked with Claude. Procore business requests have not passed live acceptance, and ChatGPT acceptance has not been verified. Join the waitlist with your preferred assistant and workflow so we can assess the requirements.
Does the Procore MCP support RFIs, submittals and change events?
Those resources are included in the documented operation catalogue below, alongside projects, directories, commitments and other records. Catalogue coverage describes retained API contracts, not verified live workflows. Provider permissions, account region and applicable approval still determine what can be used.
What happens when I join the Procore waitlist?
We save your contact details and Procore interest, and notify the MCP XYZ team. We will contact you about relevant access updates. Joining does not create an account, grant Procore access or promise a release date. Existing invited users can still log in.

Read the AI client guide How access and permissions work

Documented coverage

Operations and fields

3,294 documented business operations across retained API versions. Open a contract to inspect its parameters, fields, sources and unresolved behaviour. No provider request is made here.

3,294 operations match. Showing 2961–2980.

Documented contract, live behaviour unverified

Create image

procore_post_images_v1_0

POST/rest/v1.0/images

Read the provider documentation

Provider notes and connector behaviour

  • Upload and add a new Image to a Project's Photo Album (Image Category).

Unresolved behaviour

  • No authorised Procore provider request has verified this operation.

Query parameters and filters

ParameterRequiredProvider description
project_idYesUnique identifier for the project.
Inspect the complete operation contract

The exact retained JSON includes schemas, nested fields, notes, source evidence and unresolved questions. It is a documented contract, not a live response.

{
  "id": "post_images_v1_0",
  "name": "procore_post_images_v1_0",
  "resourceId": "images",
  "description": "Create image",
  "method": "POST",
  "path": "/rest/v1.0/images",
  "version": "1.0",
  "documentationUrl": "https://developers.procore.com/reference/rest/images?version=1.0",
  "readOnly": false,
  "destructive": true,
  "idempotent": false,
  "deprecated": false,
  "beta": false,
  "canonical": true,
  "pathParameters": [],
  "queryParameters": [
    {
      "name": "project_id",
      "in": "query",
      "required": true,
      "description": "Unique identifier for the project.",
      "schema": {
        "anyOf": [
          {
            "type": "integer",
            "maximum": 9007199254740991
          },
          {
            "type": "string",
            "pattern": "^[0-9]+$"
          }
        ],
        "x-mcp-original-type": "integer"
      }
    }
  ],
  "requestBodySchema": {
    "anyOf": [
      {
        "title": "Body",
        "type": "object",
        "required": [
          "image"
        ],
        "properties": {
          "upload_uuid": {
            "type": "string",
            "description": "UUID referencing a previously completed Upload. This is the recommended approach for image uploads. See Company Uploads or Project Uploads for instructions on how use uploads. You should not use both data and uuid fields in the same request. Mutually exclusive with source_image_id."
          },
          "source_image_id": {
            "anyOf": [
              {
                "type": "integer",
                "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
                "maximum": 9007199254740991
              },
              {
                "type": "string",
                "pattern": "^[0-9]+$"
              }
            ],
            "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
            "x-mcp-original-type": "integer"
          },
          "image_name": {
            "type": "string",
            "description": "The name of the image file to be uploaded. Required when using an upload_uuid to upload the image. Not required when using source_image_id."
          },
          "image": {
            "title": "Image",
            "type": "object",
            "description": "At least one attribute is required even when an 'upload_uuid' or 'source_image_id' key is provided. If neither is provided, then the 'data' key must be provided",
            "properties": {
              "private": {
                "type": "boolean",
                "description": "The Private status of the Image. Defaults to a project configuration."
              },
              "provider_type": {
                "type": "string",
                "description": "Provider type. Currently supports only `MarkupLayer`, and should only be used when adding an Image to markup."
              },
              "provider_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  }
                ],
                "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                "x-mcp-original-type": "integer"
              },
              "starred": {
                "type": "boolean",
                "description": "The Starred status of the Image."
              },
              "source": {
                "type": "string",
                "description": "Image source"
              },
              "description": {
                "type": "string",
                "description": "Image description"
              },
              "image_category_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "description": "Image Category ID",
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  }
                ],
                "description": "Image Category ID",
                "x-mcp-original-type": "integer"
              },
              "location_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  }
                ],
                "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                "x-mcp-original-type": "integer"
              },
              "daily_log_segment_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "description": "Daily Log Segment ID",
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Daily Log Segment ID",
                "x-mcp-original-type": "integer"
              },
              "mt_location": {
                "type": "array",
                "description": "Use this for creating a new multi-tier or single-tier Location. This will be ignored if `location_id` is provided.",
                "items": {
                  "type": "string"
                }
              },
              "trade_ids": {
                "type": "array",
                "description": "An array of IDs of the Trades of the Image",
                "items": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    }
                  ],
                  "x-mcp-original-type": "integer"
                }
              },
              "log_date": {
                "type": "string"
              }
            }
          }
        }
      },
      {
        "title": "Body",
        "type": "object",
        "required": [
          "image"
        ],
        "properties": {
          "upload_uuid": {
            "type": "string",
            "description": "UUID referencing a previously completed Upload. This is the recommended approach for image uploads. See Company Uploads or Project Uploads for instructions on how use uploads. You should not use both data and uuid fields in the same request. Mutually exclusive with source_image_id."
          },
          "source_image_id": {
            "anyOf": [
              {
                "type": "integer",
                "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
                "maximum": 9007199254740991
              },
              {
                "type": "string",
                "pattern": "^[0-9]+$"
              }
            ],
            "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
            "x-mcp-original-type": "integer"
          },
          "image_name": {
            "type": "string",
            "description": "The name of the image file to be uploaded. Required when using an upload_uuid to upload the image. Not required when using source_image_id."
          },
          "image": {
            "title": "Image",
            "type": "object",
            "description": "At least one attribute is required even when an 'upload_uuid' or 'source_image_id' key is provided. If neither is provided, then the 'data' key must be provided",
            "properties": {
              "private": {
                "type": "boolean",
                "description": "The Private status of the Image. Defaults to a project configuration."
              },
              "provider_type": {
                "type": "string",
                "description": "Provider type. Currently supports only `MarkupLayer`, and should only be used when adding an Image to markup."
              },
              "provider_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  }
                ],
                "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                "x-mcp-original-type": "integer"
              },
              "starred": {
                "type": "boolean",
                "description": "The Starred status of the Image."
              },
              "data": {
                "type": "object",
                "required": [
                  "filename",
                  "dataBase64"
                ],
                "additionalProperties": false,
                "properties": {
                  "filename": {
                    "type": "string",
                    "minLength": 1
                  },
                  "contentType": {
                    "type": "string"
                  },
                  "dataBase64": {
                    "type": "string",
                    "description": "Base64-encoded file bytes. The platform input-size limit applies."
                  }
                },
                "description": "[DEPRECATED] File to use as image data. Please use upload_uuid instead. Note that it's only possible to post a\nfile using a multipart/form-data body (see RFC 2388). Most HTTP\nlibraries will do the right thing when you pass in an open file or\nIO stream. Alternatively you can use an upload_uuid (see Company\nUploads or Project Uploads). You should not use both file and\nupload_uuid fields in the same request."
              },
              "source": {
                "type": "string",
                "description": "Image source"
              },
              "description": {
                "type": "string",
                "description": "Image description"
              },
              "image_category_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "description": "Image Category ID",
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  }
                ],
                "description": "Image Category ID",
                "x-mcp-original-type": "integer"
              },
              "location_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  }
                ],
                "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                "x-mcp-original-type": "integer"
              },
              "daily_log_segment_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "description": "Daily Log Segment ID",
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Daily Log Segment ID",
                "x-mcp-original-type": "integer"
              },
              "mt_location": {
                "type": "array",
                "description": "Use this for creating a new multi-tier or single-tier Location. This will be ignored if `location_id` is provided.",
                "items": {
                  "type": "string"
                }
              },
              "trade_ids": {
                "type": "array",
                "description": "An array of IDs of the Trades of the Image",
                "items": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    }
                  ],
                  "x-mcp-original-type": "integer"
                }
              },
              "log_date": {
                "type": "string"
              }
            }
          }
        }
      }
    ]
  },
  "requestBodyRequired": true,
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": {
        "type": "object",
        "properties": {
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 9007199254740991
              },
              {
                "type": "string",
                "pattern": "^[0-9]+$"
              }
            ],
            "description": "Unique identifier for the project.",
            "x-mcp-original-type": "integer"
          }
        },
        "additionalProperties": {
          "type": [
            "string",
            "number",
            "boolean",
            "null"
          ]
        },
        "required": [
          "project_id"
        ]
      },
      "contentType": {
        "type": "string",
        "enum": [
          "application/json",
          "multipart/form-data"
        ],
        "default": "application/json",
        "description": "Request media type. Defaults to the documented JSON type when available."
      },
      "body": {
        "anyOf": [
          {
            "title": "Body",
            "type": "object",
            "required": [
              "image"
            ],
            "properties": {
              "upload_uuid": {
                "type": "string",
                "description": "UUID referencing a previously completed Upload. This is the recommended approach for image uploads. See Company Uploads or Project Uploads for instructions on how use uploads. You should not use both data and uuid fields in the same request. Mutually exclusive with source_image_id."
              },
              "source_image_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  }
                ],
                "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
                "x-mcp-original-type": "integer"
              },
              "image_name": {
                "type": "string",
                "description": "The name of the image file to be uploaded. Required when using an upload_uuid to upload the image. Not required when using source_image_id."
              },
              "image": {
                "title": "Image",
                "type": "object",
                "description": "At least one attribute is required even when an 'upload_uuid' or 'source_image_id' key is provided. If neither is provided, then the 'data' key must be provided",
                "properties": {
                  "private": {
                    "type": "boolean",
                    "description": "The Private status of the Image. Defaults to a project configuration."
                  },
                  "provider_type": {
                    "type": "string",
                    "description": "Provider type. Currently supports only `MarkupLayer`, and should only be used when adding an Image to markup."
                  },
                  "provider_id": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[0-9]+$"
                      }
                    ],
                    "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                    "x-mcp-original-type": "integer"
                  },
                  "starred": {
                    "type": "boolean",
                    "description": "The Starred status of the Image."
                  },
                  "source": {
                    "type": "string",
                    "description": "Image source"
                  },
                  "description": {
                    "type": "string",
                    "description": "Image description"
                  },
                  "image_category_id": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "description": "Image Category ID",
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[0-9]+$"
                      }
                    ],
                    "description": "Image Category ID",
                    "x-mcp-original-type": "integer"
                  },
                  "location_id": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[0-9]+$"
                      }
                    ],
                    "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                    "x-mcp-original-type": "integer"
                  },
                  "daily_log_segment_id": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "description": "Daily Log Segment ID",
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[0-9]+$"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Daily Log Segment ID",
                    "x-mcp-original-type": "integer"
                  },
                  "mt_location": {
                    "type": "array",
                    "description": "Use this for creating a new multi-tier or single-tier Location. This will be ignored if `location_id` is provided.",
                    "items": {
                      "type": "string"
                    }
                  },
                  "trade_ids": {
                    "type": "array",
                    "description": "An array of IDs of the Trades of the Image",
                    "items": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "string",
                          "pattern": "^[0-9]+$"
                        }
                      ],
                      "x-mcp-original-type": "integer"
                    }
                  },
                  "log_date": {
                    "type": "string"
                  }
                }
              }
            }
          },
          {
            "title": "Body",
            "type": "object",
            "required": [
              "image"
            ],
            "properties": {
              "upload_uuid": {
                "type": "string",
                "description": "UUID referencing a previously completed Upload. This is the recommended approach for image uploads. See Company Uploads or Project Uploads for instructions on how use uploads. You should not use both data and uuid fields in the same request. Mutually exclusive with source_image_id."
              },
              "source_image_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  }
                ],
                "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
                "x-mcp-original-type": "integer"
              },
              "image_name": {
                "type": "string",
                "description": "The name of the image file to be uploaded. Required when using an upload_uuid to upload the image. Not required when using source_image_id."
              },
              "image": {
                "title": "Image",
                "type": "object",
                "description": "At least one attribute is required even when an 'upload_uuid' or 'source_image_id' key is provided. If neither is provided, then the 'data' key must be provided",
                "properties": {
                  "private": {
                    "type": "boolean",
                    "description": "The Private status of the Image. Defaults to a project configuration."
                  },
                  "provider_type": {
                    "type": "string",
                    "description": "Provider type. Currently supports only `MarkupLayer`, and should only be used when adding an Image to markup."
                  },
                  "provider_id": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[0-9]+$"
                      }
                    ],
                    "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                    "x-mcp-original-type": "integer"
                  },
                  "starred": {
                    "type": "boolean",
                    "description": "The Starred status of the Image."
                  },
                  "data": {
                    "type": "object",
                    "required": [
                      "filename",
                      "dataBase64"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "filename": {
                        "type": "string",
                        "minLength": 1
                      },
                      "contentType": {
                        "type": "string"
                      },
                      "dataBase64": {
                        "type": "string",
                        "description": "Base64-encoded file bytes. The platform input-size limit applies."
                      }
                    },
                    "description": "[DEPRECATED] File to use as image data. Please use upload_uuid instead. Note that it's only possible to post a\nfile using a multipart/form-data body (see RFC 2388). Most HTTP\nlibraries will do the right thing when you pass in an open file or\nIO stream. Alternatively you can use an upload_uuid (see Company\nUploads or Project Uploads). You should not use both file and\nupload_uuid fields in the same request."
                  },
                  "source": {
                    "type": "string",
                    "description": "Image source"
                  },
                  "description": {
                    "type": "string",
                    "description": "Image description"
                  },
                  "image_category_id": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "description": "Image Category ID",
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[0-9]+$"
                      }
                    ],
                    "description": "Image Category ID",
                    "x-mcp-original-type": "integer"
                  },
                  "location_id": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[0-9]+$"
                      }
                    ],
                    "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                    "x-mcp-original-type": "integer"
                  },
                  "daily_log_segment_id": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "description": "Daily Log Segment ID",
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[0-9]+$"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Daily Log Segment ID",
                    "x-mcp-original-type": "integer"
                  },
                  "mt_location": {
                    "type": "array",
                    "description": "Use this for creating a new multi-tier or single-tier Location. This will be ignored if `location_id` is provided.",
                    "items": {
                      "type": "string"
                    }
                  },
                  "trade_ids": {
                    "type": "array",
                    "description": "An array of IDs of the Trades of the Image",
                    "items": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "string",
                          "pattern": "^[0-9]+$"
                        }
                      ],
                      "x-mcp-original-type": "integer"
                    }
                  },
                  "log_date": {
                    "type": "string"
                  }
                }
              }
            }
          }
        ]
      }
    },
    "required": [
      "query",
      "body"
    ],
    "additionalProperties": false
  },
  "pagination": null,
  "notes": [
    "Upload and add a new Image to a Project's Photo Album (Image Category)."
  ],
  "unresolved": [
    "No authorised Procore provider request has verified this operation."
  ],
  "request": {
    "parameters": [
      {
        "name": "Procore-Company-Id",
        "in": "header",
        "description": "Unique company identifier associated with the Procore User Account.",
        "required": true,
        "schema": {
          "type": "integer"
        }
      },
      {
        "name": "project_id",
        "in": "query",
        "required": true,
        "description": "Unique identifier for the project.",
        "schema": {
          "type": "integer"
        }
      }
    ],
    "content": {
      "application/json": {
        "schema": {
          "title": "Body",
          "type": "object",
          "required": [
            "image"
          ],
          "properties": {
            "upload_uuid": {
              "type": "string",
              "description": "UUID referencing a previously completed Upload. This is the recommended approach for image uploads. See Company Uploads or Project Uploads for instructions on how use uploads. You should not use both data and uuid fields in the same request. Mutually exclusive with source_image_id."
            },
            "source_image_id": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
                  "maximum": 9007199254740991
                },
                {
                  "type": "string",
                  "pattern": "^[0-9]+$"
                }
              ],
              "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
              "x-mcp-original-type": "integer"
            },
            "image_name": {
              "type": "string",
              "description": "The name of the image file to be uploaded. Required when using an upload_uuid to upload the image. Not required when using source_image_id."
            },
            "image": {
              "title": "Image",
              "type": "object",
              "description": "At least one attribute is required even when an 'upload_uuid' or 'source_image_id' key is provided. If neither is provided, then the 'data' key must be provided",
              "properties": {
                "private": {
                  "type": "boolean",
                  "description": "The Private status of the Image. Defaults to a project configuration."
                },
                "provider_type": {
                  "type": "string",
                  "description": "Provider type. Currently supports only `MarkupLayer`, and should only be used when adding an Image to markup."
                },
                "provider_id": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    }
                  ],
                  "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                  "x-mcp-original-type": "integer"
                },
                "starred": {
                  "type": "boolean",
                  "description": "The Starred status of the Image."
                },
                "source": {
                  "type": "string",
                  "description": "Image source"
                },
                "description": {
                  "type": "string",
                  "description": "Image description"
                },
                "image_category_id": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "description": "Image Category ID",
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    }
                  ],
                  "description": "Image Category ID",
                  "x-mcp-original-type": "integer"
                },
                "location_id": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    }
                  ],
                  "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                  "x-mcp-original-type": "integer"
                },
                "daily_log_segment_id": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "description": "Daily Log Segment ID",
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Daily Log Segment ID",
                  "x-mcp-original-type": "integer"
                },
                "mt_location": {
                  "type": "array",
                  "description": "Use this for creating a new multi-tier or single-tier Location. This will be ignored if `location_id` is provided.",
                  "items": {
                    "type": "string"
                  }
                },
                "trade_ids": {
                  "type": "array",
                  "description": "An array of IDs of the Trades of the Image",
                  "items": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[0-9]+$"
                      }
                    ],
                    "x-mcp-original-type": "integer"
                  }
                },
                "log_date": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "multipart/form-data": {
        "schema": {
          "title": "Body",
          "type": "object",
          "required": [
            "image"
          ],
          "properties": {
            "upload_uuid": {
              "type": "string",
              "description": "UUID referencing a previously completed Upload. This is the recommended approach for image uploads. See Company Uploads or Project Uploads for instructions on how use uploads. You should not use both data and uuid fields in the same request. Mutually exclusive with source_image_id."
            },
            "source_image_id": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
                  "maximum": 9007199254740991
                },
                {
                  "type": "string",
                  "pattern": "^[0-9]+$"
                }
              ],
              "description": "ID of an existing Image in the same project to copy. Creates a new independent Image with its own file storage. Mutually exclusive with upload_uuid and data. When provided, image_name is not required. Takes precedence over upload_uuid and data if multiple are supplied.",
              "x-mcp-original-type": "integer"
            },
            "image_name": {
              "type": "string",
              "description": "The name of the image file to be uploaded. Required when using an upload_uuid to upload the image. Not required when using source_image_id."
            },
            "image": {
              "title": "Image",
              "type": "object",
              "description": "At least one attribute is required even when an 'upload_uuid' or 'source_image_id' key is provided. If neither is provided, then the 'data' key must be provided",
              "properties": {
                "private": {
                  "type": "boolean",
                  "description": "The Private status of the Image. Defaults to a project configuration."
                },
                "provider_type": {
                  "type": "string",
                  "description": "Provider type. Currently supports only `MarkupLayer`, and should only be used when adding an Image to markup."
                },
                "provider_id": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    }
                  ],
                  "description": "Provider ID. Currently supports only MarkupLayer IDs, and should only be used when adding an Image to markup.",
                  "x-mcp-original-type": "integer"
                },
                "starred": {
                  "type": "boolean",
                  "description": "The Starred status of the Image."
                },
                "data": {
                  "type": "object",
                  "required": [
                    "filename",
                    "dataBase64"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "filename": {
                      "type": "string",
                      "minLength": 1
                    },
                    "contentType": {
                      "type": "string"
                    },
                    "dataBase64": {
                      "type": "string",
                      "description": "Base64-encoded file bytes. The platform input-size limit applies."
                    }
                  },
                  "description": "[DEPRECATED] File to use as image data. Please use upload_uuid instead. Note that it's only possible to post a\nfile using a multipart/form-data body (see RFC 2388). Most HTTP\nlibraries will do the right thing when you pass in an open file or\nIO stream. Alternatively you can use an upload_uuid (see Company\nUploads or Project Uploads). You should not use both file and\nupload_uuid fields in the same request."
                },
                "source": {
                  "type": "string",
                  "description": "Image source"
                },
                "description": {
                  "type": "string",
                  "description": "Image description"
                },
                "image_category_id": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "description": "Image Category ID",
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    }
                  ],
                  "description": "Image Category ID",
                  "x-mcp-original-type": "integer"
                },
                "location_id": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    }
                  ],
                  "description": "If you want to use an existing location and you have the ID of that existing location use this. `location_id` takes precedence over `mt_location`",
                  "x-mcp-original-type": "integer"
                },
                "daily_log_segment_id": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "description": "Daily Log Segment ID",
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Daily Log Segment ID",
                  "x-mcp-original-type": "integer"
                },
                "mt_location": {
                  "type": "array",
                  "description": "Use this for creating a new multi-tier or single-tier Location. This will be ignored if `location_id` is provided.",
                  "items": {
                    "type": "string"
                  }
                },
                "trade_ids": {
                  "type": "array",
                  "description": "An array of IDs of the Trades of the Image",
                  "items": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[0-9]+$"
                      }
                    ],
                    "x-mcp-original-type": "integer"
                  }
                },
                "log_date": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "defaultContentType": "application/json"
  },
  "responseContentTypes": [
    "application/json"
  ],
  "provenance": {
    "sourceUrl": "https://developers.procore.com/api/v1/resource_groups/resource/images?version=rest_v1.0",
    "sourceSha256": "84469264df7544710210e68a3f16fe93fab8bec3d9fe4f9b275c3fc2b02914e3",
    "snapshot": "snapshots/oas/images--rest_v1.0.json.gz"
  },
  "sourceCorrections": []
}

What has been verified

Documented coverage
3,294 business operations across retained Procore API versions, with four authentication endpoints tracked separately. Deprecated and beta contracts are labelled. These counts describe documentation, not proven live workflows.
Agent connection
Actual Claude Desktop and web connection, model-selected platform utility calls, renewal after natural token expiry and revoked-access rejection passed. Codex and Claude Code authentication and discovery were also checked. These tests made no provider business requests.
Live business workflows
Awaiting an authorised Procore app and account, live acceptance and the applicable approval for the intended use. Catalogue search passed in Claude Desktop and web; full contract retrieval passed in Claude web. Procore business requests have not been verified.
More software, the same workspace

Explore Unleashed MCP

The Unleashed waitlist is open. Inspect its documented coverage and account requirements.

Explore Unleashed