Create project
create_projectCreate a top-level project or subproject after validating fields and identifiers through OpenProject's form endpoint, so conflicts return clear violations before commit.
Instructions
Create a project, validated through OpenProject's own form endpoint first.
Use it for a new workspace or, with parent_id, for a subproject of an existing
one. The call runs POST /projects/form before committing, so a taken identifier,
an unusable parent or a bad status comes back as violations naming the attribute
instead of an opaque failure — and the identifier OpenProject derives from the name
is used verbatim on the commit.
Returns the created project: {id, identifier, name, active, public, parent, status_code, description, status_explanation, created_at, updated_at}. Keep the
id — every other tool's project_id accepts it, as does the identifier.
Pitfalls: creating projects usually requires the 'create project' permission or
admin rights, so a 403 here is about the account, not the payload. The new project
starts with the instance's default modules and types enabled — check
get_project_metadata(project_id=...) before creating work packages in it.
Members are not copied from the parent; add them with create_membership
(admin-gated: hidden unless the server sets OPENPROJECT_MCP_ADMIN_TOOLS=1).
Cross-references: list_projects finds the parent id; update_project changes
any of these fields afterwards; get_project_metadata lists the types, versions
and categories valid inside the result.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"name": "<name>"
},
"name": "create_project"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name of the new project, e.g. 'Apollo migration'. Names need not be unique on the instance; the identifier is what must be. | |
| public | No | True makes the project visible to every logged-in user without a membership. Omit to take the instance default (normally private). | |
| parent_id | No | Numeric id or identifier of the parent project, to create a subproject. Ids come from list_projects. Omit for a top-level project. Creating a subproject needs the 'add subprojects' permission on the parent. | |
| identifier | No | URL slug for /projects/<identifier>: lowercase letters, digits, '-' and '_' only, unique across the whole instance. Omit it and OpenProject derives one from the name — the derived value is in the result. A slug that is already taken comes back as a validation violation, not a surprise rename. | |
| description | No | Project description in markdown. Omit to leave it empty. | |
| status_code | No | Initial project status: on_track, at_risk, off_track, not_started, finished or discontinued. These codes are the only accepted values — a free-text status is rejected rather than silently dropped. Omit for no status. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| name | No | ||
| active | No | ||
| parent | No | ||
| public | No | ||
| created_at | No | ||
| identifier | No | ||
| updated_at | No | ||
| description | No | ||
| status_code | No | ||
| workspace_type | No | ||
| status_explanation | No |