Copy project
copy_projectCopy an existing project's settings and optionally its work packages into a new project, using the original as a template for a new engagement or release.
Instructions
Copy a project — its settings, and optionally its work packages — into a new one.
Use it to spin a new engagement or release off a template project, which is the only
way to reproduce a project's members, versions, categories and enabled modules in one
call. The request goes through POST /projects/{id}/copy/form first, so a name that
derives a taken identifier comes back as violations naming the attribute instead of
a failed background job.
Copying is ASYNCHRONOUS: OpenProject queues a job and answers immediately. This tool
therefore returns {scheduled: true, job_id, status, message, notes} and NEVER
claims the copy exists — a large project takes minutes. Poll
get_job_status(job_id=...) until status is 'success' (it then reports the new
project) or 'failure'.
Pitfalls: only include_work_packages and notify are exposed; every other copy
flag (members, versions, wiki, boards, file links) keeps this instance's own default,
which the form fills in — so the copy can contain more than the two parameters
suggest. A 403 means the account may not copy this project (it needs the 'copy project'
permission on the template plus the right to create projects). Work packages come
across with their relations, but time entries and comment histories do not.
Cross-references: get_job_status follows the job to completion; list_projects
or get_project confirms the result; create_project makes an empty project
instead; update_project renames the copy afterwards.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| notify | No | Send OpenProject notification emails for everything the copy creates. false (default) keeps a large copy quiet; the copy itself is identical. | |
| new_name | Yes | Display name of the copy, e.g. 'Apollo migration (2027)'. OpenProject derives the copy's URL identifier from it; the derived value is reported by get_job_status once the job succeeds. | |
| id_or_identifier | Yes | Numeric id or URL identifier of the project to copy (the TEMPLATE, not the copy). Both are accepted and come from list_projects or get_project. | |
| include_work_packages | No | Copy the template's work packages too (default). false copies the project shell — members, versions, categories, wiki and the other settings the instance defaults to — without any tickets. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | What is still outstanding. Always says the copy has to be polled. | |
| job_id | No | Background job id — pass it to get_job_status. Null when the instance reported none; 'notes' then says what to do instead. | |
| source | Yes | The project id or identifier that was copied. | |
| status | No | Job state at the moment the copy was accepted, normally 'in_queue'. Null when the instance reported none. | |
| message | No | Message the job reported, when it carried one. | |
| project | No | The copy itself ({id, name}) — only populated on the rare instance that finishes the job before answering. Normally null: read it from get_job_status. | |
| new_name | Yes | Name requested for the copy. | |
| scheduled | Yes | True once OpenProject accepted the request. The copy itself runs in the background and is not finished when this is true. |