OpenProject CE MCP Server
An MCP server that gives Claude and other MCP clients 91 tools, 4 report prompts and 3 resource templates to read and write nearly everything in a self-hosted OpenProject Community instance via API v3.
Work packages: search by text, list with rich structured filters (assignee, dates, versions, sprints, progress, custom fields), read full detail, create, update with optimistic locking, and preview/apply bulk updates (up to 50).
Collaboration: comment threads and change history, add/edit comments, watchers, reminders, relations (blocks/follows/duplicates), emoji reactions and instance-defined custom actions.
Attachments and file links: list, upload, download (with SHA-256, virus-scan and size checks) and delete files, plus external-storage links (Nextcloud, OneDrive).
Projects: list/get/create/update/delete/archive projects, copy projects (async, via job status), favorites, phases and phase definitions.
Code activity: commits, GitHub pull requests with CI check runs, GitLab merge requests and issues.
Saved queries: list, run and save reusable work-package views.
Notifications: read the inbox, mark specific or all notifications read.
Time tracking: list entries with accurate per-activity totals, log time, update and delete entries.
Versions and sprints: list, get, create, update and delete versions; list and read sprints.
People and memberships: search users/groups, read profiles, list memberships and roles, and (admin-gated) grant, change or revoke memberships.
Meetings: schedule and edit meetings, build agendas, record outcomes, and manage recurring series and their occurrences (OpenProject 17.4+).
Other modules: wiki page identity, documents, budgets, and project news (list/read/create/update/delete).
Reporting: one-call project report aggregation (created/updated/closed counts, open-by-status, time breakdown, roster) and four ready-made prompts — weekly report, daily standup, triage inbox, groom backlog — plus resource templates for work packages, projects and attachments.
Safety and adaptation: read-only mode, per-group tool disabling,
confirm=trueguards on destructive tools, structured errors and honest degradation notes, and version-adaptive behaviour for OpenProject 14 LTS–17.x.
Provides tools for interacting with OpenProject's API v3, enabling management of work packages, comments, relations, attachments, git/PR activity, projects, saved queries, notifications, time tracking, versions, people, memberships, meetings, news, documents, budgets, and reporting.
OpenProject MCP Server
An MCP (Model Context Protocol) server for the OpenProject API v3. It gives Claude and any other MCP client 91 tools covering work packages, comments and relations, attachments, git/PR activity, projects, saved queries, notifications, time tracking, versions, people and memberships, meetings, news, documents, budgets and reporting — plus 4 report/workflow prompts and 3 resource templates. Built on FastMCP 3.x and httpx (HTTP/2).
This project is aimed at the OpenProject Community edition. OpenProject's Enterprise edition now ships with its own built-in MCP integration; this server brings the same capability to self-hosted Community instances. It runs fine against any edition — it only needs the public API v3.
Design principles, all enforced in code:
Structured everything. Every tool returns a typed model, so clients get an
outputSchemaand machine-readablestructuredContent, not prose. Errors come back as a JSON envelope with a stabletype, the upstreamhttp_status, amessageand ahintdescribing how to correct the call.Honest degradation. OpenProject instances differ by version, installed modules and permissions. Tools report what they could not see as in-band notes — a missing module yields an empty page with an explanation, never a fake success or a bare traceback.
Safe by default. A read-only mode, admin-gated membership writes, per-group tool disabling, a
confirm=trueguard on every destructive tool, TLS always verified, and credentials that never appear in logs.Version-adaptive. Targets OpenProject 14 LTS through 17.x; API differences are detected by a lazy, cached feature probe instead of assumptions (see Supported OpenProject versions).
What it looks like
Two exchanges against a fictional "Website Relaunch" project — every id, name and date below is invented. You describe the outcome; the model picks the tools, and what comes back to it is a typed object rather than prose to re-parse.
You What is still open in Website Relaunch and due by Friday? The checkout
bug is urgent — raise it and leave a note for whoever owns it.
→ list_work_packages(project="website-relaunch", status_scope="open",
due_before="2026-03-13", sort_by=[["due_date", "asc"]])
{ "items": [
{ "id": 4821, "subject": "Checkout fails on expired coupon codes",
"type": {"id": 7, "name": "Bug"}, "status": {"id": 7, "name": "In progress"},
"assignee": {"id": 118, "name": "Dana Okafor"}, "due_date": "2026-03-11" },
{ "id": 4830, "subject": "Move press-kit assets to the new CDN",
"type": {"id": 1, "name": "Task"}, "status": {"id": 1, "name": "New"},
"assignee": null, "due_date": "2026-03-13" }],
"pagination": {"total": 2, "page": 1, "page_size": 20, "has_more": false} }
→ update_work_package(id=4821, priority="High")
→ add_work_package_comment(id=4821, comment="Raised to High — it blocks the
launch checklist. Dana, can you take a look today?")
Assistant Two open items are due by Friday. #4821 is High now and the note is on
its thread; #4830 is due Friday and still has nobody on it.The rows above are abridged: each one also carries priority, project, start_date,
percentage_done and updated_at, and the envelope keeps groups, sums and notes slots
for the calls that fill them.
The prompt templates cut out the tool round trips: the server reads OpenProject itself and hands back a finished document rather than instructions to go and fetch one. It arrives prefaced with a note that the numbers are already computed and must not be recomputed or embellished.
You /weekly_report project=website-relaunch
# WEEKLY REPORT - AGILE SCRUM
_Generated from live OpenProject data_
...
## B. EXECUTIVE SUMMARY
**Progress against the sprint goal:** Not assessed — sprint goal and completion dates are not available
**Currently closed work updated in the window:**
1. #4802 - Ship the new pricing page
2. #4795 - Halve the hero image payload
...
### Data notes
- open/closed bucketing uses each status's isClosed flag from
GET /statuses, not status names; a status this instance renamed
or translated is still bucketed correctlyThat last block is the house style: a report says which of its numbers are partial, and a tool that could not read something returns the gap as a note instead of guessing. The whole surface is in Tools and Prompts and resources.
Related MCP server: MCP Toolbox for Databases
Requirements
Python >= 3.12
An OpenProject instance, version 14 LTS through 17.x (any edition; aimed at Community — Enterprise ships its own MCP integration)
An OpenProject API key: in OpenProject, go to My account → Access tokens and generate an API token
Installation
The distribution name is openproject-mcp-server. It installs two identical console scripts,
openproject-mcp-server and openproject-mcp; the long form is canonical (an unrelated PyPI
package also installs a bin named openproject-mcp).
Run one-shot with uv, no install step:
uvx openproject-mcp-serverOr install persistently:
uv tool install openproject-mcp-server
# or
pip install openproject-mcp-serverThe minimal configuration is two environment variables:
export OPENPROJECT_URL=https://openproject.example.com
export OPENPROJECT_API_KEY=your-api-keyValidate the configuration without starting the server:
openproject-mcp-server --check--check verifies the configuration and exits; it does not contact your instance. Once
connected through a client, call the get_instance_info tool for a live end-to-end check.
When configuration is missing or invalid, the server prints the specific problems to stderr
and exits with code 2 — never a traceback.
Claude Code
claude mcp add openproject \
--env OPENPROJECT_URL=https://openproject.example.com \
--env OPENPROJECT_API_KEY=your-api-key \
-- uvx openproject-mcp-serverClaude Desktop and other MCP clients
Add to claude_desktop_config.json (or your client's equivalent mcpServers config):
{
"mcpServers": {
"openproject": {
"command": "uvx",
"args": ["openproject-mcp-server"],
"env": {
"OPENPROJECT_URL": "https://openproject.example.com",
"OPENPROJECT_API_KEY": "your-api-key"
}
}
}
}From source
git clone https://github.com/kar-thik/openproject-mcp
cd openproject-mcp
uv sync
uv run openproject-mcp-serverUpdating or rotating your API token
When a token is regenerated, revoked or invalidated (OpenProject major upgrades can do this —
the symptom is every tool suddenly failing with authentication_failed / HTTP 401), generate
a fresh one in OpenProject under My account → Access tokens and update it wherever your
key lives:
Shell environment (easiest to rotate). The server reads
OPENPROJECT_API_KEYstraight from the OS environment, so you can export it globally — e.g. in~/.zshenv— and register the server with no--envflags at all:claude mcp add openproject -- uvx openproject-mcp-serverRotation is then: edit the export, open a fresh terminal, reconnect. The client config never contains a secret. (This does not work for GUI apps like Claude Desktop, which don't read your shell profile.)
Claude Code with
--env. The registration stores the key, so replace it:claude mcp remove openproject claude mcp add openproject \ --env OPENPROJECT_URL=https://openproject.example.com \ --env OPENPROJECT_API_KEY=new-key \ -- uvx openproject-mcp-serverThen reconnect via
/mcp(a running session keeps the old environment until it does).Claude Desktop and other JSON-configured clients. Edit the
OPENPROJECT_API_KEYvalue in the client config and restart the client..envfile. Edit the file and restart the server.
Recent OpenProject versions allow several API tokens in parallel, so you can rotate with zero downtime: create the new token, switch your clients over, then revoke the old one.
Configuration
Configuration is entirely environment-driven. The table below is the authoritative reference:
the server binds exactly these 26 names and no others. Bare, unprefixed names such as
READ_TIMEOUT or API_KEY are deliberately ignored (a stray variable in your shell cannot
change or break the server), as is any other unknown variable. A .env file in the server's
working directory is read with the same names; real environment variables take precedence.
From-source users can start from
.env.example.
Variable | Default | Purpose |
| — (required) | Instance root URL, e.g. |
| — (required*) | API key from My account → Access tokens. Sent as HTTP Basic |
| unset | OAuth bearer token, as an alternative to the API key. *One of the two credentials is required. |
| unset | Sent as the |
| system trust store | Path to a CA bundle (PEM) for instances behind a private CA. TLS is always verified; there is deliberately no off switch. |
|
| Serve read tools only: every write, destructive and admin tool is removed at startup. |
|
| Expose the three admin-gated membership write tools (hidden by default). |
| empty | Comma-separated group tags to remove whole tool groups at startup (see below). |
|
|
|
|
| Allow |
|
| Directory where |
| unset | When set, |
| unset | When set, |
|
| Size cap for attachment downloads, in MiB. |
|
| Size cap for attachment bytes returned inline by the |
|
| TTL in seconds for the metadata cache (statuses, types, priorities, schemas). |
|
|
|
|
|
|
|
| Log request/response bodies — only at DEBUG level, with credentials redacted. Development use only. |
|
| Reserved for OpenTelemetry tracing. Accepted but not yet wired to anything in this release; setting it produces no traces. |
|
| Bind address for |
|
| Port for |
| unset | Comma-separated bearer tokens accepted by |
|
| Seconds to wait for a TCP/TLS connection to OpenProject. |
|
| Seconds to wait for response data. |
|
| Seconds to wait while sending request data (uploads). |
|
| Seconds to wait for a free connection from the pool. |
|
| Connection pool size toward OpenProject. |
|
| Retry budget for idempotent requests. |
Secrets (OPENPROJECT_API_KEY, OPENPROJECT_OAUTH_TOKEN, OPENPROJECT_MCP_AUTH_TOKENS) are
held in memory as Pydantic SecretStr values and are never written to logs; the
Authorization header is redacted in every log record.
Limiting what the model can do
Four settings shrink the tool surface at startup. The tool list is then fixed for the lifetime
of the process, with one exception: enable_tool_group can bring back a group hidden by the
core profile, for the calling session only.
OPENPROJECT_MCP_READ_ONLY=1serves only the 40 read tools.OPENPROJECT_MCP_ADMIN_TOOLS=1reveals the three membership write tools (create_membership,update_membership,delete_membership); they are hidden by default.OPENPROJECT_MCP_DISABLEdrops whole groups to cut prompt cost, e.g.OPENPROJECT_MCP_DISABLE=meetings,news. The valid group tags are:work_packages,wp_collaboration,attachments,git_activity,projects,queries,notifications,time_entries,versions,people,metadata,meetings,wiki,documents,budgets,news,reporting— the same tags that head each section of the tool catalog below — plusmeetings_recurring, a sub-tag ofmeetingsthat drops only the six recurring-meeting tools (meetingsdrops them too).OPENPROJECT_MCP_PROFILEdefaults tocore(since 0.4.0), which hides the module-backed groups —meetings,news,documents,wiki,budgets,git_activityandreporting, plus the two reporting prompts — so a session starts with a smaller tool list. Set it tofullto list every group from the start. When the model needs one of them it callsenable_tool_group, which restores that group for the calling session only; the server then emitstools/list_changedto that session, so the client must honour that notification and re-read its tool list (if yours does not, setfull). Session rules expire after 24 hours idle.enable_tool_groupnever liftsREAD_ONLY, the admin gate orOPENPROJECT_MCP_DISABLE; it lives in themetadatagroup, so disabling that group removes it.
Independent of all four, every destructive tool (the 13 permanent deletes) requires an
explicit confirm=true argument before it acts.
Transports
stdio (default) — what Claude Code, Claude Desktop and most local MCP clients use. Logs go to stderr; stdout carries only the protocol.
Streamable HTTP —
openproject-mcp-server --transport http. Binds127.0.0.1:8000by default; override with--host/--portorOPENPROJECT_MCP_HTTP_HOST/OPENPROJECT_MCP_HTTP_PORT. The HTTP transport refuses to start without authentication configured: setOPENPROJECT_MCP_AUTH_TOKENSto a comma-separated list of bearer tokens, or — for local development only — setOPENPROJECT_MCP_INSECURE=1.With tokens configured, every HTTP request to the MCP endpoint must carry an
Authorization: Bearer <token>header whose token matches one of the configured values (compared in constant time); requests with a missing, malformed or unknown token are rejected with a 401 and aWWW-Authenticateheader. Multiple tokens are supported — for example one per client, so each can be revoked independently. Tokens must be ASCII, and the endpoint applies no rate limiting, so use long random values — for examplepython -c "import secrets; print(secrets.token_urlsafe(32))".OPENPROJECT_MCP_INSECURE=1remains a development-only escape hatch that leaves the endpoint open without authentication.The server does not terminate TLS, so tokens would otherwise cross the network in plaintext: keep the default
127.0.0.1bind, and if you must expose the HTTP transport beyond localhost, put it behind a TLS-terminating reverse proxy (for example nginx or Caddy).One upstream identity. Bearer tokens decide who may reach the endpoint, not who they are in OpenProject: the server holds a single
OPENPROJECT_API_KEY(or OAuth token), and every HTTP client acts as that OpenProject user and shares its metadata cache. Deploy it for clients you would trust with that account, and issue a dedicated, least-privileged OpenProject user for it.File tools touch the server's disk.
upload_attachment,create_work_package (attachment_paths)anddownload_attachmentread and write paths on the machine running the server. Over HTTP they are off until you confine them:upload_attachmentandattachment_pathsneedOPENPROJECT_MCP_UPLOAD_ROOT,download_attachmentneedsOPENPROJECT_MCP_DOWNLOAD_ROOT. Until then the tool is hidden (andattachment_pathsis refused), and the server names the missing variable in a startup warning.
Tools
91 tools: 42 read, 46 write and 3 admin-gated writes. The admin tools stay hidden unless
OPENPROJECT_MCP_ADMIN_TOOLS=1; the 13 destructive tools additionally require confirm=true
on every call. Each section heading names the group tag accepted by
OPENPROJECT_MCP_DISABLE.
Work packages (work_packages)
Tool | Kind | What it does |
| Read | Find work packages by text when you do not know their ids. |
| Read | List work packages with structured filters — the workhorse read tool. |
| Read | Read one work package in full: description, dates, custom fields, parent and progress. |
| Write | Create a work package, validated through OpenProject's own form endpoint first. |
| Write | Change any writable field of a work package, with optimistic locking. |
| Write | Preview or apply up to 50 updates with per-item diffs, validation and conflict results. |
| Write (destructive) | Permanently delete a work package and everything attached to it. |
Batch workflow: call bulk_update_work_packages(updates=[{"id": 4821, "changes": {"target_versions": [3, 4]}}]) to preview. Review the returned changes,
then repeat with dry_run=false and each item's returned lock_version included
in updates. Any preflight error prevents the whole batch from writing. A later
conflict can produce partial success; inspect every item and never replay successful
updates. unknown means the write may have committed before the response was lost.
Comments, relations, watchers, reminders (wp_collaboration)
Tool | Kind | What it does |
| Read | Read the comment thread and change history of a work package. |
| Write | Post a comment on a work package. |
| Write | Rewrite the text of an existing work-package comment. |
| Write | Subscribe a user to a work package's notifications. |
| Write | Unsubscribe a user from a work package's notifications. |
| Write | Link two work packages (blocks, follows, duplicates, relates, ...). |
| Write | Change an existing relation's type, lag or description. |
| Write (destructive) | Remove the link between two work packages. |
| Write | React to a work-package comment with an emoji, or take the reaction back. |
| Write | Set, change or clear your personal reminder on a work package. |
| Read | List your own upcoming work-package reminders. |
| Write | Run an instance-defined one-click action on a work package. |
Attachments and file links (attachments)
Tool | Kind | What it does |
| Read | List the files attached to one container. |
| Read | Download an attachment's bytes to a file on the machine running this server. |
| Write | Attach a local file to a work package, wiki page, meeting, document, budget or comment. |
| Write (destructive) | Permanently delete one attached file from OpenProject. |
| Read | List the external-storage files (Nextcloud, OneDrive/SharePoint) linked to a work package. |
Git and pull requests (git_activity)
Tool | Kind | What it does |
| Read | Show the code behind a work package: commits, pull/merge requests and CI status. |
| Read | Read one linked GitHub pull request in full, including its CI check runs. |
Projects (projects)
Tool | Kind | What it does |
| Read | List projects, filtered server-side, one page at a time. |
| Read | Read one project in full. |
| Write | Create a project, validated through OpenProject's own form endpoint first. |
| Write | Change a project's name, description, visibility, parent, status or archived state. |
| Write (destructive) | Schedule the permanent deletion of a project and everything inside it. |
| Write | Copy a project — its settings, and optionally its work packages — into a new one. |
| Read | Check whether a background job (a project copy, a scheduled deletion) has finished. |
| Write | Add or remove a project from the authenticated user's favorites (OpenProject 17+). |
| Read | List the instance-wide phase catalog (Initiating, Planning, ...) with start/finish gates (OpenProject 16.1+). |
| Read | Read one project's phase record; ids come from a work package's |
Saved queries (queries)
Tool | Kind | What it does |
| Read | List the saved work-package views (queries) this user can open. |
| Read | Run a saved view and get its work packages as they are right now. |
| Write | Save a filter set as a reusable OpenProject view the whole team can open. |
Notifications (notifications)
Tool | Kind | What it does |
| Read | Read the authenticated user's OpenProject inbox. |
| Write | Mark specific notifications read (or unread) in one bulk request. |
| Write | Mark everything matching the filters as read — the whole inbox by default. |
Time tracking (time_entries)
Tool | Kind | What it does |
| Read | List logged time, filtered server-side, with an optional accurate total. |
| Write | Book time against a work package or a project. |
| Write | Correct an existing time entry. |
| Write (destructive) | Permanently delete a logged time entry. |
Versions and sprints (versions)
Tool | Kind | What it does |
| Read | List versions (releases, milestones, sprints) you can assign work packages to. |
| Read | List sprints (Scrum timeboxes) you can plan work packages into. |
| Read | Read one sprint in full: dates, workspace and lifecycle status. |
| Write | Create a version (release, milestone or sprint) inside a project. |
| Write | Change a version's name, dates, description, status or sharing. |
| Write (destructive) | Permanently delete a version. |
People and memberships (people)
Tool | Kind | What it does |
| Read | Find users, groups and placeholder users, and get their ids. |
| Read | Read one user's profile: name, login, email, admin flag and status. |
| Read | List who has access to which project, and with which roles. |
| Admin write | Grant a principal one or more roles in a project. |
| Admin write | Replace the roles of an existing membership. |
| Admin write (destructive) | Revoke a principal's access to a project. |
| Read | List the roles this instance defines, with their ids. |
The three membership write tools require OPENPROJECT_MCP_ADMIN_TOOLS=1 (and an OpenProject
account with the Manage members permission).
Instance metadata and schemas (metadata)
Tool | Kind | What it does |
| Read | Check the OpenProject connection and report what this instance supports. |
| Read | List the ids and names (types, statuses, priorities, ...) that are actually valid on this instance. |
| Read | Show which fields a work package of this type accepts in this project. |
| Read | List what the authenticated user is allowed to do, globally or in one project. |
| Read | Re-enable a tool group hidden by |
Meetings (meetings)
The six recurring-meeting tools also carry the meetings_recurring tag, so
OPENPROJECT_MCP_DISABLE=meetings_recurring drops just them (they need OpenProject 17.4+).
Tool | Kind | What it does |
| Read | List meetings: what is coming up, what already ran. |
| Read | Read one meeting in full: participants, the agenda, and any recorded outcomes. |
| Write | Schedule a meeting in a project and optionally invite participants. |
| Write | Change a meeting's title, time, place or invite list — or move its lifecycle state. |
| Write (destructive) | Permanently delete a meeting, together with its agenda and recorded outcomes. |
| Write | Add one item to a meeting's agenda, optionally pinned to a work package. |
| Write | Edit one agenda item: retitle it, rewrite its notes, retime, reorder or re-link it. |
| Write (destructive) | Permanently delete one agenda item, with any outcomes recorded against it. |
| Write | Record an outcome — a decision, a note, a follow-up ticket — against an agenda item. |
| Write | Correct a recorded outcome's kind, text or linked work package. |
| Write (destructive) | Permanently delete a recorded outcome from a running meeting's minutes. |
| Read | List recurring meeting series — the repetition rules, not the individual meetings. |
| Read | Read one recurring series in full: the schedule plus its next occurrences. |
| Write | Create a recurring meeting series: a schedule plus a template the occurrences copy. |
| Write (destructive) | Permanently delete a recurring series: template, schedule, and every occurrence. |
| Write | Materialize one occurrence of a series as a real meeting, copied from the template. |
| Write (destructive) | Cancel one occurrence of a series — skip a slot without touching the schedule. |
Wiki (wiki)
Tool | Kind | What it does |
| Read | Read a wiki page's identity and project — not its content (API v3 does not expose page bodies). |
Documents (documents)
Tool | Kind | What it does |
| Read | List the documents visible to you, across every project. |
| Read | Read one document with its full description text. |
Budgets (budgets)
Tool | Kind | What it does |
| Read | List a project's budgets — their ids and names, which is all API v3 exposes. |
News (news)
Tool | Kind | What it does |
| Read | List project news — the announcements a team publishes on its project overview. |
| Read | Read one news entry in full, including the markdown body. |
| Write | Publish a news announcement in a project. |
| Write | Correct or rewrite a published news entry. |
| Write (destructive) | Permanently delete a news entry. |
Reporting (reporting)
Tool | Kind | What it does |
| Read | Aggregate a status report for one project and date window: exact counts, sampled rows with a drill-down call, and a state per section. |
Prompts and resources
Report data uses closed_updated for currently closed work updated in the requested
window. This replaces the former closed field in v0.3.0. It does not establish when
work was completed; sprint health remains unassessed without supporting data.
Four prompt templates render live OpenProject data into ready-to-use briefings:
weekly_report — a weekly status report for one project: currently closed and updated / in progress / planned, hours and impediments.
daily_standup — today's standup for one project: yesterday's movement, what is due today, and what is blocked.
triage_inbox — groups your unread notifications by reason and suggests actions.
groom_backlog — sweeps a project's open backlog for unassigned, stale and unestimated work.
Three resource templates expose OpenProject objects at stable URIs:
openproject://work_package/{id}— one work package as JSON.openproject://project/{identifier}— one project as JSON (identifier slug or numeric id).openproject://attachment/{id}— the attachment's bytes with the detected MIME type, up toOPENPROJECT_MCP_MAX_INLINE_MB.
Supported OpenProject versions
The server targets OpenProject 14 LTS through 17.x. Instead of assuming one API dialect, it probes the instance lazily on first need and caches the result for an hour. The version-dependent surfaces:
Target versions: work-package details expose
target_versionson every supported instance. Create/update accept a list of version ids ([]clears); the schema selectstargetVersionson 17.8+ or a single legacyversion. The oldversionargument remains a single-value alias; do not pass both. On reads it is null for multiple assignments.Internal (private) comments need OpenProject >= 16. Older servers silently ignore the internal flag, so below 16 the server refuses with a clear error rather than posting a comment publicly that you asked to keep internal.
Emoji reactions (
toggle_comment_reaction) need OpenProject >= 16; detected from the version, tolerant of a 404 at call time.Project favorites (
set_project_favorite) need OpenProject >= 17; same tolerance.Time-entry filters: the work-package filter is probed (
entityId, falling back to the pre-15.xworkPackagespelling).Permission contexts (
list_permissions): the context prefix is probed (p{id}, falling back to thew{id}spelling introduced in 17.2).Meetings time filter: OpenProject 17.6 changed the wire dialect;
list_meetingsdiscovers which spelling the instance accepts and caches it.Story points need the Backlogs module and a type Backlogs treats as a story. 17.x refuses
story_pointsotherwise; 14.x accepts the write and silently drops the value, so the result carries a note saying it was not saved (bulk previews warn before writing).
Features that depend on optional instance modules (meetings, news, documents, budgets, wiki, backlogs, GitHub/GitLab integration, external storages) degrade honestly when the module is absent: list tools return an empty page with an in-band note naming the missing module, and detail tools return a structured error explaining both possible readings of the 404.
Security
The API key and OAuth token are held as
SecretStrand never logged;Authorizationand cookie headers are redacted from every log record. Request/response bodies are only logged at DEBUG level withOPENPROJECT_MCP_LOG_BODIES=1, for development.The
Authorizationheader is stripped whenever a redirect leaves the OpenProject origin — attachment downloads redirect to presigned object-storage URLs, and the credential must not travel there.TLS is always verified. Private CAs are supported via
OPENPROJECT_MCP_CA_BUNDLE; an insecure-TLS switch deliberately does not exist.Attachment downloads respect OpenProject's virus scanner: quarantined files are never fetched and produce a structured
attachment_quarantinederror. Downloads are capped byOPENPROJECT_MCP_MAX_DOWNLOAD_MB, stored under sanitized file names (directory separators and traversal sequences are neutralized), and reported with a SHA-256 of the bytes.Destructive tools require
confirm=trueand are annotated so clients can ask the user first.The HTTP transport refuses to start without
OPENPROJECT_MCP_AUTH_TOKENSconfigured and verifies theAuthorization: Bearerheader on every request — missing or invalid tokens are rejected with a 401, and token comparison is constant-time. The server does not terminate TLS: keep the default127.0.0.1bind, and put a TLS-terminating reverse proxy in front if the port must be reachable from anywhere else (see Transports). All HTTP clients share the server's one OpenProject identity; confine the file tools withOPENPROJECT_MCP_UPLOAD_ROOT/OPENPROJECT_MCP_DOWNLOAD_ROOT.Downloads are created exclusively (never overwriting an existing file, even under concurrent downloads of the same name), and a failed or cancelled transfer removes only the file it created.
Troubleshooting
Symptom | What it means and what to do |
Server exits with "cannot start, configuration is incomplete" | Run |
401 authentication_failed | The API key is wrong, revoked, or belongs to a blocked account. Generate a fresh token under My account → Access tokens. |
403 permission_denied | The account is authenticated but lacks a role permission for that project, or the relevant module is disabled for it. |
Empty list plus a note about a missing module | That OpenProject module (meetings, news, documents, ...) is not installed or not enabled in the project — the empty result is the honest answer, not an error. |
TLS certificate errors | Your instance uses a private CA: point |
| Set |
401 from the MCP HTTP endpoint itself | The request's |
Proxies | Standard |
When reporting an issue, please include your OpenProject version, the output of
openproject-mcp-server --version, and the output of openproject-mcp-server --check.
Development
git clone https://github.com/kar-thik/openproject-mcp
cd openproject-mcp
uv sync --group dev
uv run pytest # entire suite runs offline (respx-mocked HTTP), no instance needed
uv run ruff check .
uv run ruff format --check .
uv run pyright # strict modeThe default suite stays offline. Opt-in compatibility checks run against fresh official OpenProject 14.6, 15.5, 16.6 and 17.8 containers in the Compatibility workflow (including both single- and multiple-version modes on 17.8). To run one locally with Docker running:
uv run python scripts/live_smoke.py --image openproject/openproject:17.8.0The harness seeds a private project, temporary users, custom fields and versions; it tests
through MCP, then removes the container and its volumes. Existing instances and credentials
are not used. Direct pytest runs skip these tests unless --live-openproject is supplied
with a disposable fixture file. The
full technical specification lives in
SPEC.md.
Releasing is documented in CONTRIBUTING.md.
License and trademark
MIT — see LICENSE.
This is a community project. It is not affiliated with, endorsed by, or supported by OpenProject GmbH. "OpenProject" is a trademark of OpenProject GmbH and is used here only to indicate interoperability.
Available Tools
59 toolsadd_work_package_commentAdd work package commentA
Post a comment on a work package.
Use this to reply in a ticket's thread, record a decision, or leave a
handover note. Returns the created journal entry (activity id, author,
markdown text, internal flag, timestamps) — the same shape
list_work_package_comments returns, so the id can be reused.
Pitfalls. Every call creates a new comment; it is not idempotent, so do
not retry blindly after a timeout — read the thread first.
internal=true is refused on OpenProject below 16.0 because those
versions accept the flag and publish the comment anyway; upgrade or post
publicly, deliberately. notify=false suppresses notifications only,
the comment is still visible to everyone who can see the work package.
Cross-references: read the thread with list_work_package_comments;
change fields (status, assignee, dates) with update_work_package
rather than describing the change in prose; attach a file with
upload_attachment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Work package id to comment on. Get it from search_work_packages or list_work_packages. | |
| notify | No | Send the usual watcher/assignee notifications. Set false for bulk or bookkeeping comments so inboxes stay quiet. | |
| comment | Yes | Comment body in markdown. OpenProject renders it; @-mentions need the user's mention syntax, plain names do not notify anyone. | |
| internal | No | Post as an internal comment, visible only to project members with the internal-comments permission. Requires OpenProject >= 16; on older instances the call fails instead of posting publicly. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| kind | Yes | |
| author | No | |
| comment | No | |
| details | No | |
| version | No | |
| internal | No | |
| truncated | No | |
| created_at | No | |
| updated_at | No | |
| work_package | No | |
| comment_length | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond annotations: non-idempotency and retry risk, OpenProject <16.0 behavior for internal comments, and the distinction that notify=false only suppresses notifications while the comment remains visible. These are exactly the operational caveats an agent needs before invoking a write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and usage cases, then organized into pitfalls and cross-references. Despite covering several caveats, every section earns its place and remains easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema and annotations, and the description still adds valuable return-shape context, retry guidance, version-specific caveats, and sibling routing. Nothing an agent needs to invoke it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter meanings are already fully documented in the input schema. The description reinforces important semantics for internal and notify, but it does not add substantial new syntax or format guidance beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: post a comment on a work package. It also distinguishes the tool from siblings by naming update_work_package, list_work_package_comments, and upload_attachment as alternatives for related tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use cases (reply in a thread, record a decision, leave a handover note) and routes other actions to the correct sibling tools. It also warns against blind retries and points to list_work_package_comments for reading the thread first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_work_package_watcherAdd work package watcherAIdempotent
Subscribe a user to a work package's notifications.
Use this when someone should be kept in the loop on a ticket without being assigned to it. Watchers receive OpenProject's notifications for comments and changes. Returns the watcher (user id and name), the watch state after the call, and whether this call actually changed anything.
Pitfalls. The user must already be able to see the work package;
OpenProject answers 422 with a violation on user otherwise, and
adding someone other than yourself needs the add-work-package-watchers
permission (adding yourself only needs view access). Calling twice is
harmless: the second call reports changed: false. Watching is not
assignment — use update_work_package(assignee=...) for that.
Cross-references: get_work_package(include=['watchers']) lists who
already watches; remove_work_package_watcher is the reverse;
list_work_package_comments shows what watchers are being notified
about.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | Numeric id of the user to add. Get it from list_users, from get_instance_info for the current user, or from any Ref in a work-package result. The string 'me' is not accepted here — the API needs a real id. | |
| work_package_id | Yes | Work package to watch. Ids come from search_work_packages, list_work_packages or get_work_package. |
Output Schema
| Name | Required | Description |
|---|---|---|
| user | No | |
| changed | No | |
| message | Yes | |
| watching | Yes | |
| work_package_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the 422 error and the 'user' violation when the target can't see the work package, the differing permission requirements for adding yourself vs others, and the idempotent 'changed: false' behavior on repeat calls. It also describes the return payload (watcher id/name, watch state, changed flag) even though an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence followed by labeled sections (Pitfalls, Cross-references) that make scanning easy, and every sentence carries actionable content. It is on the long side and some return-value detail is slightly redundant with the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, preconditions, permission model, idempotency, error modes, and neighbors — everything needed to call a two-parameter mutation correctly. Return values are explained even though the output schema already carries them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds meaning by tying user_id validity to visibility of the work package and permission scope. It doesn't add id-format or type details beyond the schema, so it doesn't reach 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Subscribe a user to a work package's notifications') and immediately distinguishes it from assignment ('Watching is not assignment'). An agent can tell it apart from update_work_package or remove_work_package_watcher without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when someone should be kept in the loop... without being assigned'), explicit alternative ('use update_work_package(assignee=...) for that'), and cross-references to the reverse tool and to get_work_package(include=['watchers']) for checking existing watchers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_update_work_packagesPreview or apply work package updatesA
Preview or apply up to 50 work-package updates, each with its own changes.
First call with dry_run=true (default). Review each before/after diff and validation error, then submit the same updates with dry_run=false and each preview's lock_version. Omitted fields remain untouched; null clears clearable fields; target_versions=[] clears version assignments. Status/type/priority accept names or ids, as in update_work_package.
All items are validated before any update. If any preflight fails, nothing is applied; correct those items or submit a valid subset. Execution is sequential and NOT atomic: concurrent edits can still conflict after validation. Each item reports its result; partial_failure is true when some apply and others fail. Item notes flag values OpenProject will ignore or ignored, such as story_points without Backlogs. An unknown outcome means a connection/server failure may have happened after committing: re-read that item before retrying. Writes are never automatically retried or rolled back. Never rerun successful items. Notifications use the same notify flag for the whole batch.
| Name | Required | Description | Default |
|---|---|---|---|
| notify | No | Send notification emails when applying updates. | |
| dry_run | No | Defaults to preview: validate and show changes without PATCH. | |
| updates | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| notes | Yes | |
| total | Yes | |
| applied | Yes | |
| dry_run | Yes | |
| partial_failure | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond annotations: preflight validation of all items before any write, sequential but non-atomic execution, partial_failure reporting, item notes for values OpenProject ignores (story_points without Backlogs), unknown-outcome semantics implying a possible post-commit server failure, no auto retry/rollback, and a warning never to rerun successful items. This is a materially richer disclosure than destructiveHint=false/idempotentHint=false provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the dry-run contract and every sentence carries operational content, including the subtle anti-retry warning. It is a dense single paragraph, though, which makes the review-then-apply procedure harder to scan than a short sequence would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still covers result reporting (per-item results, partial_failure, item notes) and the lock_version round-trip. For a high-risk batch mutation this is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Explains the semantics that matter most: omitted fields untouched, null clears clearable fields, target_versions=[] clears assignments, and notify applies to the whole batch. Schema coverage is 67%, and fields like custom_fields and percentage_done remain undocumented in both places, so it does not fully compensate for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (preview/apply), resource (work-package updates), and batch scope (up to 50, each with its own changes). This clearly distinguishes it from update_work_package, the single-item sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Prescribes an explicit two-phase workflow: dry_run=true first, review diffs and validation errors, then resubmit with dry_run=false and each preview's lock_version. It also states the recovery path (correct failing items or submit a valid subset) and says status/type/priority follow update_work_package semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_projectCopy projectA
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.
| 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 |
|---|---|---|
| notes | No | |
| job_id | No | |
| source | Yes | |
| status | No | |
| message | No | |
| project | No | |
| new_name | Yes | |
| scheduled | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the read/write and idempotency profile; the description adds the crucial asynchronous behavior (queues a job, returns {scheduled, job_id, status, message, notes}), the polling contract, the fact it never claims the copy exists, the 403 permission cause, and that relations copy but time entries and comment histories do not. This is exactly the context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then clearly segmented into async behavior, pitfalls, and cross-references. Slightly verbose in places (the 'spin a new engagement' framing, the repeated polling advice) but nearly every sentence adds an operational fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description explicitly describes the return shape and the polling loop, plus permission requirements and data-fidelity limits. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: only include_work_packages and notify are exposed while other copy flags (members, versions, wiki, boards, file links) fall back to instance defaults, so the copy may contain more than the two booleans imply. The id_or_identifier 'template, not the copy' clarification is also reinforced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Copy a project — its settings, and optionally its work packages — into a new one') and immediately differentiates it from sibling create_project later on. An agent can distinguish it from update_project/create_project without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the template/engagement scenario for when to use it, plus explicit alternatives: create_project 'makes an empty project instead', update_project 'renames the copy afterwards', get_job_status follows the job. Permission conditions for a 403 are also spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectCreate projectA
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.
| 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 |
|---|---|---|
| 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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-idempotent write, but the description adds real substance beyond them: the pre-commit form validation that surfaces `violations` per attribute, the fact the derived identifier is committed verbatim, the 403-is-an-account-problem pitfall, default modules/types enabled on creation, and that members are not inherited from the parent. That is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and the key differentiator, then organized into usage, returns, pitfalls and cross-references — dense but navigable. It is somewhat long, and the listed return fields partly duplicate the output schema, which costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param mutation with permissions implications, the description covers creation modes, validation behavior, failure semantics, post-creation caveats and related tools. Output schema exists yet the description's return-value hint (keep the id, identifier also accepted) adds routing value rather than pure redundancy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter richly, which sets the baseline at 3. The description largely restates schema content (identifier derivation, status codes, parent permission) rather than adding param-level meaning the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a project') and immediately distinguishes itself from siblings by noting the two-phase form-endpoint validation ('POST /projects/form before committing'). An agent can tell it apart from copy_project or create_work_package without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers the two usage modes (top-level workspace vs. subproject via parent_id) and the cross-references section names the alternatives and their roles — list_projects to find the parent, update_project to change fields afterwards, get_project_metadata to inspect types/versions. It also gives a when-not condition implicitly via the 403 permission caveat.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_versionCreate versionA
Create a version (release, milestone or sprint) inside a project.
Use it to open a new sprint or plan a release before assigning work packages to it.
The call goes through POST /versions/form first, so a duplicate name or an
impossible date range comes back as violations naming the attribute instead of an
opaque rejection.
Returns the created version {id, name, project, status, start_date, end_date, description, sharing, source, created_at, updated_at}. The id is what
update_work_package(version=...) and update_version consume.
Pitfalls: end_date is the version's finish date and is written to the API's
endDate field — passing a date here always lands (an older client dropped it
silently). Creating versions needs the 'manage versions' permission in the project,
so a 403 is about the account, not the payload. Versions are per project: sharing is
the only way another project sees this one.
Cross-references: list_versions for what already exists (and for the ids);
update_version to change dates or close it later; list_projects for the
project id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Version name, e.g. 'Sprint 12' or 'Release 2.1'. Must be unique inside the defining project. | |
| status | No | open (default upstream), locked or closed. Locked and closed versions cannot receive new work packages, so create with 'open' unless you are recording history. | |
| sharing | No | Which other projects may use this version: none (default), descendants, hierarchy, tree or system (the whole instance). Use 'descendants' for a release shared with subprojects. | |
| end_date | No | ISO date (YYYY-MM-DD) the version finishes — this is the version's due date, sent as the API's 'endDate'. Omit for none. | |
| project_id | Yes | Numeric id or identifier of the project that will DEFINE the version. Sharing decides which other projects can use it; the defining project cannot be changed afterwards. | |
| start_date | No | ISO date (YYYY-MM-DD) the version starts. Omit for none. | |
| description | No | Markdown description of the version's scope. Omit for none. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| source | No | |
| status | No | |
| project | No | |
| sharing | No | |
| end_date | No | |
| created_at | No | |
| start_date | No | |
| updated_at | No | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write semantics (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the safety profile is covered. The description still adds real value: the POST /versions/form preflight that surfaces 'violations', the 'manage versions' permission and what a 403 means, and the per-project scoping of sharing. That is solid added context beyond the annotations, though return-format detail is already handled by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and then organized into labelled paragraphs (return shape, pitfalls, cross-references), which is easy to scan. It is longer than necessary because the end_date pitfall and return fields are restated in both the description and the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent, open-world write tool with 7 parameters, the description covers permissions, failure semantics (violations vs opaque rejection), scoping rules and follow-up tools. With an output schema present, return values are additionally stated but not required, so nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns an extra point by adding semantics the schema cannot express, such as end_date landing on the API's endDate field after an older client silently dropped it, and that the defining project cannot be changed afterwards. It also repeats some schema content (open vs locked/closed), which caps it below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a version') and immediately disambiguates the resource as 'release, milestone or sprint' inside a project. This distinguishes it cleanly from siblings like list_versions, update_version and delete_version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('open a new sprint or plan a release before assigning work packages') and routes the agent to alternatives: list_versions for existing ids, update_version to change dates or close, list_projects for the project id. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_work_packageCreate work packageA
Create a work package, validated through OpenProject's own form endpoint first.
Use it for new tasks, bugs, subtasks (parent_id) and milestones (date). The form
pre-flight surfaces an invalid status, a missing required custom field or a disallowed
type as structured violations with the allowed values, before anything is written.
Returns the created work package in full detail, including its new id, lock_version
and resolved custom fields.
Pitfalls: type, status and priority take names or ids; versions, assignees and
parents need numeric ids. Custom fields must exist on the schema — check
get_work_package_schema when unsure.
To change it afterwards use update_work_package; to attach a file to an existing work
package use upload_attachment.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO date for a **milestone** (used instead of start_date/due_date). Passing both is rejected locally. | |
| type | Yes | Type name or id ('Task', 'Bug', 'Milestone', or 7). Unknown or ambiguous names fail listing the valid values. | |
| notify | No | Email notifications for this creation. | |
| sprint | No | Numeric sprint id; from list_sprints. Omit to leave unset. | |
| status | No | Status name or numeric id. Omit for the type's default; don't guess. | |
| project | Yes | Numeric project id or identifier (URL slug); from list_projects. | |
| subject | Yes | The title; must not be blank. | |
| version | No | Numeric version id; from get_project_metadata. | |
| assignee | No | Numeric user id ('me' isn't accepted in writes; get_instance_info gives the current user's id). | |
| due_date | No | ISO date (YYYY-MM-DD); not valid on milestones. | |
| priority | No | Priority name or id ('High', 'Normal', or 8). Omit for default. | |
| parent_id | No | Work package id to create this as a child of. | |
| start_date | No | ISO date (YYYY-MM-DD); not valid on milestones. | |
| description | No | Body text in markdown. | |
| responsible | No | Numeric id of the accountable person. | |
| story_points | No | Story points as a non-negative integer. | |
| custom_fields | No | Custom field writes keyed by wire key or display name: {'customField12': 'High'} or {'Severity': 'High'}. List/user/version fields take ids or names. Unknown keys fail listing the valid ones. get_work_package_schema shows what this project/type accepts. | |
| estimated_hours | No | Estimate in hours, decimal (e.g. 7.5). | |
| remaining_hours | No | Remaining work in hours, decimal. | |
| target_versions | No | Target version ids. [] clears; omit to keep defaults. Multiple values need instance support. Mutually exclusive with version. | |
| attachment_paths | No | Paths on the server's machine to attach. Over HTTP they must lie inside OPENPROJECT_MCP_UPLOAD_ROOT, and are refused when it is unset. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| date | No | |
| type | No | |
| notes | No | |
| author | No | |
| parent | No | |
| sprint | No | |
| status | No | |
| project | No | |
| subject | No | |
| version | No | |
| assignee | No | |
| category | No | |
| due_date | No | |
| priority | No | |
| available | No | |
| created_at | No | |
| display_id | No | |
| start_date | No | |
| updated_at | No | |
| description | No | |
| responsible | No | |
| spent_hours | No | |
| lock_version | No | |
| story_points | No | |
| custom_fields | No | |
| project_phase | No | |
| estimated_hours | No | |
| percentage_done | No | |
| remaining_hours | No | |
| target_versions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the mutating, open-world, non-idempotent profile, and the description goes beyond them by disclosing the form pre-flight: invalid status, missing custom fields and disallowed types come back as structured violations with allowed values 'before anything is written', which tells the agent failures are safe. It also warns that unknown custom-field keys fail with the valid list. The gap is that it never states permission/auth requirements, and the return-value sentence partly duplicates the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the pre-flight behavior, then use cases, returns, pitfalls and routing, with a labeled 'Pitfalls' block. Every sentence carries signal except the return-value summary, which restates what the output schema already gives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 21-parameter mutation with an output schema and full annotation coverage, the description supplies what structured data cannot: the validation flow, the name-vs-id convention split, custom-field prerequisites, and the correct sibling to use for updates and attachments. An agent has enough to call this correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description synthesizes a rule the schema only states per-field: 'type, status and priority take names or ids; versions, assignees and parents need numeric ids.' It also directs the agent to get_work_package_schema for custom fields, which is real added meaning for the riskiest parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a work package') and immediately differentiates the flow from a plain write by noting it is validated through OpenProject's form endpoint first. The covered object kinds (tasks, bugs, subtasks via parent_id, milestones via date) let an agent separate this from update_work_package or create_work_package_relation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternatives and the condition that selects them: 'To change it afterwards use update_work_package; to attach a file to an existing work package use upload_attachment.' It also scopes the creation use cases (subtasks need parent_id, milestones use date) so the agent knows which parameters select which behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_work_package_relationCreate work package relationA
Link two work packages (blocks, follows, duplicates, relates, ...).
Use this to record a dependency the schedule or the reader needs to know about: "ship the client layer follows design sign-off", "this duplicates #4321". Returns the created relation with its id, type, reverse_type, both work packages, lag and description.
Pitfalls. OpenProject stores one canonical direction per pair, so the
passive spellings are rewritten on save: creating precedes from A to
B comes back as B follows A, with from_work_package and
to_work_package swapped. That is the same fact, not an error — read
type and reverse_type from the result rather than assuming what
you sent. Only one relation may
exist between two work packages: a second one answers 409 conflict, and
changing it means update_work_package_relation on the existing id. A
relation that would close a scheduling cycle is rejected with a
validation error. Creating a follows relation can move dates, since
OpenProject reschedules the successor.
Cross-references: get_work_package(include=['relations']) lists what
a work package is already linked to and produces relation ids;
update_work_package_relation edits one;
delete_work_package_relation removes it; parent/child hierarchy goes
through update_work_package(parent_id=...).
| Name | Required | Description | Default |
|---|---|---|---|
| lag | No | Working days to keep between the two work packages. Valid only on 'follows' and 'precedes'; passing it with any other type is refused here before the request is sent. | |
| type | Yes | How from_id relates to to_id. 'follows' schedules from_id after to_id, 'precedes' before it; 'blocks'/'blocked' express dependency without scheduling; 'duplicates'/'duplicated', 'includes'/'partof', 'requires'/'required' come in mirrored pairs; 'relates' is the neutral link. Parent/child hierarchy is NOT a relation — set it with update_work_package(parent_id=...). | |
| to_id | Yes | The other work package. It must be visible to the account and different from from_id. | |
| from_id | Yes | Work package the relation is read from — 'type' describes what this one does to the other. Ids come from search_work_packages or list_work_packages. | |
| description | No | Optional note explaining why the two work packages are linked. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| lag | No | |
| type | No | |
| description | No | |
| reverse_type | No | |
| to_work_package | No | |
| from_work_package | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: canonical direction rewriting on save (precedes A→B returns as B follows A with swapped from/to), single-relation-per-pair with a 409 on the second attempt, cycle rejection as a validation error, and the date-rescheduling side effect of follows. The only gap is that it doesn't say what permissions/visibility the account needs beyond 'must be visible to the account' in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then a labelled Pitfalls block and a Cross-references block, so the agent can skim to what it needs. Slightly long and repeats the hierarchy warning in both the description body and the type parameter, but each section carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description states the return payload (id, type, reverse_type, both work packages, lag, description) even though an output schema exists, and covers the three failure modes (409 duplicate, cycle validation error, direction rewriting) an agent must handle. Nothing needed to call this correctly for a 5-parameter mutation tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns extra by explaining that the returned from/to and type may not match what was sent, which changes how an agent should interpret from_id/to_id/type together. The lag constraint and enum meanings are already fully in the schema, so it does not restate them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource and enumerates the relation kinds (blocks, follows, duplicates, relates), then states the intent: recording a dependency the schedule or reader needs. It is clearly separable from siblings like update_work_package_relation and update_work_package (parent/child) without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('to record a dependency the schedule or the reader needs to know about') with concrete example sentences, and routes the agent elsewhere where appropriate: get_work_package(include=['relations']) to discover existing links, update_work_package_relation to change one, delete_work_package_relation to remove, update_work_package(parent_id=...) for hierarchy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_attachmentDelete attachmentADestructive
Permanently delete one attached file from OpenProject.
Use it only on explicit user instruction, for example to remove a file uploaded to the wrong work package or a superseded document. The attachment's metadata is read first so the result names the file and the container it was attached to, and so an unknown id fails before anything is removed.
Returns the attachment id, the file name, its container and a confirmation message.
Pitfalls: this deletes the file itself, not a link to it — every work package, wiki page or comment that embedded it loses the image or download. Deleting needs edit permission on the container (or authorship for a file that has no container yet), so a 403 can follow a successful read. A 404 means the id is unknown or already deleted; a second call on the same id answers 404 rather than succeeding. Removing a file does not remove the comment or work package that referenced it.
Related: list_attachments shows the ids and file names of everything a container holds; upload_attachment adds a replacement; download_attachment saves a copy first if the bytes are still wanted.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true. Ask the user to confirm first: OpenProject offers no undo and no trash. Calling with confirm=false returns a confirmation_required error and nothing is read or deleted. | |
| attachment_id | Yes | Numeric attachment id from list_attachments or get_work_package(include=['attachments']). Never a work package or container id — deleting the wrong id cannot be undone. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes | |
| message | Yes | |
| container | No | |
| file_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint/idempotentHint) by explaining that metadata is read before deletion so unknown ids fail first, that deletion needs edit permission (403 can follow a successful read), and that a repeat call returns 404 rather than succeeding. It also discloses the true blast radius — embedded references lose the file, and removing a file does not remove referencing comments or work packages.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and usage, then organized into return values, pitfalls, and related tools — every section is scannable. It is on the long side, but the sentences carry distinct, non-redundant information rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with an output schema, the description covers what an agent needs: preconditions, error semantics, irreversibility, permission requirements, and the correct sibling tools. No critical decision-relevant gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both params are described there, so the baseline is 3. The description earns extra credit by clarifying the confirm-gate behavior pattern (confirmation_required, nothing read or deleted) and warning that attachment_id is never a container or work package id, matching the irreversible consequence.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Permanently delete') and resource ('one attached file from OpenProject'), with the scope narrowed to a single file. It is clearly distinguishable from siblings like delete_work_package or delete_project, and the 'Related' section reinforces the boundary against list/download/upload_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use it ('only on explicit user instruction') and gives concrete examples (wrong work package upload, superseded document). It names alternatives and their conditions: list_attachments to discover ids, upload_attachment for a replacement, download_attachment to preserve bytes first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_projectDelete projectADestructive
Schedule the permanent deletion of a project and everything inside it.
Use only on an explicit, specific instruction. Deletion CASCADES: every subproject,
work package, comment, attachment, time entry, version, wiki page and membership of
this project goes with it, and OpenProject offers no API-side undo. If the goal is
only to get the project out of the way, update_project(active=false) archives it
instead — reversible, and it preserves the data.
Deletion is ASYNCHRONOUS upstream: OpenProject accepts the request and runs it as a
background job. This tool therefore returns {scheduled: true, job_id, message},
never a claim that the project is already gone — for a large project the data
disappears over minutes and get_project may still answer during that window.
Pitfalls: deleting normally requires admin rights (403 otherwise). A 404 means the
id or identifier is wrong, or the project was already deleted. Because the work runs
in the background, a later failure inside the job is not visible here; confirm with
get_project (it should eventually 404) rather than assuming success.
Cross-references: get_project to check what you are about to destroy;
list_projects(parent_id=...) to see the subprojects that would go with it;
update_project(active=false) for the reversible alternative.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true. Ask the user to confirm first: this is irreversible and cascades. Calling with confirm=false returns a confirmation_required error and deletes nothing. | |
| id_or_identifier | Yes | Numeric project id or URL identifier of the project to destroy. Read it back with get_project first and show the user the name — an identifier typo can point at a different project. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| job_id | No | |
| message | Yes | |
| scheduled | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive annotations, it discloses the cascade of everything destroyed, lack of API-side undo, asynchronous background execution, return shape, admin-rights requirement, and how to verify eventual completion. This is exactly the kind of behavioral context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite its length, the description is front-loaded and organized into distinct, useful parts: core action, usage restriction, cascade warning, async behavior, pitfalls, and cross-references. Every paragraph earns its place for a high-risk destructive operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, a complete input schema, and an output schema, the remaining burden is behavioral and operational clarity. The description supplies the cascade, async caveat, permissions, error meanings, and verification path, making it complete for correct agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and both parameters already have detailed schema descriptions covering confirmation and ID/identifier risks. The tool description reinforces safe usage but does not add parameter mechanics beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: permanent deletion of a project and everything inside it. It distinguishes this from the reversible archive alternative, `update_project(active=false)`, and from read-only preparation tools such as `get_project`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('Use only on an explicit, specific instruction') and names the safer alternative with its condition. It also points to `get_project` and `list_projects(parent_id=...)` for pre-deletion checks, leaving little ambiguity for an agent choosing among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_time_entryDelete time entryADestructive
Permanently delete a logged time entry.
Use only on explicit user instruction, and only for genuinely wrong entries. Deletion removes the booked hours from every cost report and from the work package's aggregated spent time, with no API-side undo.
Returns a small confirmation object once OpenProject accepts the deletion.
Pitfalls. If the entry is merely on the wrong day, has the wrong
duration or the wrong activity, update_time_entry is the better
answer — it keeps the audit trail. Deleting someone else's entry needs
an administrative permission and otherwise fails with
permission_denied. Entries inside a closed cost-reporting period
cannot be deleted.
Cross-references: find the id with list_time_entries; correct
instead of deleting with update_time_entry.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true. Ask the user to confirm first — the API offers no undo. Calling with confirm=false returns a confirmation_required error rather than deleting anything. | |
| time_entry_id | Yes | Id of the time entry to delete permanently. It comes from list_time_entries — confirm the id belongs to the entry you mean before calling, since ids are not human-readable. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, so the baseline is met; the description goes further by spelling out the downstream effect (hours removed from every cost report and the work package's aggregated spent time) and the absence of any API-side undo. It also discloses the permission requirement and the resulting permission_denied failure, which annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operative verb and the caution, then grouped into pitfalls and cross-references, which is easy to scan. It loses a point for mild redundancy: the find-the-id and prefer-update guidance appears in both the pitfalls paragraph and the cross-references line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive mutation with an output schema and full annotation coverage, the description covers safety, prerequisites, failure modes and alternatives. Nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters including the confirm gate and the id-provenance note are fully documented in the schema. The description never mentions confirm directly and only echoes the list_time_entries id provenance already in the schema, so it adds little beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a logged time entry') with the permanence baked into the first sentence. Cross-references to update_time_entry and list_time_entries make the boundary against siblings explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('only on explicit user instruction, and only for genuinely wrong entries') and names the correct alternative for the common near-miss case (wrong day/duration/activity → update_time_entry). Also states the case where it will fail outright (closed cost-reporting period).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_versionDelete versionADestructive
Permanently delete a version.
Use it only for a version created by mistake. For a finished release or sprint,
update_version(status='closed') is almost always the right answer: it keeps the
history and stops new assignments.
Returns a small confirmation once OpenProject accepts the deletion. Work packages are NOT deleted — they simply lose their version — but that only happens on instances that allow the deletion at all.
Pitfalls: OpenProject refuses (422) to delete a version that work packages still reference; the error hint explains how to find them. Deleting a shared version affects every project that used it. The 'manage versions' permission is required, so a 403 is about the account.
Cross-references: list_versions for the id; update_version(status='closed')
for the reversible alternative; list_work_packages to find what still points at
the version before removing it.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true. Ask the user first: there is no undo. Calling with confirm=false returns a confirmation_required error and deletes nothing. | |
| version_id | Yes | Numeric version id to delete. Read it back with list_versions first — version names repeat across projects, ids do not. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, and the description adds substantial context beyond that: work packages survive but lose their version, deletion may be disallowed per instance, 422 when work packages still reference it, 403 means a permission problem, and shared versions affect every project. This is well past the bar set by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then organized into labeled sections (Pitfalls, Cross-references) that an agent can scan. Slightly long, and the sentence about the return value is redundant given an output schema exists, but nothing is wasted in substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation, the description covers the safety gate, the failure modes with status codes, the permission requirement, and the blast radius on shared versions. An output schema handles returns, so nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters already document themselves, including the confirm=false safety behavior. The description reinforces where to obtain version_id ('list_versions for the id') but adds no syntax or format meaning the schema lacks, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Permanently delete') and resource ('a version'), with the permanence qualifier front-loaded. It immediately distinguishes itself from update_version, which the description frames as the normal path for closed releases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit inclusion criterion ('only for a version created by mistake') and a named alternative with the exact call signature: ``update_version(status='closed')`` is 'almost always the right answer'. The tradeoff (keeps history, stops new assignments) is spelled out so the choice is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_work_packageDelete work packageADestructive
Permanently delete a work package and everything attached to it.
Use only on explicit user instruction. Deletion removes the work package with its comments, attachments, time entries and relations, and OpenProject offers no API-side undo.
Returns a small confirmation object once OpenProject accepts the deletion.
Pitfalls: children are not deleted with the parent, so check
get_work_package(id, include=['children']) first and decide what happens to them. If you
only want the work package out of the way, update_work_package(id, status=<a closed status>) is almost always the better answer — get_project_metadata lists which statuses
this instance treats as closed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Work package id to delete permanently. | |
| confirm | No | Must be true. Ask the user to confirm first — the API offers no undo. Calling with confirm=false returns a confirmation_required error rather than deleting anything. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent, but the description goes well beyond them: it enumerates exactly what is destroyed (comments, attachments, time entries, relations), states there is no API-side undo, discloses the confirm-gate behavior, and warns that children are not cascaded. That last point is the kind of non-obvious behavior an agent cannot infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the safety gate, then organized into clearly labeled paragraphs (deletion scope, return, pitfalls/alternatives). The only near-waste is the sentence describing the returned confirmation object, which duplicates what the output schema already provides.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-parameter mutation tool with an output schema, everything an agent needs is present: cascade scope, irreversibility, confirmation requirement, the children caveat, and a recommended safer alternative. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already well documented, including the confirm=false failure mode — baseline would be 3. The description adds a small amount of extra framing by tying the child-check to the id argument and reinforcing the irreversibility rationale behind confirm, but it does not introduce new parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus the key qualifier ("Permanently delete a work package and everything attached to it"), which is immediately distinguishable from siblings like delete_work_package_relation or delete_project. The scope of the deletion is stated up front rather than buried.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gates usage ("Use only on explicit user instruction") and names concrete alternatives with the condition that selects them: update_work_package with a closed status to get the item out of the way, and get_project_metadata to discover which statuses count as closed. It also tells the agent to check for children first via get_work_package, which is a genuine when-to-do-this-before rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_work_package_relationDelete work package relationADestructive
Remove the link between two work packages.
Use it when a dependency no longer holds. Neither work package is touched, only the relation between them. Returns a small confirmation object.
Pitfalls. Deleting a follows relation drops the scheduling
constraint, so OpenProject may reschedule the work package that was
waiting. There is no undo; recreating the relation with
create_work_package_relation is the only way back. A second delete
of the same id answers 404. Parent/child hierarchy is not a relation —
clear it with update_work_package(parent_id=null).
Cross-references: get_work_package(include=['relations']) shows what
would be removed; update_work_package_relation changes a relation
instead of removing it.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true. Ask the user first — the API offers no undo. Calling with confirm=false returns a confirmation_required error and deletes nothing. | |
| relation_id | Yes | Id of the relation to remove permanently. It comes from create_work_package_relation or get_work_package(include=['relations']). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/no-undo implied by annotations: it warns that deleting a ``follows`` relation drops the scheduling constraint and may reschedule the waiting work package, that a repeat delete returns 404, and that recreating via create_work_package_relation is the only recovery path. These are exactly the side effects an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose, then labelled "Pitfalls" and "Cross-references" blocks. Every sentence carries a distinct fact (irreversibility, scheduling impact, 404, hierarchy exception) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and the description still notes a small confirmation object is returned; recovery path, failure mode, and the confirm gate (documented in the schema) are all accounted for. Nothing an agent needs to call this destructive tool safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, but the description adds behavioral semantics for relation_id (a second delete of the same id returns 404), which the schema does not state. Modest but real added value above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Remove) + resource (the link between two work packages), with an immediate scope clarification that neither work package is touched, only the relation. This cleanly separates it from delete_work_package and from update_work_package_relation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ("when a dependency no longer holds") and routes the agent away from adjacent tools: use update_work_package_relation to change rather than remove, use update_work_package(parent_id=null) for hierarchy, and treat missing relations via get_work_package(include=['relations']).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_attachmentDownload attachmentARead-only
Download an attachment's bytes to a file on the machine running this server.
Use it once list_attachments (or get_work_package(include=['attachments'])) has given you an attachment_id. Metadata is read first, then the bytes are streamed to disk in chunks with progress notifications, so a large file neither stalls the call nor buffers in memory.
Returns path, file_name, size_bytes, content_type and the SHA-256 of the bytes (use it to verify or de-duplicate). With return_image=true an image of at most 1 MB comes back as an inline image block as well.
Pitfalls: the file is written on the server's machine, which is the user's machine only in a local (stdio) deployment — tell the user the returned path rather than assuming they can see it. Quarantined attachments fail with attachment_quarantined and are never fetched. An attachment whose virus scan is unfinished answers 401 for everyone except its uploader. Transfers above OPENPROJECT_MCP_MAX_DOWNLOAD_MB (default 100) are refused up front and aborted mid-stream, leaving no partial file. A name collision in the target directory saves as 'name (2).ext' and says so in notes.
Related: list_attachments produces attachment_id; upload_attachment is the reverse direction.
| Name | Required | Description | Default |
|---|---|---|---|
| save_dir | No | Absolute directory to save into; it is created when missing. Defaults to OPENPROJECT_MCP_DOWNLOAD_DIR, and otherwise to an 'openproject-downloads' folder beside the server's working directory. Relative paths are rejected because the server's working directory is not the user's. | |
| return_image | No | Also return the file as an inline image so the model can look at it. Honored only for image/* content of at most 1 MB; otherwise the file is still saved and a note explains why nothing was shown. | |
| attachment_id | Yes | Numeric attachment id from list_attachments or get_work_package(include=['attachments']). Not a work package id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| notes | No | |
| sha256 | Yes | |
| file_name | Yes | |
| size_bytes | Yes | |
| content_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly says the bytes are streamed to disk and that a file is written on the server's machine, which is a filesystem side effect. This directly contradicts the annotation readOnlyHint=true, so despite otherwise rich behavioral detail, the contradiction requires a score of 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the core action and then organized into scoped paragraphs for return values, pitfalls, and related tools. Despite its length, every sentence adds operational value for a download tool with several failure modes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, and the description still adds important context: returned fields, SHA-256 verification, progress notifications, size limits, partial-file behavior, and path visibility caveats. It gives an agent everything needed to call the tool correctly, apart from the annotation mismatch noted above.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters. The description still adds useful semantics beyond the schema, especially return_image's 1 MB inline-image limit, attachment_id provenance, and target-directory collision behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: downloading an attachment's bytes to a file. It names how to obtain attachment_id via list_attachments or get_work_package(include=['attachments']), and explicitly distinguishes the operation from upload_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite clearly and places the tool relative to siblings: use list_attachments first, upload_attachment is the reverse direction. It also gives detailed when-not and failure conditions, including quarantined attachments, unfinished virus scans, size limits, and path collisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_work_package_commentEdit work package commentAIdempotent
Rewrite the text of an existing work-package comment.
Use this to fix a typo, correct a wrong statement, or extend a note you
just posted. Returns the updated journal entry (activity id, author,
markdown text, internal flag, timestamps) in the same shape
list_work_package_comments returns.
Pitfalls. Only comment entries are editable: the journal also holds field-change entries ("Status changed from New to In progress"), which OpenProject records automatically and refuses to alter — this tool rejects those locally, before any write. Editing needs the edit-work-package-comments permission (or edit-own for your own comments); a 403 means the account may read the thread but not rewrite it. The edit replaces the text entirely and OpenProject keeps no API-visible history of the previous version, so do not use it to "undo" — post a correcting comment when the record matters. Editing does not notify anyone.
Cross-references: read the thread and get activity ids with
list_work_package_comments; post a new comment with
add_work_package_comment; change fields (status, assignee, dates)
with update_work_package instead of describing them in prose.
| Name | Required | Description | Default |
|---|---|---|---|
| comment | Yes | The replacement body in markdown. It replaces the whole comment — there is no append mode, so read the current text first if you mean to add to it. @-mentions need OpenProject's mention syntax; plain names notify nobody. | |
| activity_id | Yes | Id of the journal entry to rewrite. It comes from list_work_package_comments (the 'id' of an entry with kind='comment') or from add_work_package_comment's result. It is an activity id, not a work package id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| kind | Yes | |
| author | No | |
| comment | No | |
| details | No | |
| version | No | |
| internal | No | |
| truncated | No | |
| created_at | No | |
| updated_at | No | |
| work_package | No | |
| comment_length | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: only comment journal entries are editable, field-change entries are rejected locally before any write, permission requirements produce 403s, the edit replaces all text with no API-visible history, and no notifications are sent. These are exactly the mutation risks an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then useful pitfalls and cross-references. It is somewhat long, but nearly every sentence carries operational value; minor redundancy with the schema prevents a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a write operation with an output schema, permissions concerns, local rejection behavior, and alternatives, the description covers all the key decision and safety information an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already well documented. The description reinforces replacement semantics and activity-id sourcing, but does not add meaning beyond the schema's own parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: rewrite the text of an existing work-package comment. It distinguishes the tool from add_work_package_comment, list_work_package_comments, and update_work_package both in the opening line and cross-references.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to use it (fix typo, correct statement, extend a note) and when not to use it (field-change entries, undo via rewrite, field updates that belong in update_work_package). It also provides the read/add/update alternatives by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enable_tool_groupEnable tool groupARead-onlyIdempotent
Re-enable a tool group hidden by OPENPROJECT_MCP_PROFILE=core, for this session.
Use it when the user needs meetings, wiki, news, documents, budgets, git activity or reporting and those tools are not in your list. It never calls OpenProject.
Returns {group, title, status, tools_enabled, notes}; status is 'enabled' or
'already_visible'. Afterwards the server sends tools/list_changed: re-read your tool
list before calling the new tools.
Pitfalls: it only lifts the core profile. It cannot override read-only mode (write
tools stay hidden, see notes), the admin gate, or groups the operator removed with
OPENPROJECT_MCP_DISABLE, which fail with invalid_input. Other sessions are unaffected.
Cross-references: get_instance_info shows which modules this instance supports.
| Name | Required | Description | Default |
|---|---|---|---|
| group | Yes | The group tag to bring back, one of: attachments, budgets, documents, git_activity, meetings, meetings_recurring, metadata, news, notifications, people, projects, queries, reporting, time_entries, versions, wiki, work_packages, wp_collaboration. Under OPENPROJECT_MCP_PROFILE=core the hidden ones are meetings, meetings_recurring, news, documents, wiki, budgets, git_activity and reporting; 'meetings' includes the recurring-meeting tools. |
Output Schema
| Name | Required | Description |
|---|---|---|
| group | Yes | |
| notes | No | |
| title | Yes | |
| status | Yes | |
| tools_enabled | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/idempotentHint already declaring safety, the description adds real behavioral context beyond annotations: it never calls OpenProject, it returns a specific object, it triggers tools/list_changed so the agent must re-read its tool list, and it fails with invalid_input for operator-removed groups. The 'already_visible' status is consistent with idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and trigger, then cleanly separated into returns, side effects, and pitfalls. Dense but nearly every clause carries operational information; the group list in both description and schema is mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still names the returned fields and status values, and it covers session scope, side effects, and failure modes. Nothing an agent needs to invoke and recover from this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema description already enumerates the accepted group tags and which are hidden under the core profile, including the 'meetings includes recurring' note. The description restates but adds no syntax or selection guidance beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Re-enable a tool group hidden by OPENPROJECT_MCP_PROFILE=core') with scope limited to the session, which no sibling tool covers. An agent can distinguish it from the listing/permission siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition ('when the user needs meetings, wiki, news, documents, budgets, git activity or reporting and those tools are not in your list') plus exclusions (cannot override read-only mode, admin gate, operator-disabled groups). It also cross-references get_instance_info for capability discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_custom_actionExecute custom actionA
Run an instance-defined one-click action on a work package.
Custom actions are shortcuts an administrator configured — "Accept and
assign to me", "Reject", "Move to review" — that apply several field
changes at once, sometimes under conditions (role, status, project).
Use one when get_work_package(include=['custom_actions']) offers it,
instead of reproducing its effects field by field. Returns the updated
work package row (subject, type, status, priority, assignee, project,
dates, percentage_done, updated_at).
Pitfalls. The action decides what changes; this tool cannot influence it,
and OpenProject does not report which fields it touched — compare the
returned row with what you read before, or call get_work_package
again for the full detail (including the new lock_version for your
next update). Availability is per work package: an action listed on one
ticket may 403 on another because its conditions no longer hold, and a
422 usually means the resulting work package would be invalid (a
required field the action leaves empty). Writes are never retried
automatically — a conflict comes back with the fresh lock_version so
you can re-read and decide.
Cross-references: get_work_package(include=['custom_actions'])
produces the ids and says which are available right now;
update_work_package is the explicit alternative when you know exactly
which fields to set; list_work_package_comments shows what the action
recorded in the journal.
| Name | Required | Description | Default |
|---|---|---|---|
| lock_version | No | The work package's current lockVersion, from get_work_package. Omit it and the current value is read first — safe, one extra request. A stale value returns a conflict carrying the fresh one. | |
| work_package_id | Yes | Work package to run the action on. It must be the one the action was listed for; conditions are re-checked server-side. | |
| custom_action_id | Yes | Id of the custom action to run. Get it from get_work_package(id=..., include=['custom_actions']), which lists the actions this instance defines AND this work package currently qualifies for — the names are instance-specific, so never guess an id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| type | No | |
| status | No | |
| project | No | |
| subject | No | |
| assignee | No | |
| due_date | No | |
| priority | No | |
| display_id | No | |
| start_date | No | |
| updated_at | No | |
| percentage_done | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: the action itself decides which fields change, the server does not report touched fields, and callers should compare the returned row or re-fetch. It also explains likely 403/422 outcomes, that writes are not auto-retried, and that conflicts return a fresh ``lock_version``.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite its length, the description is front-loaded, paragraph-structured, and each section earns its place: purpose, usage, return shape, pitfalls, and cross-references. There is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent write with an output schema and detailed annotations, the description supplies the operational caveats an agent needs: action availability, server-side conditions, conflict handling, and field-change opacity. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter meanings are already fully documented in the schema. The description reinforces that ``custom_action_id`` must come from ``get_work_package`` and that availability is per work package, but does not add much parameter-specific detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Run an instance-defined one-click action on a work package." It also distinguishes the tool from siblings by naming ``update_work_package`` as the explicit field-by-field alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use guidance: use it when ``get_work_package(include=['custom_actions'])`` offers the action rather than reproducing its effects manually. It also names the alternative ``update_work_package`` for cases where the exact fields are known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_instance_infoGet instance infoARead-onlyIdempotent
Check the OpenProject connection and report what this instance supports.
Call this first when anything fails in an unexplained way, when the user asks "am I connected / who am I", or before using a version-gated parameter. It is the server's connection test: it authenticates on every call rather than answering from cache.
Returns the core version and instance name, the attachment size ceiling
(maximum_attachment_file_size_bytes), the page sizes the instance offers, the
authenticated user {id, name, login, admin}, and features — the probe result
telling you whether internal comments, emoji reactions and project favorites exist
here, and which time-entry filter spelling this version uses.
Pitfalls: features describes the server version, not this user's permissions —
a supported feature can still 403. A failure here is the actionable one: 401 means
the API key is wrong or revoked, a network error means the URL, DNS, proxy or TLS
trust is wrong; both come back with a hint naming the environment variable to fix.
For per-project ids (types, statuses, priorities, versions, categories, activities)
use get_project_metadata; for what the current user may do use list_permissions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| api_url | No | |
| features | Yes | |
| core_version | No | |
| current_user | Yes | |
| instance_name | No | |
| per_page_options | No | |
| maximum_attachment_file_size_bytes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only/idempotent profile; the description adds far more — that every call actually authenticates instead of answering from cache, what fields come back (attachment ceiling, page sizes, authenticated user, feature probes), and that `features` reflects server version, not the caller's permissions. It even maps failure modes (401 = bad/revoked key, network error = URL/DNS/proxy/TLS) to hints naming the environment variable, which is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the usage trigger, then the return summary, then a labeled 'Pitfalls' block, then sibling routing. Despite its length, each paragraph carries a distinct, non-repeated payload (triggers, outputs, failure meanings, alternatives), so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param diagnostic tool with an output schema, this is complete: it covers when to call, what is returned, how to interpret the feature probes, and how to diagnose failures. An agent needs nothing else to invoke it correctly or act on the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4 and there are no parameter semantics to add. The description does characterize the return payload (instance name, version, feature probes), which is useful but partially redundant given an output schema exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: checks the OpenProject connection and reports what the instance supports. It explicitly delineates scope against siblings by routing per-project metadata to `get_project_metadata` and user capabilities to `list_permissions`, so an agent can place it precisely in the tool set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers: call first on unexplained failures, when the user asks 'am I connected / who am I', and before using a version-gated parameter. It also names the alternatives for adjacent needs, which covers the when-not cases by redirection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_statusGet background job statusARead-onlyIdempotent
Check whether a background job (a project copy, a scheduled deletion) has finished.
OpenProject runs copies, deletions and exports asynchronously and hands back a job id.
This is the only way to learn what happened to one: call it after copy_project or
delete_project and wait for a terminal state before reporting an outcome to the
user.
Returns {id, status, finished, successful, message, project, result_url, notes}.
status is 'in_queue' or 'in_process' while the job runs and 'success', 'failure',
'error' or 'cancelled' once it is over; finished and successful are derived
from it, and successful stays null while the job runs rather than defaulting to
false. A finished copy reports the new project in project and the URL it lives at
in result_url.
Pitfalls: a 200 does not mean the job worked — read status. Polling is on you:
wait a few seconds between calls rather than looping tightly. OpenProject drops job
statuses after a while, so a 404 can mean 'long finished' as easily as 'wrong id';
confirm with get_project or list_projects. When a job fails, message is
what OpenProject recorded — there is no API to retry it, so the underlying tool has to
be called again deliberately.
Cross-references: copy_project and delete_project produce the job_id;
get_project / list_projects verify what the job actually did.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Background job id — a uuid such as '9f4c1d5e-0e2a-4f2b-9a11-2f1b3c4d5e6f'. It comes from copy_project or delete_project ('job_id' in their results), never from a project id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| notes | No | |
| status | No | |
| message | No | |
| project | No | |
| finished | Yes | |
| result_url | No | |
| successful | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, but the description adds substantial beyond-schema context: 200 does not guarantee success, status values and null semantics, polling expectations, stale-job 404 ambiguity, and the absence of a retry API. These are exactly the behavioral traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence states the purpose, then separate 'Returns', 'Pitfalls', and 'Cross-references' sections organize the necessary detail. Despite being longer than average, every sentence earns its place for an asynchronous status tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, but the description still covers terminal states, null semantics for successful, result_url/project on finished copies, stale 404 handling, and failure reporting. Nothing material is missing for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains that job_id is a uuid from copy_project or delete_project, never a project id. The description reinforces the origin of the id but does not add parameter format or validation details beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('check whether a background job... has finished') and immediately distinguishes the tool from siblings by tying it to copy_project/delete_project job ids. The agent can tell this is the status-checking tool rather than a project or work-package operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call it after copy_project or delete_project and wait for a terminal state. It also names alternatives for verification (get_project/list_projects) when a 404 occurs, and describes polling behavior rather than leaving it inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectGet projectARead-onlyIdempotent
Read one project in full.
Use it after list_projects when you need the description, the status explanation
or the parent of a specific project — or to verify that an id or identifier a user
gave you actually resolves.
Returns {id, identifier, name, active, public, parent, status_code, workspace_type, description, status_explanation, created_at, updated_at}. Rich
text comes back as markdown raw; html is dropped.
Pitfalls: status_code is one of on_track, at_risk, off_track, not_started,
finished, discontinued — an empty status_code means the project has no status
set, not "on track". A 404 here means the id/identifier is wrong or the project is
archived and invisible to this user; the error hint says which spelling to try next.
For the ids valid inside this project (types, versions, categories, time-entry
activities) call get_project_metadata(project_id=...); for its work packages call
list_work_packages(project=...).
| Name | Required | Description | Default |
|---|---|---|---|
| id_or_identifier | Yes | Numeric project id (e.g. 7) or the URL identifier (e.g. 'demo-project'). Both are accepted; identifiers come from list_projects, and are the slug in /projects/<identifier>, not the display name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| 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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds substance beyond them: rich text is returned as markdown with html dropped, an empty status_code means no status rather than 'on track', and a 404 means a bad id or an archived/invisible project with an error hint. Those are exactly the behavioral traps an agent would otherwise hit at runtime.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose first, then usage, then return shape, then pitfalls, then alternatives. Most sentences earn their place, though the explicit return-field list is somewhat redundant given an output schema exists, and the parenthetical enumerations add bulk.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, trigger conditions, failure mode (404 with hint), field semantics (status_code), and next-step tools, which is more than enough for a single-parameter read tool. Redundancy with the output schema on the return field list is the only, and harmless, excess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the parameter doc already explains the integer-id vs. slug-identifier duality, so the description mostly repeats it. It does add a diagnostic angle by tying a 404 to a wrong id/identifier spelling, but it offers no new syntax or format detail beyond the schema, making baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one project in full') and explicitly contrasts with the sibling list_projects by saying to use it *after* listing. The enumerated return fields further pin down what 'full' means, so an agent can distinguish it from list_projects, update_project, or get_project_metadata without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ('after list_projects when you need the description, the status explanation or the parent') plus a second use case (resolving an id/identifier a user supplied). It also routes to the correct alternatives: get_project_metadata for ids valid inside the project and list_work_packages for work packages, so the agent knows when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_metadataGet project metadataARead-onlyIdempotent
List the ids and names that are actually valid on this instance.
This is the one-call answer to "what do I pass for type / status / priority / version / category / activity". Call it before any create or update, before filtering by ids, and whenever a write fails with an allowed-values error. Nothing here is hardcoded — priority ids and activity ids differ per instance.
Without project_id returns the global types, statuses, priorities and
roles. With project_id the types list narrows to the ones enabled in that
project and versions, categories and time_entry_activities are filled in.
Every row is {id, name} plus its flags: statuses[].is_closed is the
authoritative done marker (never classify by status name — it is localized),
types[].is_milestone tells you the type takes a single date, and
priorities[].is_default / time_entry_activities[].is_default say what you get
by omitting the field.
Pitfalls: results are cached (default 300 s) — pass refresh=true after an admin
change. Time-entry activities are read from the time-entry form, so if the time
tracking module is off or you lack permission the list comes back empty with a note
in notes rather than an error (check notes).
For the writable fields and custom fields of one project+type combination use
get_work_package_schema; for project ids themselves use list_projects.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | Bypass the metadata cache. Use it right after an administrator added a type, status, version or category; otherwise leave it false. | |
| project_id | No | Numeric project id or URL identifier. Omit for the instance-global sets (types, statuses, priorities, roles) — cross-project filtering never needs an arbitrary project. Supply it to additionally get this project's types, versions, categories and time-entry activities. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | No | |
| roles | No | |
| types | No | |
| statuses | No | |
| versions | No | |
| categories | No | |
| priorities | No | |
| project_id | No | |
| time_entry_activities | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the 300 s cache and the refresh escape hatch, the conditional shape of the result depending on project_id, the per-row flag semantics (is_closed as the authoritative done marker, is_milestone, is_default), and the non-obvious failure mode where a missing module or permission yields an empty list with a note rather than an error. That last point is exactly the kind of silent-success caveat annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the call-now instruction, then payload shape, then pitfalls, then sibling routing — a sensible order with no filler sentences. It loses a point for restating the project_id conditional that the schema description already covers, which is the one block that does not fully earn its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs before invoking a zero-required-parameter metadata lookup: when to call it, what the payload differs by, how to read the flags, staleness, and the silent-empty failure mode. With an output schema present the description needn't enumerate returns, so its extra detail is bonus rather than padding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns an extra point by spelling out the conditional payload for each parameter value (global sets when project_id is omitted, project-scoped narrowing plus versions/categories/activities when supplied) and by warning that priority and activity ids differ per instance. It does not add format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource (list ids/names valid on this instance) and is reinforced by the concrete question it answers ("what do I pass for type / status / priority / version / category / activity"). It explicitly distinguishes itself from the two nearest siblings, get_work_package_schema and list_projects, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers: before any create or update, before filtering by ids, and on allowed-values write errors. It also states the exclusion boundary — that this tool does not return writable/custom field schemas (use get_work_package_schema) and does not return project ids (use list_projects).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_phaseGet project phaseARead-onlyIdempotent
Read one project's phase record: name, active flag and its definition.
Use it after get_work_package surfaced a project_phase reference and you
need to know which project and definition that phase belongs to, or whether it is
still active.
Returns {id, name, active, definition, project, created_at, updated_at}.
Pitfalls: the API has no phases index — ids only come from work packages'
project_phase references. Phase dates are not exposed by the API (the notes
say so), so "which projects are in this phase now" goes through
list_projects(in_phase=...) instead. A 404 covers a wrong id, a phase invisible
to this user (view_project_phases), and instances that predate project phases
(16.1).
Cross-references: list_project_phase_definitions for the instance-wide catalog
and gates; list_projects(in_phase=...) for date-based phase queries.
| Name | Required | Description | Default |
|---|---|---|---|
| phase_id | Yes | Per-project phase record id, from a work package's project_phase reference. NOT a definition id from list_project_phase_definitions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| notes | No | |
| active | No | |
| project | No | |
| created_at | No | |
| definition | No | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description still adds substantive context: no phases index exists, phase dates are unexposed by the API, and a 404 conflates wrong id, missing permission (view_project_phases), and pre-16.1 instances. That is real behavioral disclosure beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, return shape, pitfalls, cross-references. Well organized with zero filler prose, though the explicit return-field list is somewhat redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single parameter, an output schema, and rich annotations, the remaining risks (where ids come from, what a 404 means, which sibling answers date-based questions) are all covered. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already says it is a per-project phase record id from a work package reference, not a definition id. The description reinforces the sourcing constraint ('ids only come from work packages' project_phase references'), adding marginal value beyond the schema rather than new syntax detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one project's phase record') plus the exact returned fields, and explicitly separates itself from list_project_phase_definitions in Cross-references. An agent can distinguish it from the catalog-listing sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('after get_work_package surfaced a project_phase reference'), names the alternative for the adjacent question ('which projects are in this phase now' goes through list_projects(in_phase=...)'), and explains the 404 conditions. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sprintGet sprintARead-onlyIdempotent
Read one sprint in full: dates, workspace and lifecycle status.
Use it once list_sprints has given you an id and the row is not
enough — this adds created_at/updated_at to the same shape.
Pitfalls: sprint ids and version ids are different id spaces — a
version id from list_versions does not resolve here.
Cross-references: list_sprints for the id; list_work_packages
with sprint_ids for the work planned in this sprint.
| Name | Required | Description | Default |
|---|---|---|---|
| sprint_id | Yes | Numeric sprint id from list_sprints. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| status | No | |
| workspace | No | |
| created_at | No | |
| start_date | No | |
| updated_at | No | |
| description | No | |
| finish_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real context beyond them: the response is the list shape plus created_at/updated_at, and sprint ids live in a different id space than version ids. It stops short of saying what happens on a bad or foreign id, but the added behavioral detail is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, pitfalls, and cross-references in clearly labeled chunks. Every sentence carries information; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description still covers when to call it, what it adds over the list endpoint, the id-space hazard, and follow-on tools. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above baseline by warning that a version id from list_versions will not resolve here, which is semantic guidance the schema's 'Numeric sprint id from list_sprints' only hints at.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one sprint in full') plus the returned facets (dates, workspace, lifecycle status), which lets an agent separate it from list_sprints without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it only after list_sprints has supplied an id and the list row is insufficient, and names cross-references (list_sprints for the id, list_work_packages with sprint_ids for contents). Both the when and the boundaries are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_userGet user detailARead-onlyIdempotent
Read one user's profile: name, login, email, admin flag and status.
Use it after search_principals when you need more than a name — to
confirm an account is active before assigning work, to check whether
somebody is an instance administrator, or to learn which account the
server itself is acting as (id_or_me='me').
Returns {id, name, login, email, admin, status, language, created_at, updated_at}. The avatar URL is deliberately dropped: it costs tokens
and cannot be rendered here.
Pitfalls. email, login and admin are visibility-dependent — a null
means the authenticated account may not see that field, never that the
value is empty. admin=true says nothing about project permissions; use
list_permissions for what the current user may actually do. A group or
placeholder-user id returns 404 from this endpoint; those principals only
appear in search_principals.
Cross-references: search_principals to find the id;
list_memberships(principal_id=...) for the projects and roles this
person holds; get_instance_info also reports the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| id_or_me | Yes | Numeric user id from search_principals, or the literal string 'me' for the account this server authenticates as. Group and placeholder ids are not accepted here — this endpoint serves users only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| admin | No | |
| No | ||
| login | No | |
| status | No | |
| language | No | |
| created_at | No | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only cover read-only/idempotent/no-destroy) by disclosing visibility-dependent field behavior — a null means 'not visible', never 'empty' — that `admin=true` does not imply project permissions, and that group or placeholder ids return 404. These are exactly the traps an agent would otherwise hit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return shape are front-loaded, followed by usage, then a clearly labeled 'Pitfalls' block and cross-references. Every paragraph carries distinct information, including the justification for the deliberately omitted avatar URL, so nothing reads as filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists, the description still previews the return payload and explains the notable omission, then covers the failure mode (404) and permission caveats. For a one-parameter read tool, an agent has everything needed to call it correctly and interpret nulls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is fully documented in the schema, so the baseline is 3. The description adds practical value by explaining the `'me'` sentinel's purpose (learning which account the server authenticates as) and reinforcing that group/placeholder ids are rejected, beyond the schema's wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one user's profile') and enumerates exactly what is returned (name, login, email, admin, status). It is clearly distinguished from the similarly named `search_principals`, which the description explicitly frames as the id-lookup step that precedes this call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the precise trigger ('after search_principals when you need more than a name') and gives three concrete scenarios: confirming an account is active before assigning work, checking instance-admin status, and discovering the acting account via `id_or_me='me'`. It also routes the agent elsewhere for adjacent questions (`list_permissions` for actual capabilities, `list_memberships` for roles).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_work_packageGet work package detailARead-onlyIdempotent
Read one work package in full: description, dates, custom fields, parent and progress.
This is the tool to call once a search or list has given you an id, and the only way to
read a work package's description text. The lock_version in the result is what
update_work_package needs for a safe concurrent edit.
Returns every core field, custom_fields in the canonical
[{key, name, type, value, value_ids}] shape (only fields that have a value), an
available map saying whether this work package exposes dev links, meetings or file
links, and any requested includes.
Pitfalls: includes are capped at 20 — a truncated children list means you should call
list_work_packages(parent_id=…) for the rest, which more_via spells out verbatim. A
sub-resource that 403s or 404s (module off, no permission) degrades into a notes entry
instead of failing the whole read.
For the comment thread use list_work_package_comments; for attachment bytes use
download_attachment; for linked PRs and commits use get_work_package_git_activity.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Work package id — the number shown as #1234 in OpenProject. Comes from search_work_packages or list_work_packages. Instances on 17.x with semantic identifiers enabled also accept the semantic form ('PROJ-42', the row's display_id). | |
| include | No | Extra sub-resources, fetched concurrently: 'relations', 'watchers', 'attachments', 'children', 'custom_actions'. Each is capped at 20 items and reports {truncated, total, more_via} when there are more. Ask only for what you need — every include is one more upstream request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| date | No | |
| type | No | |
| notes | No | |
| author | No | |
| parent | No | |
| sprint | No | |
| status | No | |
| project | No | |
| subject | No | |
| version | No | |
| assignee | No | |
| category | No | |
| children | No | |
| due_date | No | |
| priority | No | |
| watchers | No | |
| available | No | |
| relations | No | |
| created_at | No | |
| display_id | No | |
| start_date | No | |
| updated_at | No | |
| attachments | No | |
| description | No | |
| responsible | No | |
| spent_hours | No | |
| lock_version | No | |
| story_points | No | |
| custom_fields | No | |
| project_phase | No | |
| custom_actions | No | |
| estimated_hours | No | |
| percentage_done | No | |
| remaining_hours | No | |
| target_versions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), yet the description adds substantial non-obvious behavior: lock_version is required for safe concurrent updates, includes are capped at 20 with more_via reporting, and a 403/404 sub-resource degrades into a notes entry rather than failing the read. These are exactly the traits an agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then usage, then return shape, then pitfalls, ending with sibling routing. Despite its length, each sentence carries distinct operational information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with a rich output schema and full annotation coverage, nothing an agent needs to invoke it correctly is missing — parameter limits, failure degradation, follow-up tools, and the update handoff are all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond it — the per-include 20-item cap, the truncation signal, and the cost model ('every include is one more upstream request'). The id semantics (semantic 'PROJ-42' form) are already in the schema, so no extra credit there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource plus scope: 'Read one work package in full: description, dates, custom fields, parent and progress.' It explicitly separates itself from list/search siblings and notes it is the only way to read description text, which is not obvious from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the entry condition precisely ('once a search or list has given you an id') and routes three adjacent needs to their dedicated tools: list_work_package_comments for threads, download_attachment for bytes, get_work_package_git_activity for PRs/commits. Also names the recovery path (list_work_packages(parent_id=…)) when children truncate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_work_package_schemaGet work package schemaARead-onlyIdempotent
Show which fields a work package of this type accepts in this project.
Call it before create_work_package/update_work_package when you need the
required fields, when you want a custom field's key or its allowed options, or after
a 422 that named a field you do not recognise.
Returns required_fields (writable keys you must supply), fields — every core
attribute with {key, name, type, required, writable, has_default, allowed_values}
— and custom_fields with {key, name, type, required, writable, options}.
allowed_values/options are {id, name} lists for status, category, version
and list/user custom fields.
Pitfalls: key is the wire spelling (startDate, customField12) — that is
what raw_filters and custom_fields writes use, though writes also accept the
display name. A field with writable: false is computed by OpenProject; sending it
is an error, not a no-op. allowed_values is null when the API only offers a lookup
URL (assignee, project) — resolve those with search_principals or list_projects
instead. Long option lists are capped at 50 with a marker in notes.
Ids for both parameters come from get_project_metadata; to read the values
actually set on one work package use get_work_package.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | Bypass the cache after an administrator changed the type or its custom fields. | |
| type_id | Yes | Numeric work-package type id from get_project_metadata(project_id=...).types — not the type name. | |
| project_id | Yes | Numeric project id — this endpoint does not accept the string identifier. The schema is per project AND type: the same type carries different custom fields in another project. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | No | |
| fields | No | |
| type_id | Yes | |
| project_id | Yes | |
| custom_fields | No | |
| required_fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses non-obvious behavior: writable:false fields are computed and sending them is an error rather than a no-op, allowed_values is null when the API only gives a lookup URL, and long option lists are capped at 50 with a note. These are exactly the failure modes an agent would otherwise hit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and trigger, then returns, then pitfalls — a good shape. The explicit enumeration of return fields is somewhat redundant with the existing output schema and pads length, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only schema-introspection tool with full schema coverage, rich annotations and an output schema, this covers everything: when to call it, what it returns, what the keys mean on the wire, and which sibling to use when a value cannot be resolved here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds provenance — both ids come from get_project_metadata — and reinforces that the schema is per project AND type. It does not, however, explain the refresh/cache parameter, which is left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus scope: 'Show which fields a work package of this type accepts in this project.' It is immediately distinguishable from get_work_package (which reads values) and from create/update_work_package, which it explicitly precedes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggers: before create/update when you need required fields, when you want a custom field key or its allowed options, or after a 422 naming an unknown field. It also names the alternatives for cases this tool does not cover — get_work_package for actual values, search_principals/list_projects for lookup-URL fields, get_project_metadata for ids.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_attachmentsList attachmentsARead-onlyIdempotent
List the files attached to one container.
Containers are work packages, wiki pages, meetings, documents, budgets and comments. Use this to discover attachment ids before calling download_attachment, or to check what a work package already carries. The upstream collection is not paginated, so it is fetched in full: the envelope always reports has_more=false and a total equal to the row count.
Returns the standard list envelope; each row has id, file_name, size_bytes, content_type, description, author, created_at and status. status is the virus-scan state — 'uploaded' and 'scanned' are downloadable, 'quarantined' files are not, and anything else is still being scanned and is readable only by its uploader.
Pitfalls: container_id identifies the container, not the file. A 404 means the container does not exist or the module providing it (meetings, budgets, documents) is not enabled on this instance. Forum posts are a valid API container but have no discovery path here.
Related: download_attachment fetches the bytes for one row, upload_attachment adds a file to the same containers, and get_work_package(include=['attachments']) returns these rows inline for a single work package.
| Name | Required | Description | Default |
|---|---|---|---|
| container_id | Yes | Numeric id of the container itself: the work package id, wiki page id, meeting id, document id, budget id, or activity id. Never an attachment id. | |
| container_type | Yes | Kind of object that owns the files. Use 'comment' for files attached to a work-package comment — those live on the activity, so pass the activity id from list_work_package_comments as container_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering read-only, idempotent and non-destructive, the description goes further: it discloses that the upstream collection is unpaginated so has_more is always false and total equals row count. It also explains the virus-scan status vocabulary and which values are downloadable, plus what a 404 means.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return shape, then pitfalls, then related tools — a sensible order with no filler sentences. It is on the long side and repeats a little of the schema's comment/activity-id note, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a filtered-list tool it covers calling context (enabled modules, forum-post gap), return semantics (envelope, row fields, status meanings) and adjacent tools. Even though an output schema exists, the extra explanations fill in the gaps an agent would otherwise have to discover at runtime.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, and the description still adds value by emphasizing that container_id is the container and never an attachment id, and by listing which modules (meetings, budgets, documents) can cause a 404. Some of the comment/activity-id guidance duplicates the schema, so it is a notch below fully additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the files attached to one container') and immediately enumerates what a container is. It also contrasts itself with siblings (download_attachment, upload_attachment, get_work_package(include=['attachments'])), so an agent can place it precisely in the tool family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use: discover attachment ids before calling download_attachment, or check what a work package already carries. The Related section names alternatives and what each does differently, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_file_linksList file linksARead-onlyIdempotent
List the external-storage files (Nextcloud, OneDrive/SharePoint) linked to a work package.
File links are OpenProject's other kind of file: instead of living inside OpenProject like an attachment, the document stays in a connected storage and the work package points at it. Use this to answer "which documents belong to this ticket" — and pair it with list_attachments, because the two lists are disjoint and neither implies the other.
Returns the standard list envelope, fetched in full (has_more is always false). Each row carries file_name, the storage it lives on, the file's origin_id inside that storage, mime_type, the creator and — the useful part — open_url and download_url. Those are absolute OpenProject URLs that redirect to the storage once OpenProject has resolved the link, so hand them to the user: they need the user's own OpenProject login, this server cannot fetch the bytes, and download_attachment does not work on them.
Pitfalls: this needs the storages module and a storage connected to the project. When it is missing (404) or this account may not read the links (403) the call still succeeds with an EMPTY list and a note explaining which — read notes before saying a ticket has no documents. An empty list is never proof either: an account lacking the 'view file links' permission gets an empty 200 rather than a 403, which is exactly what that note says. permission carries the storage's own wording — 'View allowed' means the URLs will work, 'View not allowed', 'Not found' and 'Error' mean they will not, and null means the storage said nothing. Creating and deleting file links, and browsing the remote storage, are out of scope for this server — do them in the OpenProject UI.
Related: list_attachments covers files stored inside OpenProject, download_attachment fetches those bytes, and get_work_package gives the ticket the links belong to.
| Name | Required | Description | Default |
|---|---|---|---|
| work_package_id | Yes | Numeric work package id whose linked storage files to list. It comes from search_work_packages, list_work_packages or get_work_package — never an attachment id and never a project id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare a safe read; the description adds substantial non-obvious behavior: 404/403 conditions still return a 200 with an EMPTY list plus a note, empty is never proof of no documents, permission values ('View allowed', 'Not found', null) determine whether URLs work, and returned URLs require the user's own OpenProject login since the server cannot fetch bytes. None of this is inferable from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then the attachments pairing, pitfalls, and related tools in a logical order; the pitfall paragraph is dense but earns its place. It runs longer than needed, and the pitfall about 403/empty lists is stated twice in slightly different words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers prerequisites (storages module, storage connected to project), failure modes, permission semantics and the envelope (has_more always false). Some redundancy with the output schema when enumerating row fields (file_name, mime_type, origin_id), but that enumeration supports the URL caveat, so the detail is justified rather than missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's description already specifies provenance ('from search_work_packages, list_work_packages or get_work_package — never an attachment id and never a project id'). The prose adds no further guidance on work_package_id, so the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the external-storage files ... linked to a work package') and immediately disambiguates the concept from attachments: 'instead of living inside OpenProject like an attachment, the document stays in a connected storage.' An agent can distinguish list_file_links from list_attachments without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to pair with list_attachments because 'the two lists are disjoint and neither implies the other', and names out-of-scope operations (creating/deleting links, browsing remote storage) with a redirect to the UI. It also names the wrong tool to use for bytes (download_attachment does not work here).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_membershipsList project membershipsARead-onlyIdempotent
List who has access to which project, and with which roles.
Use it before granting or revoking access ("does she already have a role here?"), to audit a project's member list, or to see which projects a principal can reach. Called with no arguments it pages through every membership the authenticated account may see, which on a large instance is a lot — filter.
Returns the standard list envelope: items of {id, project, principal {id,name,type}, roles[], created_at, updated_at} plus
pagination{total,page,page_size,has_more}.
Pitfalls. The id in each row is the membership id — the handle for
update_membership and delete_membership — not the principal id and
not the project id; mixing them up revokes the wrong access. A person
can also reach a project through a group membership, so an empty
result for principal_id does not prove they have no access. Memberships
say who may act, not what they may do: roles carry the permissions.
Cross-references: list_roles for role ids and their permissions;
create_membership / update_membership / delete_membership to change
access (admin-gated: hidden unless the server sets
OPENPROJECT_MCP_ADMIN_TOOLS=1); search_principals for principal ids;
list_permissions for what the current user may do.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| page_size | No | Memberships per page, 1-100. | |
| project_id | No | Only memberships in this project. Numeric id or the URL identifier (an identifier costs one extra lookup). Combine with principal_id to check one person's roles in one project. | |
| principal_id | No | Only memberships held by this principal — a user, group or placeholder-user id from search_principals. Use it to answer 'which projects can this person see'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds genuinely new behavioral context: the return envelope shape, the pitfall that row `id` is a membership id (mixing it up revokes the wrong access), that group memberships can mask access, and that admin tools are gated behind an env flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then usage, return shape, pitfalls, and cross-references in clearly labeled blocks. Every section is useful, though the return-envelope paragraph is somewhat long given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs: when to call, what comes back, the id-confusion trap, the group-membership blind spot, and the role-vs-permission distinction. A mutation-adjacent read tool with this much nuance is fully described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already documents its id semantics and cross-references search_principals. The description's 'filter' advice and the project_id+principal_id combination are already present in the schema, so it adds little beyond baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List who has access to which project, and with which roles') and immediately clarifies the scope (membership, not permissions). It is clearly distinguishable from sibling read tools like list_projects or list_roles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use cases are given (pre-grant/revoke checks, auditing, reachability), plus a warning that an unfiltered call pages through everything and should be filtered. Alternatives are named for role ids, principal ids, and mutations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notificationsList notificationsARead-onlyIdempotent
Read the authenticated user's OpenProject inbox.
Use this to answer "what needs my attention?", "was I mentioned anywhere?" or "what changed on the things I watch?" — it is the only tool that sees notifications, and it always reports the inbox of the token owner, never another user's.
Returns the standard list envelope: items of {id, reason, read, created_at, actor, project, resource} plus pagination with
total/page/page_size/has_more. resource is the thing
the notification is about — {id, type, title}, usually
type='WorkPackage', so resource.id feeds straight into
get_work_package or list_work_package_comments.
Pitfalls. Several changes to the same work package are aggregated into
one notification, so the count is not a count of events. Reading a
notification here does not mark it read — that is
mark_notifications. unread_only=false can return a very long
history; keep a page size that fits your reply. A notification whose
project the token owner has lost access to disappears from the inbox
entirely.
Cross-references: mark specific rows read with mark_notifications;
clear the whole (optionally filtered) inbox with
mark_all_notifications_read; open the underlying ticket with
get_work_package(resource.id) and its discussion with
list_work_package_comments(resource.id).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| reason | No | Restrict to one trigger: mentioned, assigned, responsible, watched, subscribed, commented, created, processed, prioritized, scheduled, shared, reminder, dateAlert. 'mentioned' is what answers "who needs me?". dateAlert filtering is an OpenProject Enterprise feature and is rejected with an explanatory hint on Community instances. | |
| page_size | No | Notifications per page (max 100); the instance may clamp it lower and the returned pagination reports what actually came back. | |
| project_id | No | Numeric project id or identifier to scope the inbox to one project. Ids come from list_projects. | |
| unread_only | No | true (default) returns only notifications still unread in the in-app inbox; false returns read and unread together. There is no 'read only' mode — filter the rows on read=false/true yourself if you need one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely non-obvious behavior: reading does not mark a notification read, multiple changes aggregate into one notification so counts aren't event counts, unread_only=false can return a very long history, and notifications for lost-access projects vanish. Only the return-envelope paragraph is redundant with the existing output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded and sectioned (purpose, return, pitfalls, cross-references) with no filler sentences. The cost is that the return-envelope paragraph restates structure the output schema already provides, making it longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param read tool with annotations and an output schema already present, everything an agent needs to call it correctly is covered: who the inbox belongs to, aggregation caveats, pagination behavior, and the follow-up call chain from resource.id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description still adds meaning: it warns that unread_only=false yields a long history and to keep page_size within the reply budget, and it ties resource.id to get_work_package/list_work_package_comments. `reason` and `project_id` semantics live mostly in the schema, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("Read the authenticated user's OpenProject inbox") and immediately scopes it: it is the only tool that sees notifications and always reports the token owner's inbox, never another user's. That differentiates it cleanly from mark_notifications, mark_all_notifications_read, and the work-package readers in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering questions ("what needs my attention?", "was I mentioned anywhere?") plus explicit routing: use mark_notifications for per-row read state, mark_all_notifications_read to clear the inbox, get_work_package(resource.id) to open the ticket. The exclusions and the hand-off chain from resource.id are spelled out rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_permissionsList permissionsARead-onlyIdempotent
List what the authenticated user is allowed to do, globally or in one project.
Use it before attempting a write that might 403, to explain to a user why an action failed, or to pick between tools ("can I add a member here, or should I ask an admin?"). It reads the real capabilities API for the current user — it does not return a user profile and it never guesses from the admin flag.
Returns the standard list envelope whose items are one row per context —
{id, context, project, actions} with actions such as
work_packages/create — plus principal (the user asked about),
capability_count, and check when permission was given.
CAVEAT, straight from the API: OpenProject exposes only a SUBSET of its permissions as capabilities. An action missing from this list is not proof that the user lacks the permission — it may simply not be modelled. Treat a hit as reliable and a miss as "unknown, try it and read the 403".
Pitfalls: the capabilities API has no "me" value, so the numeric id of the
authenticated user is resolved first (from the cached users/me) — you cannot ask
about another user with this tool. Results are capped at 500 capabilities with a note
in notes when the cap is hit; scope with project_id to stay well under it.
Capabilities are about permission only: a permitted action can still fail validation.
Cross-references: get_instance_info reports who this server is authenticated as
and what the instance version supports; list_memberships and list_roles show
where the permissions come from; get_project_metadata lists the ids a permitted
action needs.
| Name | Required | Description | Default |
|---|---|---|---|
| permission | No | Optional single action to check, spelled the way OpenProject does: '<resource>/<action>', e.g. 'work_packages/create', 'memberships/create', 'projects/update'. Adds a {checked, allowed, granted_in} predicate to the result; the full grouped listing is returned either way, so you can see the exact spellings this instance uses. | |
| project_id | No | Numeric project id or URL identifier to scope the question to that project ('may I create work packages HERE'). Omit it for the instance-wide (global) actions such as creating projects or administering users. An identifier is resolved to its numeric id first, because the capabilities API only accepts numeric project ids. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| check | No | |
| items | No | |
| notes | No | |
| groups | No | |
| principal | Yes | |
| pagination | Yes | |
| capability_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds material context beyond that: the capabilities API exposes only a subset of permissions, so a miss means "unknown" rather than "denied"; results cap at 500 with a note; and the implicit user-id resolution from cached users/me. It stops short of describing error shape, but the trust model for hits vs. misses is the important disclosure and it is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but deliberately sectioned — purpose, return shape, caveat, pitfalls, cross-references — with the core statement front-loaded and no filler sentences. The density is justified by real caveats, though it is heavier than strictly necessary for a two-parameter read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and the description still sketches the envelope (items, principal, capability_count, check) enough to orient the agent. Combined with annotations covering safety, the description leaves no gap that would cause a wrong invocation or a wrong interpretation of an empty result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: project_id scoping is the mitigation for the 500 cap, omitting it means instance-wide actions, and permission adds a predicate while the grouped listing is still returned. That goes beyond the schema's per-parameter text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: "List what the authenticated user is allowed to do, globally or in one project." It also explicitly excludes a plausible misreading ("it does not return a user profile") and names how it differs from get_instance_info, list_memberships and list_roles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three concrete triggering situations (before a write that might 403, explaining a failure, choosing between tools) plus an explicit pitfall: you cannot query another user with this tool. The cross-references section routes the agent to the right sibling for identity, provenance and ids.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_phase_definitionsList project phase definitionsARead-onlyIdempotent
List the instance-global phase definitions — the vocabulary of the project life cycle.
Use it to learn which phases (Initiating, Planning, …) and gates this instance
defines, and to get the definition id or name that list_projects(in_phase=...)
accepts.
Returns the standard list envelope of {id, name, start_gate, start_gate_name, finish_gate, finish_gate_name} rows. Gates are the checkpoints a phase can begin
or end with; a definition without gates has both flags false.
Pitfalls: definitions are the instance-wide catalog, not any project's actual
phases — a project may deactivate phases or set no dates. Phase dates are not
exposed by the API at all. Requires OpenProject 16.1+ and the
view_project_phases permission in at least one project; older instances 404
(the error hint says so).
Cross-references: list_projects(in_phase=...) to find the projects a phase
covers today; get_project_phase for one project's phase record (its id comes
from a work package's project_phase).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| page_size | No | Records per page (max 100); most instances define fewer than a page of phases. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the return envelope shape, the meaning of start/finish gates (false flags = no gates), a version requirement (OpenProject 16.1+, 404 on older instances with a matching error hint), a required permission (view_project_phases in at least one project), and the important limitation that phase dates aren't exposed by the API at all.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then labeled Pitfalls and Cross-references sections — easy to scan and every block carries distinct information. It runs slightly long relative to a two-parameter list tool, but little of it is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs: what it returns, what gates mean, version and permission prerequisites, the failure mode on old instances, and how to follow up with sibling tools. With an output schema present, restating the envelope is a bonus rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (page, page_size) are fully documented in the schema, including the max-100 limit and the note that most instances define fewer than a page. The description adds no additional parameter guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the instance-global phase definitions') and immediately clarifies scope with 'the vocabulary of the project life cycle.' It explicitly distinguishes the catalog from a project's actual phases and from get_project_phase, which shares the domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit purpose for calling it (learn which phases/gates exist, get the id/name that list_projects(in_phase=...) accepts) and routes to the two relevant alternatives — list_projects(in_phase=...) for coverage today and get_project_phase for one project's record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList projectsARead-onlyIdempotent
List projects, filtered server-side, one page at a time.
Use this to turn a project name into the id or identifier that every other tool
consumes, to enumerate the sub-projects of a parent, or to review which projects are
off track. It is the id-producing path for every project_id parameter in this
server.
Returns the standard list envelope: items of
{id, identifier, name, active, public, parent, status_code, workspace_type} plus
pagination with total/page/page_size/has_more. Nothing is
truncated silently — page explicitly until has_more is false.
Pitfalls: search matches name and identifier only (not descriptions);
parent_id returns direct children, so a deep hierarchy needs one call per level;
status_code is a code such as on_track, never a translated label. On
OpenProject 17.x this listing deliberately mixes plain projects with programs and
portfolios — workspace_type says which each row is. in_phase tests phase
dates ("which projects are in Executing today"), so projects whose phases carry
no dates never match it.
For a single project's description and status explanation use get_project. For
the types, versions, categories and time-entry activities valid inside a project use
get_project_metadata. To list a project's work packages use
list_work_packages(project=...).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| active | No | true (default) lists active projects, false lists only archived ones, null lists both. Archived projects are read-only in OpenProject. | |
| search | No | Case-insensitive substring matched against the project name AND its identifier. Descriptions are not searched. Omit to list everything the filters allow. | |
| sort_by | No | Server-side sort, e.g. [["name", "asc"], ["created_at", "desc"]]. Allowed keys: active, created_at, id, identifier, name, public, updated_at. Unknown keys are rejected with the allowed set listed. | |
| in_phase | No | Restrict to projects whose named phase covers a date (today unless phase_on_date says otherwise). Accepts a definition id or name from list_project_phase_definitions. Requires OpenProject 16.1+. | |
| fetch_all | No | Aggregate every page into one result instead of returning page 1. Capped at 500 items with a note when the cap bites; mutually exclusive with page. | |
| page_size | No | Records per page (max 100); the instance may clamp it lower and the returned pagination reports what actually came back. | |
| parent_id | No | Numeric id or identifier of a parent project; returns its DIRECT children only, not the whole subtree. Ids come from a previous list_projects call. | |
| phase_on_date | No | ISO date (YYYY-MM-DD) the in_phase filter should test instead of today. Only valid together with in_phase. | |
| favorites_only | No | Restrict to projects the authenticated user has favorited. Instances that predate project favorites reject this filter with a 400. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the list envelope shape, the explicit pagination/truncation contract ('nothing is truncated silently — page until has_more is false'), the fetch_all cap, and version-specific mixing of programs/portfolios. With annotations doing the safety work, a 3 reflects that the remainder is helpful but partly overlaps the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and routing in the first line, and the later paragraphs are dense rather than padded. However, the paragraph enumerating the returned envelope fields partly duplicates the output schema, and some pitfalls restate schema text, so it is slightly longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, 10-parameter list tool with full schema coverage and an output schema, this leaves nothing material unexplained: filter scope, pagination behavior, parent-child semantics, version caveats, and alternative tools are all covered. An agent can call it correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 10 parameters is already documented, which sets the baseline at 3. The description mostly repeats schema facts (search matches name/identifier only, parent_id returns direct children, status_code is a code), with one genuinely additive pitfall: in_phase tests phase dates, so projects whose phases lack dates never match.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list projects) plus the concrete jobs it serves: resolving names to ids, enumerating sub-projects, and finding off-track projects. It explicitly contrasts itself with get_project, get_project_metadata and list_work_packages, so an agent can distinguish it from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance ('turn a project name into the id or identifier that every other tool consumes') and names the three alternatives with the conditions that select them. The note that it is the id-producing path for every project_id parameter is a strong routing cue for the whole server.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_queriesList saved queriesARead-onlyIdempotent
List the saved work-package views (queries) this user can open.
Use it to discover what a team already tracks — "Sprint board", "My open bugs",
"Overdue in Platform" — before hand-building filters: running someone's saved view
with run_query reproduces exactly what they see in the UI, including their
grouping and sums.
Returns the standard list envelope: rows of {id, name, project, public, starred, updated_at} plus pagination. project is null for a global query (saved outside
any project); public false means the query is private to its owner, and only the
owner's queries are visible to this account.
Pitfalls. Query ids are instance-wide, not per project — never guess one, take it from here. This lists definitions only; it never runs them, so nothing here says how many work packages a query returns.
Cross-references: run one with run_query(query_id=…); build an ad-hoc query
instead with list_work_packages; project ids come from list_projects.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| page_size | No | Queries per page (max 100). | |
| project_id | No | Numeric project id to list only that project's saved views. Comes from list_projects. Omit to list everything visible to the current user, global queries included. A project identifier (URL slug) is not accepted here by OpenProject — use the numeric id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations it discloses visibility scope (only the owner's private queries are visible), that query ids are instance-wide and must not be guessed, and that the tool never executes queries so row counts are unknowable from it. Those are exactly the traits an agent would otherwise infer wrongly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then return shape, then pitfalls and cross-references — a good structure. The paragraph enumerating envelope fields is partly redundant with the existing output schema, which keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema already covers return values, so the description is free to spend its length on selection guidance, visibility rules and id pitfalls — which it does. Nothing needed to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so page, page_size and project_id are already fully documented, including the URL-slug caveat. The description only reiterates that project ids come from list_projects; it adds no new semantics for these parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the saved work-package views (queries)') and scopes it to 'this user can open'. It also implicitly separates itself from run_query (executes) and list_work_packages (ad-hoc filtering), so an agent can place it among siblings without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('discover what a team already tracks ... before hand-building filters') and names all three alternatives with their selection conditions: run_query for execution, list_work_packages for ad-hoc queries, list_projects for project ids.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_remindersList remindersARead-onlyIdempotent
List your own upcoming work-package reminders.
Use this to answer "what have I asked to be reminded about", to check
whether a reminder is already set before creating another one, or to find
the work packages you deferred. Returns the standard list envelope:
items of {id, remind_at, note, work_package, creator} plus
pagination and notes.
Pitfalls. Reminders are personal — this only ever shows the ones the
authenticated account created, never a colleague's, and there is no way
to list someone else's. It only shows reminders that are still
upcoming: once one has fired (or was completed) OpenProject drops it
from this collection, so an empty result does not mean nothing was ever
scheduled. The work package each reminder points at is in
work_package; a reminder is not a work package and its id is not one.
Cross-references: set_work_package_reminder creates, moves or deletes
one; list_notifications shows what OpenProject has actually notified
you about, including fired reminders; get_work_package opens the
ticket a reminder points at.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses three non-obvious traits: results are scoped to the authenticated account, only still-upcoming reminders appear so an empty result is ambiguous, and the fired case is recoverable via list_notifications. This is exactly the hidden behavior an agent needs before trusting an empty list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return shape, then a clearly labeled 'Pitfalls' block and cross-references — easy to scan. It is somewhat longer than strictly necessary, since the return envelope duplicates the output schema, but every section carries distinct value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with an output schema, the definition covers purpose, alternatives, personal scoping, lifecycle caveats and related tools. An agent could call this correctly and interpret both populated and empty results without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. The description instead spends its space documenting the return envelope, which is useful but not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line gives a specific verb and resource plus a scope qualifier ('your own upcoming work-package reminders'), which immediately separates it from list_notifications or list_work_packages. It also clarifies that a reminder is not a work package, preventing id confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names three concrete situations to reach for this tool (answering 'what am I reminded about', pre-checking before creating, and finding deferred work packages) and explicitly points to set_work_package_reminder and list_notifications for the adjacent jobs. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rolesList rolesARead-onlyIdempotent
List the roles this instance defines, with their ids.
This is the id-producing tool for create_membership.role_ids and
update_membership.role_ids (both admin-gated: hidden unless the server
sets OPENPROJECT_MCP_ADMIN_TOOLS=1) — role names are never accepted
there. Roles are instance-wide definitions ('Member', 'Reader', 'Project
admin'); a membership binds one principal to one project with a set of
them.
Returns the standard list envelope with has_more: false: the role list
is small and fetched in full. Each item is {id, name}, plus
permissions when include_permissions=true.
Pitfalls. Role names are configurable per instance, so do not assume
'Member' exists — read the list. Some roles are not assignable to a
project membership (global and work-package roles live in the same
collection); the membership form rejects those with the assignable set
listed. Not every OpenProject version exposes permission arrays on this
endpoint: when include_permissions=true returns none, notes says so
rather than pretending the roles grant nothing.
Cross-references: create_membership / update_membership consume these
ids; list_memberships shows which roles are in use; list_permissions
answers what the current user may do, which is the more useful question
when a call just failed with 403.
| Name | Required | Description | Default |
|---|---|---|---|
| include_permissions | No | Add each role's full permission identifier array. Off by default because those arrays are long — a dozen roles can run to thousands of tokens. Turn it on only when the question is genuinely 'what does this role allow'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, but the description adds real behavioral detail: the standard list envelope with has_more=false, item shape {id, name}, and permissions only when include_permissions=true. The pitfalls section discloses that some returned roles are not assignable to memberships and that permission arrays may be absent on some versions, with notes signaling it rather than returning empty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose in one sentence, then return shape, then pitfalls, then cross-references — a clean structure. It runs longer than strictly necessary (the cross-reference paragraph and the 403 aside could be trimmed), but nearly every line carries operational value rather than restating the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and annotations present, the description still covers the gaps that structured fields can't: configurable role names, non-assignable role types, and version-dependent permission arrays. Nothing an agent needs to call this correctly and interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the boolean's own description already covers the cost rationale, so the description is not obligated to explain it. It still adds meaning beyond the schema by stating the concrete output effect ({id, name} plus permissions) and the edge case where the endpoint returns no permission arrays at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the roles this instance defines, with their ids') and immediately frames the tool's role as the id source for create_membership/update_membership role_ids. It distinguishes itself from list_permissions and list_memberships by naming what each answers, so an agent can tell them apart without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit use context ('id-producing tool for role_ids; role names are never accepted there') and routes to alternatives: list_memberships for roles in use, list_permissions 'when a call just failed with 403'. The when-not-to-use case is effectively covered by that 403 redirection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sprintsList sprintsARead-onlyIdempotent
List sprints (Scrum timeboxes) you can plan work packages into.
Use it to turn "Sprint 11" into the sprint id that
create_work_package/update_work_package consume via their
sprint parameter, or to review a project's sprint plan with its
in_planning/active/completed states.
Returns the standard list envelope: items of {id, name, description, start_date, finish_date, workspace, status} plus
pagination and notes. A project-scoped listing is fetched in
full, so has_more is false; the instance-wide listing is paginated.
Pitfalls: sprints are not versions (17.3+): finish_date is the wire finishDate
and status is the sprint lifecycle. Assign work with
update_work_package(sprint=...); the API has no sprint write endpoint.
Cross-references: get_sprint for one sprint in full;
list_versions for releases and milestones; list_work_packages
with sprint_ids to see what is IN a sprint.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| page_size | No | Sprints per page (max 100). | |
| project_id | No | Numeric project id or URL identifier to list the sprints of that project (native or shared). Omit it to list every sprint visible to you across the instance. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent, but the description adds behavior they don't: project-scoped listings return everything (has_more false) while instance-wide listings paginate, finish_date maps to the wire finishDate, and critically there is no sprint write endpoint so assignment must go through update_work_package. That last point prevents a whole class of failed calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the definition and use case, then separates return shape, pitfalls, and cross-references into scannable blocks. Somewhat long for a three-parameter list tool, and the wire-format note on finishDate is close to incidental, but nearly every sentence carries routing or behavioral information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description sketches the items envelope and pagination/notes fields, and it closes the loop on the most likely agent error (trying to write a sprint). For a read-only list tool with full schema coverage, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by explaining the consequence of project_id's omission — full instance-wide enumeration versus a complete per-project fetch — which changes how an agent should page. Page/page_size are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("List sprints (Scrum timeboxes)") and immediately contrasts sprints against versions and other list tools. An agent can distinguish this from list_versions and get_sprint without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete use cases (resolve "Sprint 11" to an id for create/update_work_package, review a project's sprint plan) and explicitly names alternatives: get_sprint for a single sprint, list_versions for releases, list_work_packages with sprint_ids for contents. When-to-use and when-to-use-something-else are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_time_entriesList time entriesARead-onlyIdempotent
List logged time, filtered server-side, with an optional accurate total.
Answers "how much time went into this ticket?" or "how much did the team spend on
project X in June?". Filters combine with AND, so project_id + user='me' + a date
range is one call.
Returns the standard list envelope: items of {id, hours, spent_on, comment, user, activity, work_package, project} plus pagination.
hours is a float (1.5 = 1h30), never an ISO duration. With
sum_hours=true, the envelope also carries sums.total_hours over
all matches and a groups bucket per activity with its own
count/sums.total_hours — both over the whole filtered set, so
never add pages up yourself.
Pitfalls. Without view-all-time-entries you see only your own entries, so a small
total may mean "not allowed to see" rather than "nobody booked time". work_package_id
scopes to that one work package — child work packages are not included; a
parent's roll-up needs a query per child. Summing stops at 2000 entries, noted in
notes; narrow the range or project rather than trusting the number.
Cross-references: book time with log_time; correct with update_time_entry,
remove with delete_time_entry; activity ids/names from get_project_metadata;
the work package from get_work_package.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| user | No | Whose time to list: numeric user id, or 'me'. Omit for everyone you're permitted to see. | |
| to_date | No | Latest spent-on date, ISO YYYY-MM-DD, inclusive. | |
| fetch_all | No | Aggregate every page into one result instead of page 1. Capped at 500 items (noted when it bites); mutually exclusive with page. sum_hours already reads every entry regardless. | |
| from_date | No | Earliest spent-on date, ISO YYYY-MM-DD, inclusive; combine with to_date for a range (either bound optional). | |
| page_size | No | Entries per page (max 100); the instance may clamp lower, reported in pagination. | |
| sum_hours | No | Accurate total over every matching entry (not just this page), broken down per activity. One request per 100 matches, capped at 2000 (noted if hit). Leave false for rows only. | |
| project_id | No | Only entries in this project (numeric id or identifier; from list_projects), including project-level entries with no work package. | |
| activity_id | No | Only entries booked on this activity; ids are instance-specific, from get_project_metadata(project_id=...). | |
| work_package_id | No | Only entries on this work package; ids from search_work_packages / list_work_packages. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: permission-limited visibility, 2000-entry summing cap, 500-item fetch_all cap, notes reporting, and child work-package exclusion. These are exactly the operational caveats an agent needs before trusting totals or page aggregation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then organizes filters, return shape, pitfalls, and cross-references. Despite its length, every section carries operational value for a 10-parameter listing tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, filtering, return envelope, aggregation behavior, permission caveats, caps, and related tools. With the output schema present, the description is more than complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per-parameter basics are already documented. The description adds valuable semantics not obvious from the schema, especially AND filter combination, 'me' usage, total-over-whole-filtered-set behavior, and that pages should not be added manually.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List logged time') and immediately scopes it as filtered server-side with an optional total. The cross-references to log_time, update_time_entry, and delete_time_entry make its role distinct from sibling time-entry tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage examples ('how much time went into this ticket?') and explains how filters combine in one call. It also names alternatives for booking, correcting, and removing time entries, so the agent knows when to use this versus siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_versionsList versionsARead-onlyIdempotent
List versions (releases, milestones, sprints) you can assign work packages to.
Use it to turn "Sprint 12" or "release 2.1" into the version id that
create_work_package/update_work_package need, to see which versions are still
open, or to review a release plan's dates. With project_id it answers "what can I
target in THIS project", which includes versions shared down from parent projects.
Returns the standard list envelope: items of {id, name, project, status, start_date, end_date, description, sharing, source} plus pagination and
notes. A project-scoped listing is fetched in full, so has_more is false.
Pitfalls: project is the project that DEFINES the version, which for a shared
version is not the project you asked about — assigning still works. status is
open/locked/closed and OpenProject refuses to put work packages into a closed
version. The instance-wide listing is capped at one page of 100; if more exist,
pagination.has_more is true and notes says so — narrow with project_id
rather than assuming you saw everything. include_sprints depends on the backlogs
module: where it is not installed the versions still come back and notes explains
the absence, so read notes before telling a user a project has no sprints.
Cross-references: create_version adds one, update_version moves its dates or
closes it, delete_version removes it; get_project_metadata(project_id=...)
returns the same versions alongside types and categories; to see what is IN a version
use list_work_packages with a version filter. For standalone sprints (17.3+)
use list_sprints/get_sprint.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | Numeric project id or URL identifier to list the versions available in that project — including the ones shared into it from a parent. Omit it to list every version visible to you across the instance. | |
| include_sprints | No | Also read /projects/{id}/sprints from the backlogs module and merge the rows in with source='sprint'. Requires project_id. If backlogs is not installed the versions are still returned and 'notes' says why sprints are missing — the call does not fail. Legacy backlogs versions only: on 17.3+ the endpoint serves standalone Sprint objects, which are skipped here (noted) — use list_sprints/get_sprint for those. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read, but the description goes well beyond: the 100-item page cap, has_more/notes signalling, the fact that project-scoped listings are fetched in full, that closed versions reject assignment, and that backlogs absence degrades gracefully rather than failing. These are exactly the non-obvious traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and use cases, then return shape, pitfalls, and cross-references in clearly labelled blocks. It is long, and the include_sprints/backlogs caveat appears in both description and schema, but nearly every sentence carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description summarizes the envelope shape and warns about the has_more cap, and it covers the backlogs-module edge case and shared-version ownership semantics. Nothing material is missing for correct invocation or interpretation of results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds interpretive value by framing project_id as 'what can I target in THIS project' including versions shared from parent projects, and by flagging that include_sprints requires project_id. Some of the include_sprints text restates the schema description, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List versions (releases, milestones, sprints)') plus the crucial scope qualifier 'you can assign work packages to'. It explicitly distinguishes itself from list_sprints, get_project_metadata, and list_work_packages, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three concrete use cases (resolve name→id for create/update_work_package, find open versions, review release dates) and names the alternative for each adjacent need (list_sprints/get_sprint for standalone sprints, get_project_metadata for a combined view, list_work_packages for contents). Pitfalls add when-not guidance (don't assume completeness on instance-wide listing; narrow with project_id).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_work_package_commentsList work package commentsARead-onlyIdempotent
Read the comment thread and change history of a work package.
Use this whenever the question is "what did people say about this
ticket" or "what changed on it": it returns the full activity journal —
comment entries (author, markdown text, internal flag, timestamps) and
field-change entries whose details are parsed into
{field, from, to} (for example
{"field": "Status", "from": "New", "to": "In progress"}).
Returns the standard list envelope: items plus
pagination{total,page,page_size,has_more} and notes.
Pitfalls. OpenProject's activities endpoint is unpaginated — this
tool fetches the entire journal on every call and pages it here, so
page/page_size cost the same upstream but keep the reply small.
Entries are ordered oldest first, so ask for the last page to see the
latest discussion. Comment text is cut at max_comment_chars and
marked truncated: true; pass that entry's id back as
activity_id to read it in full.
Cross-references: post a comment with add_work_package_comment; the
work package itself (description, custom fields, watchers) comes from
get_work_package; files referenced in a comment are listed by
list_attachments.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Work package id. Get it from search_work_packages, list_work_packages or get_work_package — never guess it. | |
| page | No | 1-based page number over the journal. Entries are oldest first, so the newest comments are on the LAST page. | |
| page_size | No | Journal entries per page, 1-100. Keep it small: comments are long. | |
| activity_id | No | Read exactly one journal entry, uncapped, instead of a page. The id comes from a previous call to this tool. Must belong to work package `id`. | |
| max_comment_chars | No | Per-comment character cap, 50-50000. A cut comment comes back with truncated=true and comment_length; re-read it in full via activity_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior, but the description adds substantial operational context: upstream is unpaginated, the full journal is fetched on every call, paging is applied locally, entries are oldest first, comment text is truncated by max_comment_chars, and truncated entries can be re-read via activity_id. The only minor gap is not explicitly stating authentication or permission requirements, but the rest is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured and front-loaded: purpose, use case, return shape, pitfalls, and cross-references are separated into clear paragraphs. Every sentence contributes operational value, especially the pitfalls and cross-reference sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return values exhaustively, but it still gives the envelope shape and highlights the parsed field-change structure. Annotations, schema, and description together cover everything needed to call the tool correctly, including the unpaginated upstream and truncation behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds meaningful semantics beyond the schema: page/page_size cost the same upstream because the endpoint is unpaginated, newest comments are on the last page, activity_id reads one uncapped entry, and max_comment_chars truncation behavior is explained with the re-read path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: reading a work package's comment thread and change history. It clearly distinguishes this from get_work_package, which covers description, custom fields, and watchers, and from add_work_package_comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('what did people say about this ticket' / 'what changed on it') and includes cross-references for posting comments, fetching the work package itself, and listing attachments. It also explains the ordering pitfall so the agent knows to request the last page for latest discussion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_work_packagesList work packagesARead-onlyIdempotent
List work packages with structured filters — the workhorse read tool.
Handles "assigned to me", "overdue" via parameters, not separate
tools: overdue → due_before=<today>; unassigned → assignee=['none']; nearly done →
percentage_done_min=80; subtasks of a ticket → parent_id=<id>.
Returns the standard list envelope: rows plus pagination, plus groups when
group_by is set and sums when show_sums is set — both computed server-side over
the whole filtered set, independent of paging; never re-add them from one page's rows.
Pitfalls: returns open work packages only unless status_scope or status_ids is
given (status_ids overrides status_scope), so say so when reporting counts. Status,
type, priority and version ids come from get_project_metadata; user ids (assignee,
author, responsible, watcher) from search_principals — never guess either. Date
filters take YYYY-MM-DD, both bounds inclusive.
For text lookups use search_work_packages; for one work package's description, custom
fields and children use get_work_package.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| query | No | Free text, AND-combined with other filters; matches subject, description and comments. | |
| author | No | Author (creator) user ids, or 'me' ('none' not valid). | |
| project | No | Numeric project id or identifier (URL slug); from list_projects. Omit for a cross-project view. | |
| sort_by | No | Sort as snake_case pairs, e.g. [['due_date','asc'],['priority','desc']]. An unknown key fails, listing the allowed set. | |
| watcher | No | Watched by these user ids, or 'me'. | |
| assignee | No | Assignee filter: numeric user ids, 'me', or 'none' for unassigned work. get_instance_info gives the current user. | |
| group_by | No | Group the full filtered set by one snake_case column (e.g. 'status'). Counts in `groups` cover every page. | |
| type_ids | No | Type ids (Task, Bug…). | |
| due_after | No | Due on/after. | |
| fetch_all | No | Aggregate every page into one result instead of page 1. Capped at 500 items (noted when it bites); mutually exclusive with page. | |
| page_size | No | Results per page (max 100). | |
| parent_id | No | Direct children only. Mutually exclusive with top_level_only; use ancestor_id for the whole subtree. | |
| show_sums | No | Server-computed totals (estimated/remaining/spent hours, story points) over the full filtered set; never add up pages yourself. | |
| due_before | No | Due on/before. | |
| sprint_ids | No | Sprint ids; from list_sprints. | |
| status_ids | No | Exact status ids. **Overrides status_scope**. | |
| ancestor_id | No | Whole subtree, any depth (parent_id is one level only). | |
| raw_filters | No | Escape hatch for untyped filters, e.g. custom fields: [{'name': 'customField12', 'operator': '=', 'values': ['4']}]. Field names and option ids come from get_work_package_schema. | |
| responsible | No | Accountable user ids, 'me', or 'none' (no accountable user). | |
| start_after | No | Starts on/after. | |
| version_ids | No | Version ids. | |
| priority_ids | No | Priority ids. | |
| start_before | No | Starts on/before. | |
| status_scope | No | Status bucket: 'open' (default), 'closed' or 'all'. Ignored when status_ids is given. | open |
| created_since | No | Created on/after. | |
| created_until | No | Created on/before. | |
| updated_since | No | Changed on/after. | |
| updated_until | No | Changed on/before. | |
| top_level_only | No | Work packages with no parent (excludes every subtask). | |
| milestones_only | No | Only milestone-type work packages; intersected with type_ids when both are given. | |
| percentage_done_max | No | Maximum progress percent. | |
| percentage_done_min | No | Minimum progress percent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotations, it discloses critical behavior: only open work packages are returned unless `status_scope` or `status_ids` is supplied, and `status_ids` overrides `status_scope`. It also explains that `groups` and `sums` are server-computed over the whole filtered set rather than per page, which prevents incorrect aggregation by the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage recipes, then follows with return-shape and pitfalls. Despite covering a 33-parameter tool, every paragraph carries actionable information without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, full schema coverage, and an output schema, the description fills the remaining gaps: response envelope, grouped/summed behavior, default open-status scope, date format, and sibling tool routing. Nothing essential for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline would be 3, but the description adds useful semantics: date filters are inclusive and use YYYY-MM-DD, identity/type/priority/version IDs must come from specific metadata tools, and `status_ids` takes precedence over `status_scope`. Some recipes repeat schema-level details, but the cross-parameter precedence and ID-source guidance add real value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — “List work packages” — and immediately positions it as the “workhorse read tool” for structured filtering. It clearly distinguishes itself from text search and single-package retrieval by naming `search_work_packages` and `get_work_package` as alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit mappings from common intents to parameters: assigned-to-me, overdue, unassigned, nearly done, and subtasks. It also states when to use `search_work_packages` for text lookups versus `get_work_package` for descriptions and children, leaving little ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_timeLog timeA
Book time against a work package or a project.
Use it when the user says "log 2 hours on #1234" or "book half a day to project X". The call is validated through OpenProject's own form endpoint first, so an activity this project does not allow, a missing permission or a closed cost-reporting period comes back as a typed error listing what would be accepted — nothing half-written is left behind.
Returns the created entry: {id, hours, spent_on, comment, user, activity, work_package, project, created_at, updated_at, lock_version}. hours comes back as a float.
Pitfalls. This is not idempotent — calling it twice books the time
twice, so never blind-retry after a timeout; list the day's entries
first. The time is always booked for the token owner; you cannot log
time on someone else's behalf through this tool. Logging time does not
change the work package's status, estimate or progress — those are
separate fields, and on instances that derive progress from work the
percentage is read-only anyway. The work package's spent_hours
reflects the new entry on the next read.
Cross-references: the activities and ids this project accepts come from
get_project_metadata(project_id=...); review what is already booked
with list_time_entries; fix a mistake with update_time_entry or
delete_time_entry.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | Yes | Duration in hours as a float: 1.5 is one and a half hours, 0.25 is fifteen minutes. Must be positive; OpenProject stores it to the minute. | |
| comment | No | What the time was spent on. Short and factual: it shows up in cost reports next to the hours. | |
| activity | No | Activity name ('Development') or numeric id. Omit to take the instance default from the form. Names are resolved against this project's allowed activities; an unknown name fails with the valid ones listed. | |
| spent_on | Yes | The date the work was done, ISO YYYY-MM-DD. Required and never inferred — 'today' on the server may not be today for the user. | |
| project_id | No | Project to book the time on when the work belongs to no single ticket (numeric id or identifier). Required when work_package_id is omitted. | |
| work_package_id | No | Work package to book the time on. Ids come from search_work_packages or list_work_packages. Either this or project_id is required; passing both books on the work package inside that project. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| user | No | |
| hours | No | |
| comment | No | |
| project | No | |
| activity | No | |
| spent_on | No | |
| created_at | No | |
| updated_at | No | |
| lock_version | No | |
| work_package | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, and the description largely restates the non-idempotency rather than extending it. It does add genuine context beyond annotations: server-side form validation yielding typed errors, no partial writes, token-owner-only attribution, and the fact that status/estimate/progress are untouched. Useful but partially overlapping with what the structured hints already say.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then structured into Pitfalls and Cross-references sections that make it scannable despite its length. The length is defensible for a non-idempotent mutation with six parameters, though the explicit return-field enumeration duplicates the output schema and could be dropped.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the mutation risks, the auth/attribution constraint, the validation-failure behavior, and the follow-up tool chain an agent needs. An output schema exists, so the return-value list is redundant rather than missing. Nothing required to call this correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already documents itself thoroughly (float hours, ISO date, activity name-or-id, project_id required when work_package_id is omitted). The description adds only the pointer to get_project_metadata for valid activity values and the token-owner booking constraint, which is modest incremental value over a schema that already does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Book time against a work package or a project') and immediately scopes it against the sibling family by naming update_time_entry, delete_time_entry and list_time_entries. An agent can distinguish this create operation from the time-entry CRUD siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering utterances ('log 2 hours on #1234', 'book half a day to project X') plus explicit routing: get_project_metadata for valid activities, list_time_entries to review before retrying, update_time_entry/delete_time_entry to correct mistakes. The 'never blind-retry after a timeout; list the day's entries first' line is an explicit when-not rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_all_notifications_readMark all notifications readAIdempotent
Mark everything matching the filters as read — the whole inbox by default.
Use it for "clear my notifications" or "I have dealt with everything in
project X". Called with no arguments it marks every unread notification
of the token owner as read, across all projects; reason and
project_id narrow that blast radius, they do not create a preview.
Check what is about to disappear with
list_notifications(unread_only=true, ...) using the same filters
first — there is no undo beyond re-marking individual ids unread.
Returns {marked, read, message}, where marked is how many unread
notifications matched the filters at the moment of the call (counted
immediately before the bulk update, so a notification arriving during
the call may be counted differently than it was marked).
This tool only ever marks read. There is deliberately no
"mark everything unread" twin: that is a mistake with no upside, and the
reverse direction stays available per-id through
mark_notifications(ids=[...], read=false).
Cross-references: preview or page the inbox with list_notifications;
mark a handful of rows with mark_notifications.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Only clear notifications with this trigger (mentioned, assigned, watched, …). Omit to clear every unread notification the filters allow. dateAlert is Enterprise-gated and is rejected with an explanatory hint on Community instances. | |
| project_id | No | Only clear notifications belonging to this project (numeric id or identifier, from list_projects). Omit to clear across all projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ids | No | |
| read | Yes | |
| marked | Yes | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: discloses the blast radius of the no-argument call, that filters only narrow it and never produce a preview, that there is no bulk undo beyond re-marking individual ids, and that the tool only ever marks read. It even explains the counting semantics of `marked` relative to concurrent arrivals, which no annotation covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive scope in bold and the usage triggers, then the warning, then return values, then rationale and cross-references. Slightly long — the design-rationale paragraph about the absent 'mark everything unread' twin is interesting but not needed to call the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param bulk mutation, an agent needs to know scope, irreversibility, return shape, and alternatives — all present, and the output fields are explained despite an output schema existing. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds genuine meaning by framing both params as narrowing the blast radius rather than scoping a preview, which changes how an agent reasons about them. It does not restate enum values or id formats, leaving that to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
First line states a specific verb (mark as read), resource (notifications), and scope (everything matching filters, whole inbox by default). It explicitly distinguishes itself from its closest siblings by naming list_notifications for previewing and mark_notifications for per-id marking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage triggers ("clear my notifications", "I have dealt with everything in project X") and names the alternative route for a handful of rows. It also prescribes a pre-flight step with list_notifications(unread_only=true) using the same filters, which is unambiguous guidance on when and how to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_notificationsMark notifications read or unreadAIdempotent
Mark specific notifications read (or unread) in one bulk request.
Use it after you have actually handled what a notification was about, so
the user's inbox reflects reality. It is the id-consuming counterpart of
list_notifications: pass the row id values from that tool.
Returns {marked, read, ids, message}. OpenProject answers the bulk
endpoint with 204 No Content, so marked is the number of ids the
call covered — ids that were already in the requested state, or that
belong to someone else's inbox, are simply not changed.
Pitfalls. Marking is idempotent, so a retry after a timeout is safe. Pass
the notification id, not resource.id — the work package id
underneath is a different number entirely. Unknown ids do not fail the
call, so do not treat success as proof that every id existed.
Cross-references: get the ids from list_notifications; to clear an
entire (optionally filtered) inbox in one go use
mark_all_notifications_read.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Notification ids to mark, e.g. [4711, 4712]. Required and non-empty — this tool never operates on 'everything'. Ids come from list_notifications (the row 'id', not resource.id). At most 200 per call. | |
| read | No | true (default) marks them read; false puts them back in the unread inbox. Both directions are safe here because the ids are explicit. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ids | No | |
| read | Yes | |
| marked | Yes | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly=false, destructive=false, idempotent=true), but the description adds real operational context beyond them: the 204 No Content response means 'marked' is a coverage count, not a success count, so unknown or foreign ids silently no-op. It also flags that marking is idempotent and retry-safe, which is a behavioral guarantee worth restating for a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then return shape, then a labeled Pitfalls block and cross-references — good structure for a short reference. Slightly repetitive: the notification-id-versus-resource.id warning appears in both the body and the schema, and the return contract is restated despite an output schema existing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param mutation with an output schema, this is complete: it covers the id-source workflow, the id-type pitfall, silent no-op semantics, idempotency under retry, and where to go for the bulk-clear case. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents both params, so the baseline is 3. The description goes past that by hammering the highest-risk semantic trap — pass the notification id, not resource.id, because the work package id underneath is a different number — and by framing 'read' as both-directions-safe. It stops short of adding anything about the 200-id cap outside the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (mark notifications read/unread), the batch scope ('in one bulk request'), and immediately names the sibling it complements ('the id-consuming counterpart of list_notifications'). An agent can distinguish it from mark_all_notifications_read without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when ('after you have actually handled what a notification was about') and an explicit alternative ('to clear an entire (optionally filtered) inbox in one go use mark_all_notifications_read'). The workflow dependency on list_notifications as the id source is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_work_package_watcherRemove work package watcherAIdempotent
Unsubscribe a user from a work package's notifications.
Use this to stop notifying someone who no longer needs the updates. Returns the user, the watch state after the call (always not watching) and a confirmation message.
Pitfalls. OpenProject answers the same 204 whether or not the user was
watching, so changed comes back null — do not report "removed" as
proof that they were subscribed. Removing another user needs the
delete-work-package-watchers permission; removing yourself only needs
view access. A 404 means the user id is unknown (or the work package
is), not that they were not watching. This does not unassign anyone and
does not remove them from the project.
Cross-references: get_work_package(include=['watchers']) shows who
watches today; add_work_package_watcher is the reverse.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | Numeric id of the watcher to remove. get_work_package(include=['watchers']) lists the current watchers with their ids. The string 'me' is not accepted here. | |
| work_package_id | Yes | Work package to unsubscribe the user from. Ids come from search_work_packages, list_work_packages or get_work_package. |
Output Schema
| Name | Required | Description |
|---|---|---|
| user | No | |
| changed | No | |
| message | Yes | |
| watching | Yes | |
| work_package_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say non-destructive/idempotent; the description goes much further, disclosing that the API returns 204 regardless of prior state, that `changed` is null and must not be read as proof of prior subscription, that a 404 refers to an unknown user id rather than watch state, and the differing permission requirements for self vs. other. That is exactly the kind of trap-avoidance context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then a scoped usage sentence, then labeled Pitfalls and Cross-references sections that are dense with actionable content. Slightly verbose and repeats the watch-state point twice (once in the returns sentence, once under Pitfalls), but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with an output schema, the description covers permissions, what is and is not mutated, error semantics, and the verification path via get_work_package. There is nothing an agent needs to call this correctly that is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameter descriptions already explain id sourcing and the 'me' restriction, so the schema does the work. The description adds no format or edge-case detail about the parameters themselves beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Unsubscribe a user from a work package's notifications.' It also differentiates from the sibling add_work_package_watcher ('the reverse') and from unrelated operations (unassign, project membership), so an agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the use case ('stop notifying someone who no longer needs the updates'), names the reverse tool, and points at get_work_package(include=['watchers']) to check current state before calling. It also states explicit exclusions — this does not unassign anyone or remove project membership — which is the when-not guidance most tools lack.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_queryRun a saved queryARead-onlyIdempotent
Run a saved view and get its work packages — the fastest way to answer with a team's own definition of "the sprint" or "our bugs".
OpenProject queries run on read: this returns the rows as they are right now, in the
stored order and grouping. The result is the standard list envelope — items of
compact work-package rows, pagination, plus groups when the query groups and
sums when it asks for totals — with one addition: query carries the stored
definition (name, project, readable filters, group_by, sort_by), so the rows
can be interpreted without a second call.
Pitfalls. groups and sums are computed server-side across the entire result set,
not the page in front of you — never re-add them from items. Omitting page_size
keeps the query's own page size, which may be much larger than 20. override_filters
replaces the stored filters instead of narrowing them, and never edits the saved
query. A 422 means the filter set is invalid for this query's context (a
project-scoped filter on a global query, an unknown custom field); violations names
the attribute.
Cross-references: find query ids with list_queries; equivalent ad-hoc filtering
lives in list_work_packages; open a single row with get_work_package.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Omit to use the page the stored query starts on (the first). | |
| query_id | Yes | Saved query id, from list_queries. It is the same id as in the UI's ?query_id= URL parameter. | |
| page_size | No | Rows per page (max 100). Omit to keep the query's stored page size, which can be larger or smaller than this tool's usual default. | |
| override_filters | No | Run the query with these filters instead of its stored ones, for this call only — e.g. [{'name': 'status', 'operator': 'o', 'values': []}] or [{'name': 'customField12', 'operator': '=', 'values': ['4']}]. This REPLACES the stored filters (the API cannot merge), so re-state anything you want to keep; 'query.filters' in the result shows what the stored ones were. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| query | Yes | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since annotations are sparse, this description carries a massive burden, succeeding by detailing key behaviors like server-side computation for sums/groups, how filters are replaced (not narrowed), and explaining specific API error codes like 422.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely dense and long, but it is logically structured by separating the primary function, the result structure, pitfalls, and cross-references. Every sentence provides high-value technical information rather than repeating fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of API operations (pagination, server-side grouping, filter manipulation), the description is exhaustive. It covers input behavior, output structure, constraints, and error handling without requiring external documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema coverage is 100%, the description adds crucial functional meaning, explaining that omitting `page_size` defaults to a potentially large stored size and detailing the destructive nature of `override_filters` (it replaces, it doesn't merge).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The tool clearly states it runs a saved view and returns work packages based on the view's definition. It distinguishes this retrieval operation from other list/search functions (e.g., list_queries) by explaining that it executes the stored logic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description proactively references related tools, specifically citing `list_queries` for obtaining IDs and `list_work_packages` for ad-hoc filtering, providing a clear decision path for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_querySave a queryA
Save a filter set as a reusable OpenProject view.
Use it to keep a filter combination — "Overdue in Platform", "My open bugs" — instead
of rebuilding it each session: the view shows up in the OpenProject UI too, and
run_query reproduces it exactly. Prove filters with list_work_packages first.
Validated via POST /queries/form first, so an invalid filter name, unsupported
operator, or project-scoped filter on a global view comes back as violations naming
the attribute — nothing is saved. Returns the stored definition: {id, name, project, public, starred, filters (as readable sentences), group_by, sort_by, display_sums, updated_at, notes}. Keep the id — run_query takes it.
Pitfalls. If OpenProject keeps fewer filters than were sent, notes says so — read
filters rather than assuming a match. Custom-field filters (customField12) are sent
as plain values, since a list-typed one can't be told apart from a text one without
asking the instance; a failing one means nothing was saved — save that view in the UI
instead. Editing and deleting saved views isn't offered here: use the OpenProject UI.
Cross-references: list_queries lists what exists (with ids); run_query(query_id=...)
runs this view; list_work_packages validates filters first; list_projects supplies
project_id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name the view is saved under, e.g. 'Overdue in Platform'. Not unique upstream — a repeat name creates a second view. | |
| star | No | Also star (favorite) the view, so it appears in the sidebar. A second call after the query exists; a failure still leaves it saved (noted in 'notes') — don't re-save. | |
| public | No | true shares the view with everyone who can see the project; false (default) keeps it private. Sharing usually needs 'manage public queries'. | |
| filters | Yes | The filters to store, same shape as run_query's override_filters / list_work_packages' raw_filters, e.g. [{'name': 'status', 'operator': 'o', 'values': []}, {'name': 'assignee', 'operator': '=', 'values': ['12']}]. Values are ids (or 'me'), not names. Pass [] for a view with no filters — unlike a listing, it then shows every status. | |
| sort_by | No | Stored sort order, e.g. [['due_date', 'asc'], ['id', 'desc']]. Unknown keys are rejected locally, listing the allowed set. Omit for the default. | |
| group_by | No | Column to group results by, e.g. 'status', 'assignee'. Makes run_query return 'groups' with per-group counts. Omit for a flat list. | |
| project_id | No | Numeric project id the view belongs to; from list_projects. Omit for a global view — project-scoped filters (version, category, subprojectId) are then rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| notes | No | |
| public | No | |
| filters | No | |
| project | No | |
| sort_by | No | |
| starred | No | |
| group_by | No | |
| updated_at | No | |
| display_sums | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present, this goes well past the bar: it discloses server-side validation via POST /queries/form returning `violations` with nothing saved, silent filter dropping surfaced in `notes`, the custom-field value caveat where a failure means no save, and the star-as-second-call partial-failure semantics that pair with idempotentHint=false. It also warns that repeat names create duplicate views, consistent with the non-idempotent annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Structure is strong — purpose first, then validation/returns, then pitfalls, then cross-references — and each block carries operational content. It is long, but the density is warranted by a 7-parameter mutation tool with non-obvious failure modes; only minor trimming is possible without losing signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description still sketches the return shape ({id, name, project, filters as readable sentences, ...}) and tells the agent to retain `id` for run_query. For a write tool with a validation step, partial-failure paths, and unsupported edit/delete, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, yet the description still adds semantics the schema lacks: values are ids (or 'me') rather than names, empty values array for '*'/'!*', `[]` filters meaning an unfiltered view, sort_by rejecting unknown keys locally, group_by causing run_query to return per-group counts, and omitting project_id forcing rejection of project-scoped filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb (save) and resource (filter set as a reusable OpenProject view), and the following sentences pin down the exact scope: persisted view, visible in the UI, reproducible via run_query. An agent can distinguish it immediately from run_query (execution) and list_queries (enumeration).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is given: use list_work_packages to prove filters first, list_queries to see existing views with ids, run_query(query_id=...) to execute this one, list_projects for project_id. Exclusions are also stated — editing and deleting saved views must be done in the OpenProject UI, which is not offered here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_principalsSearch users, groups and placeholder usersARead-onlyIdempotent
Find users, groups and placeholder users, and get their ids.
This is the id-producing tool for every principal parameter in this
server: assignee/responsible on work packages, watcher ids, the
user_id of a time entry, and principal_id for create_membership
(admin-gated: hidden unless the server sets
OPENPROJECT_MCP_ADMIN_TOOLS=1). Names are never accepted where an id
is wanted — resolve here first, and never guess a numeric id.
Use it to answer "who is Grace Hopper's account", "which groups exist",
"who is a member of the demo project". Returns the standard list
envelope: items of {id, name, type, email?, login?, status?} plus
pagination{total,page,page_size,has_more} and notes.
Pitfalls. email, login and status are only returned for user
principals the authenticated account may see — a null email means "not
visible to you", not "no email". Group principals can hold memberships
and be assigned work, so filter by type when you specifically need a
person. Matching is substring-based, so a short query matches broadly;
prefer the full name or the login. member_of_project filters by
membership, not by whether the person ever touched the project.
Cross-references: get_user for one user's full detail;
list_memberships for who holds which roles in a project;
create_membership to grant access; list_roles for the role ids that
grant needs.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| type | No | Restrict to one kind of principal. 'user' = people who log in, 'group' = user groups (assignable and grantable as a unit), 'placeholder' = licence-free stand-ins. Omit to search all three. | |
| query | No | Free text matched against name, login and email (substring, case-insensitive). Omit it to page through every visible principal. | |
| status | No | Restrict to an account status. 'active' is the usual filter when looking for someone to assign work to; 'locked' accounts keep old assignments but take no new ones. Groups and placeholder users have no status and are excluded when this is set. | |
| page_size | No | Principals per page, 1-100. | |
| member_of_project | No | Only principals who are members of this project. Numeric project id or the URL identifier; an identifier costs one extra lookup. Use it before assigning work — a user who is not a member usually cannot be assigned. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive; the description adds substantial beyond-schema context: null email means 'not visible', group principals can hold memberships and be assigned, substring matching is broad, member_of_project filters by membership not history, and create_membership is admin-gated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and id-resolution mandate, then groups pitfalls and cross-references clearly. Slightly long, but each paragraph (id mandate, examples, pitfalls, cross-refs) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema being present, the description still sketches the envelope (items, pagination, notes), covers all six parameters' semantics, and addresses permission-based visibility. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the schema already documents each parameter; the description nonetheless adds behavioral nuance the schema lacks—short queries match broadly, prefer full name or login, and member_of_project costs an extra lookup for URL identifiers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (find users, groups, placeholder users, get their ids) and immediately frames itself as 'the id-producing tool' for principal parameters. This distinguishes it clearly from get_user, list_memberships and create_membership in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (anywhere an assignee/responsible/watcher/user_id/principal_id is needed) and names alternatives with conditions ('get_user for one user's full detail; list_memberships for who holds which roles'). Also warns never to guess a numeric id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_work_packagesSearch work packagesARead-onlyIdempotent
Find work packages by text when you do not know their ids.
Use this first whenever a user names a ticket instead of numbering it, then feed the
returned id into get_work_package, update_work_package or list_work_packages.
Returns the standard list envelope: compact rows (id, subject, type, status, priority,
assignee, project, dates, progress) plus pagination with total/page/page_size/has_more.
Pitfalls: search filters, it does not rank, so a broad query returns a lot — narrow it
with project_id, or switch to list_work_packages when you want structured filters
(assignee, due date, version) rather than text. Attachment-content matching in 'fulltext'
mode depends on instance database configuration and is reported honestly in notes.
For structured filtering use list_work_packages; for one work package's full detail
(description, custom fields, children) use get_work_package.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 'quick' (default) matches subject, id, project name and type/status names — this is what the OpenProject header search runs and the right choice for 'find the ticket called X'. 'fulltext' additionally matches description text, comments and searchable custom fields; use it for 'which ticket mentions Y'. | quick |
| page | No | 1-based page number. | |
| query | Yes | Free text to look for. In 'quick' mode a bare number also matches a work package id, so '1234' finds #1234. | |
| page_size | No | Results per page (max 100). | |
| project_id | No | Restrict the search to one project: numeric id or the project identifier (the slug in the OpenProject URL). Both come from list_projects. Omit to search every project the user can see. | |
| status_scope | No | Which statuses to search. Defaults to 'all' because finding closed items is usually the point of a search; pass 'open' to hide finished work. An explicit status filter is always sent, so the server's implicit open-only default never applies. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| sums | No | |
| items | No | |
| notes | No | |
| groups | No | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds genuinely behavioral context beyond them: search filters but does not rank, broad queries yield volume, and fulltext attachment matching depends on instance DB configuration and is surfaced in `notes`. It also describes the return envelope, though with an output schema present that portion is partly redundant, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the routing rule and organized into return shape, pitfalls, and alternatives. The final sentence restates the list_work_packages/get_work_package routing already given earlier in the pitfalls paragraph, making it slightly redundant but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter read tool with an output schema and full annotation coverage, the description supplies everything an agent needs: when to reach for it, how to narrow, what comes back, and which sibling to use instead. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains mode, query, project_id and status_scope in depth, so the baseline is 3. The description only echoes project_id as a narrowing lever and never mentions status_scope, adding little the schema does not say.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb+resource+condition: 'Find work packages by text when you do not know their ids.' It immediately distinguishes itself from id-based siblings by tying 'by text' to 'not ids'. An agent can separate it from list_work_packages and get_work_package without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit use-first rule ('Use this first whenever a user names a ticket instead of numbering it'), explicit alternatives for other jobs ('For structured filtering use list_work_packages; for one work package's full detail use get_work_package'), plus a narrowing strategy for broad queries. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_project_favoriteSet project favoriteAIdempotent
Add or remove a project from the authenticated user's favorites (OpenProject 17+).
Favorites are per user, not per project: this changes what the account behind OPENPROJECT_API_KEY sees starred on its own overview page, and nothing about the project itself or about anybody else's view. Use it when the user asks to pin, star or favorite a project they work in.
Returns {id, favorite, message} — favorite is the state now in effect. The call
is idempotent: favoriting an already-favorited project succeeds again.
Pitfalls: this endpoint only exists from OpenProject 17. When the instance reports a version older than that the call is REFUSED before anything is sent, with the detected version in the message, because there is no downgrade that would achieve the same thing — favorite the project in the web UI instead. When it reports no version at all the request IS sent, since an unreported version says nothing about the endpoint. A 404 is ambiguous on purpose in the hint: it means either the project does not exist for this account or the endpoint is missing. This is not project 'status' and not a work-package watcher.
Cross-references: list_projects(favorites_only=true) lists the current favorites
(and works on older instances too); get_project resolves an identifier first;
get_instance_info reports the detected OpenProject version.
| Name | Required | Description | Default |
|---|---|---|---|
| favorite | Yes | true adds the project to the authenticated user's favorites, false removes it. Required — there is no toggle, so read the current state with list_projects(favorites_only=true) if you do not know it. | |
| id_or_identifier | Yes | Numeric project id or URL identifier to favorite or un-favorite; both are accepted and come from list_projects or get_project. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| message | Yes | |
| favorite | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: the change is per-account and invisible to others, an already-favorited project succeeds again, and the call is REFUSED before sending on instances older than 17 while an unreported version still sends. The 404 ambiguity is disclosed. Loses a point only because the refusal/404 behavior is described at high density without a crisp ordering rule for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose followed by return shape, then pitfalls, then cross-references — a sensible ordering. The pitfalls paragraph is long and nests several conditional cases, which is justified by the version-gating complexity but slightly heavier than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the version-compatibility gate, the ambiguous 404, idempotency, per-user semantics, and the alternatives for reading state — everything an agent needs to invoke this correctly on a versioned instance. An output schema exists, and the description still summarizes the return for convenience.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already fully documented in the schema, including the 'no toggle' warning. The description reinforces the state-vs-toggle framing but adds no syntax or sourcing detail the schema lacks. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (add/remove a project from the authenticated user's favorites) and immediately bounds the scope to per-user state. It explicitly disclaims two confusable neighbors ('not project status and not a work-package watcher'), so an agent can distinguish it from siblings without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ('when the user asks to pin, star or favorite a project they work in') and names three alternatives with their distinct roles: list_projects(favorites_only=true), get_project, get_instance_info. The version pre-check path is spelled out rather than left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_work_package_reminderSet work package reminderAIdempotent
Set, change or clear your personal reminder on a work package.
Use this when something should resurface later: "remind me about this on
Monday", "ping me an hour before the release". Reminders are private —
only you see yours, and only you are notified. The tool upserts: it looks
for your active reminder on the work package and creates one if there is
none, updates it if there is. Returns action
(created/updated/deleted/unchanged) and the resulting reminder.
Passing remind_at=null deletes the reminder. That is the
documented way to clear it rather than a destructive operation — nothing
but your own pending notification is removed, the work package and its
history are untouched — so this tool does not ask for confirm. Set a
new time to get it back.
Pitfalls. OpenProject allows exactly one active reminder per work package
per person, so a second "create" becomes an update of the first — there
is no way to stack two. remind_at must carry a timezone; a bare
'2026-08-03T09:00' is refused rather than guessed at. A reminder in the
past is rejected by the instance. Once a reminder has fired it disappears
from the API, so a later call creates a fresh one rather than reviving
it. Reminders are personal: you cannot set one for a colleague — add them
as a watcher or mention them in a comment instead.
Cross-references: list_reminders shows everything you have pending;
add_work_package_watcher notifies someone about changes rather than
at a chosen time; add_work_package_comment with an @-mention is how
you get another person's attention.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Short text shown with the reminder ('check the staging deploy'). Omit to leave an existing note untouched; pass an empty string to clear it. | |
| remind_at | No | When to be reminded, as an ISO 8601 datetime WITH a timezone, e.g. '2026-08-03T09:00:00Z'. Pass null to delete the existing reminder. Omit the parameter entirely to keep the current time and only change the note. | __unchanged__ |
| work_package_id | Yes | Work package to be reminded about. Ids come from search_work_packages, list_work_packages or get_work_package. |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| message | Yes | |
| reminder | No | |
| work_package_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent/destructive/openWorld, but the description goes much further: it explains that null deletes rather than destroys, that no confirm is required because nothing but the user's own notification is removed, the one-reminder-per-person constraint, timezone requirement, past-time rejection, and post-fire disappearance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then a clearly labeled 'Pitfalls' block and cross-references. It is longer than strictly necessary, but each paragraph carries distinct operational information; the parenthetical asides are the only mild slack.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter upsert/delete tool with an output schema, the description covers everything needed to call it correctly: deletion path, constraints, edge cases, and the return action values. Even though the output schema exists, restating the action vocabulary is harmless reinforcement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond it: remind_at=null deletes, a timezone is mandatory and a bare local timestamp is refused, and omitting the parameter preserves the existing note. The note/empty-string semantics are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb set and resource ('personal reminder on a work package') and immediately clarifies the upsert semantics. It is clearly distinguishable from nearby siblings like add_work_package_watcher and add_work_package_comment, which are explicitly called out later.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use triggers ('remind me about this on Monday') and names the alternatives with the condition that selects each: list_reminders for pending items, watchers for change notifications, @-mention comments for other people.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toggle_comment_reactionToggle comment reactionA
React to a work-package comment with an emoji, or take your reaction back.
Use this for the lightweight acknowledgement a comment does not deserve:
👍 on a decision, 👀 to say you are looking at it, 🎉 when something
shipped. Returns the comment's full reaction state afterwards — every
emoji on it with the people who picked it — plus reacted, which says
whether you are now among them.
Pitfalls. This is a toggle, not an add: calling it twice with the
same reaction leaves the comment exactly as it started, so it is not safe
to retry blindly after a timeout — read reacted from the result
instead. Reactions belong to the authenticated account; you cannot react
on someone else's behalf and cannot remove their reaction. Only comment
entries can be reacted to — a field-change journal entry ("Status changed
from New to In progress") is refused by OpenProject with a 400. The
feature needs OpenProject 16.0 or newer; an instance known to be older
is refused up front with a version hint rather than pretending to have
reacted, and one whose version is not readable answers 404 instead.
Cross-references: list_work_package_comments reads the thread and
produces activity ids; add_work_package_comment says something in
words when an emoji is not enough; get_instance_info reports the
detected OpenProject version.
| Name | Required | Description | Default |
|---|---|---|---|
| reaction | Yes | Which emoji to toggle. OpenProject accepts exactly eight: thumbs_up (👍), thumbs_down (👎), grinning_face_with_smiling_eyes (😄), confused_face (😕), heart (❤️), party_popper (🎉), rocket (🚀), eyes (👀). Passing the emoji character itself is rejected — use these names. | |
| activity_id | Yes | Id of the comment to react to. It comes from list_work_package_comments (the 'id' of an entry with kind='comment') or from add_work_package_comment's result — it is an activity id, not a work package id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | No | |
| message | Yes | |
| reacted | No | |
| reaction | Yes | |
| reactions | No | |
| activity_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: it discloses that this is a non-idempotent toggle (matching idempotentHint=false) and warns against blind retries after a timeout — a subtle trap the annotations alone cannot convey. It also covers auth scope (only the authenticated account's reaction), the 400 refusal on non-comment entries, and version gating with 404 fallback.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and usage, then a clearly labeled 'Pitfalls' block and 'Cross-references' block — easy to scan. Slightly long, and the version-detection paragraph is more verbose than strictly necessary, but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists, the description still explains the meaningful return field (`reacted`) and the full reaction roster, and it covers version prerequisites, retry hazards, and permission scope. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already well documented in the schema. The description adds semantic value by framing `reaction` as a per-emoji toggle (calling twice restores the original state) and by tying the return `reacted` flag to that parameter's effect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (toggle a reaction on a work-package comment) and immediately disambiguates the two directions (add vs. remove) while contrasting with siblings like add_work_package_comment and list_work_package_comments. An agent can tell exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use examples (👍 on a decision, 👀 to say you're looking, 🎉 on a ship) and explicitly routes elsewhere when an emoji is insufficient (add_work_package_comment) or when the version must be checked (get_instance_info). Exclusions are stated: only comment entries, not journal field-change entries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectUpdate projectA
Change a project's name, description, visibility, parent, status or archived state.
Use it to record a status change with its explanation ("at_risk because the vendor
slipped"), to rename or re-parent a project, to publish it, or to archive it with
active=false. The change is validated through POST /projects/{id}/form first,
so rejected values come back as violations naming the attribute.
Only the parameters you pass are sent — omitted fields are never rewritten, so two
agents editing different fields do not clobber each other. Projects carry no
lockVersion upstream, so there is no version to echo and no lock parameter here.
Returns the updated project in the same shape as get_project.
Pitfalls: description and status_explanation REPLACE the stored text rather
than appending to it. active=false archives, which is not deletion but does hide
the project and freeze its work packages. Changing identifier is deliberately not
offered — it breaks every existing link to the project.
Cross-references: get_project to read the current values first; delete_project
to remove a project for good; list_projects(active=false) to find archived ones.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New display name. Omit to leave the name alone. | |
| active | No | false ARCHIVES the project — it disappears from normal listings and everything in it becomes read-only, including its subprojects. true restores it. Omit to leave it alone. Archiving is usually admin-only. | |
| public | No | True publishes the project to every logged-in user, false makes it members-only. Omit to leave the visibility alone. | |
| parent_id | No | Move the project under another one: numeric id or identifier of the new parent. Pass null to detach it and make it top-level. Omit the parameter entirely (the default) to leave the hierarchy untouched. | __unchanged__ |
| description | No | New description in markdown; it REPLACES the existing text, so read the current one with get_project first if you mean to extend it. Pass an empty string to clear it. Omit to leave it alone. | |
| status_code | No | New project status: on_track, at_risk, off_track, not_started, finished or discontinued. Only these codes are accepted. Omit to leave the status alone. | |
| id_or_identifier | Yes | Numeric project id or URL identifier of the project to change; both are accepted and come from list_projects or get_project. | |
| status_explanation | No | Markdown note explaining the status, e.g. why the project is at risk. Replaces the previous explanation; pass an empty string to clear it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| 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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: server-side validation through POST /projects/{id}/form returning 'violations', partial-update semantics so omitted fields are never rewritten, and the absence of a lockVersion. The annotations already flag non-read-only, non-destructive, non-idempotent behavior, and the description does not contradict them, though it never addresses the idempotentHint=false claim explicitly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation and use cases, then pitfalls, then cross-references — a sensible order with no filler. A few points (description replacement, active=false archiving) are restated from the schema, so it is slightly redundant but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs for an 8-parameter mutation: partial-update safety, validation failure mode, archive side effects, return shape pointer to get_project, and sibling routing. With an output schema present, no return-value detail is owed, and what little is said is a helpful pointer rather than a substitute.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents each parameter thoroughly, so the baseline is 3. The description still adds cross-parameter meaning: the 'only what you pass is sent' contract (which explains parent_id's __unchanged__ sentinel versus null), the replace-not-append semantics of description and status_explanation, and the archive consequence of active=false.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus the full set of mutable attributes, so an agent immediately knows this is the partial-mutation tool for projects. It is clearly separable from get_project, create_project, copy_project and delete_project named in the description and siblings list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use examples (record a status change with rationale, rename, re-parent, publish, archive) and names alternatives with their conditions: get_project to read first, delete_project for permanent removal, list_projects(active=false) to find archived projects. It also states an explicit exclusion — identifier changes are deliberately unsupported.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_time_entryUpdate time entryA
Correct an existing time entry.
Use it for the everyday fixes: wrong duration, wrong day, wrong activity, a comment that needs to say what actually happened. Only the parameters you pass are written; everything else is left exactly as it is.
Returns the updated entry in the same shape log_time returns.
Pitfalls. What can be moved between entries is limited: the work package
and the project a time entry belongs to are not editable here —
delete the entry and log it again where it belongs. Some instances
report a lock_version for time entries and some do not; this tool
reads the entry first and only echoes a lock version when one exists, so
a concurrent edit surfaces as a conflict error with the fresh state
rather than silently overwriting a colleague's correction. Editing time
inside a closed cost-reporting period is refused by OpenProject with a
validation error.
Cross-references: find the id with list_time_entries; remove the
entry entirely with delete_time_entry; the valid activity names come
from get_project_metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | New duration in hours as a float (1.5 = 1h30). Omit to leave it. | |
| comment | No | New comment text. Pass an empty string to clear it; omit to leave the existing comment untouched. | |
| activity | No | New activity as a name or numeric id. Names are resolved against the entry's own form, so an unknown one fails with the valid ones listed. | |
| spent_on | No | New spent-on date, ISO YYYY-MM-DD. Omit to leave it. | |
| time_entry_id | Yes | Id of the entry to correct. It comes from list_time_entries or from the log_time result — it is not a work package id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| user | No | |
| hours | No | |
| comment | No | |
| project | No | |
| activity | No | |
| spent_on | No | |
| created_at | No | |
| updated_at | No | |
| lock_version | No | |
| work_package | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining partial-update semantics, optimistic locking and conflict behavior, closed-period validation refusal, and the non-editable fields. These are exactly the operational traits an agent needs before invoking a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then moves through usage, return value, pitfalls, and cross-references. Despite its length, the structure is deliberate and every section contributes useful operational context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the mutation risk, partial-update behavior, concurrency caveat, and validation restrictions, the description is complete enough for correct invocation. The output schema exists, so the brief return-shape note is sufficient without duplicating full response details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema carries most parameter meaning. The description still adds important semantics: only passed parameters are written, work package and project are not editable here, and activity names come from project metadata.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Correct an existing time entry.' It distinguishes this from creating or deleting entries through the examples and cross-references to log_time and delete_time_entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly lists the intended everyday fixes and identifies when to use alternatives, such as deleting and re-logging when the work package or project must change. It also routes the agent to list_time_entries for ids and get_project_metadata for valid activity names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_versionUpdate versionA
Change a version's name, dates, description, status or sharing.
Use it to move a sprint's dates, to close a finished release (status='closed'),
or to widen sharing so a subproject can use the version. The change is validated
through POST /versions/{id}/form first, so rejected values come back as
violations naming the attribute.
Only the parameters you pass are sent, so concurrent edits to other fields survive.
Versions carry no lockVersion upstream, so there is nothing to echo and no lock
parameter here — a 409 would mean the resource itself changed, not a stale version.
Returns the updated version in the same shape as create_version.
Pitfalls: end_date writes the API's endDate — it lands, unlike in the old
server. description REPLACES the stored text. Closing a version does not move or
unassign its work packages; they keep pointing at it. The defining project cannot be
changed — create a new version instead.
Cross-references: list_versions for ids and current values; delete_version
when the version must really disappear; update_work_package(version=...) to move
individual work packages between versions.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name. Omit to leave it alone. | |
| status | No | open, locked or closed. Closing a version keeps its work packages but stops new ones being assigned — it is the safe alternative to delete_version. Omit to leave the status alone. | |
| sharing | No | none, descendants, hierarchy, tree or system. Narrowing the sharing of a version other projects already use is rejected by the API. Omit to leave it alone. | |
| end_date | No | New finish date, ISO YYYY-MM-DD, written to the API's 'endDate'. Pass null to clear it. Omit the parameter to leave it untouched. | __unchanged__ |
| start_date | No | New start date, ISO YYYY-MM-DD. Pass null to clear it. Omit the parameter entirely (the default) to leave it untouched. | __unchanged__ |
| version_id | Yes | Numeric version id from list_versions or get_project_metadata(project_id=...).versions. | |
| description | No | New markdown description; REPLACES the existing text. Pass null or an empty string to clear it. Omit to leave it untouched. | __unchanged__ |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| source | No | |
| status | No | |
| project | No | |
| sharing | No | |
| end_date | No | |
| created_at | No | |
| start_date | No | |
| updated_at | No | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the POST /versions/{id}/form validation step and the 'violations' error shape, the partial-send semantics that preserve concurrent edits, the deliberate absence of a lockVersion, and the meaning of a 409. It also states what closing does NOT do to work packages and that the defining project is immutable — behavior an agent cannot infer from readOnly/destructive/idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and use cases are front-loaded, then behavior, then pitfalls and cross-references — a sensible order. It is long, and the pitfall about end_date ('it lands, unlike in the old server') references implementation history the agent does not need.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description only needs to point at the return value, which it does ('same shape as create_version'), and it covers validation failure, partial-update concurrency, and the immutability boundary. Nothing material for a correct invocation is left out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds real value by explaining that only passed parameters are transmitted, that end_date maps to the API's endDate, that description REPLACES stored text, and that narrowing sharing on an in-use version is rejected. Most of the remaining field detail is duplicated from the schema rather than new.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb (change) and enumerates the mutable fields of a specific resource (version). The surrounding text makes clear how it differs from create_version, delete_version and update_work_package.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives three concrete use cases (move sprint dates, close a finished release, widen sharing) and an explicit cross-reference block routing to list_versions for ids, delete_version when removal is required, and update_work_package(version=...) to move work packages instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_work_packageUpdate work packageA
Change any writable field of a work package, with optimistic locking done properly.
Use it to assign or unassign, move a status forward, re-schedule, re-parent, set progress, or write custom fields — one tool instead of many.
Returns the updated work package in full detail, including the new lock_version to use
for a follow-up edit.
Pitfalls: omitted parameters are left alone, while passing null clears a field
(assignee, responsible, version, sprint, parent, dates, description). A 409 error means
somebody else changed the work package first — the error carries the fresh lock_version
and the conflicting fields, so re-read and retry deliberately.
Ids come from get_work_package / list_work_packages; status, priority, type and
version values come from get_project_metadata; sprint ids come from list_sprints.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Work package id to change (#1234). | |
| date | No | Milestone date (YYYY-MM-DD); only valid on milestone types. | __unchanged__ |
| type | No | New type as a name or numeric id. Cannot be cleared. | |
| notify | No | Email notifications for this change. | |
| sprint | No | Numeric sprint id from list_sprints; null removes it. | __unchanged__ |
| status | No | New status as a name or id; invalid transitions list the reachable statuses. | |
| subject | No | New title. Omit to leave unchanged; cannot be cleared. | |
| version | No | Numeric version id; null removes it. | __unchanged__ |
| assignee | No | Numeric user id; omit to leave unchanged, null (or 'none') to unassign. | __unchanged__ |
| due_date | No | ISO date (YYYY-MM-DD); null clears it. | __unchanged__ |
| priority | No | New priority as a name or numeric id. | |
| parent_id | No | Re-parent under another id; null detaches to top level (the only hierarchy tool). | __unchanged__ |
| start_date | No | ISO date (YYYY-MM-DD); null clears it. | __unchanged__ |
| description | No | New markdown body; omit to leave unchanged, null to empty it. Replaces the whole text; read it first to append instead. | __unchanged__ |
| responsible | No | Numeric id of the accountable person; null clears it. | __unchanged__ |
| lock_version | No | The `lock_version` from get_work_package. Passing it makes a concurrent edit fail loudly (409); omitting it fetches and echoes the current version — safe, but a wider conflict window. | |
| story_points | No | Story points as a non-negative integer. | |
| custom_fields | No | Custom field writes keyed by wire key or display name, e.g. {'Severity': 'High'}. Unknown or non-writable keys fail listing the valid ones. Only passed keys are touched. | |
| estimated_hours | No | Estimate in hours, decimal. | |
| percentage_done | No | Progress 0-100. | |
| remaining_hours | No | Remaining work in hours, decimal. | |
| target_versions | No | Target version ids; [] clears, omit leaves unchanged. Multiple values need instance support. Mutually exclusive with version. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| date | No | |
| type | No | |
| notes | No | |
| author | No | |
| parent | No | |
| sprint | No | |
| status | No | |
| project | No | |
| subject | No | |
| version | No | |
| assignee | No | |
| category | No | |
| due_date | No | |
| priority | No | |
| available | No | |
| created_at | No | |
| display_id | No | |
| start_date | No | |
| updated_at | No | |
| description | No | |
| responsible | No | |
| spent_hours | No | |
| lock_version | No | |
| story_points | No | |
| custom_fields | No | |
| project_phase | No | |
| estimated_hours | No | |
| percentage_done | No | |
| remaining_hours | No | |
| target_versions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the optimistic locking contract, the meaning of a 409 conflict, the returned lock_version, and the omitted-vs-null pitfall. This gives the agent the context needed to handle concurrency and clearing safely.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then usage, return behavior, pitfalls, and ID sources. It is appropriately detailed for a 22-parameter mutation tool and does not waste sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex update tool with an output schema, it covers the important behavior an agent needs: locking, conflict handling, field clearing, return shape, and parameter sourcing. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by aggregating the omitted-versus-null semantics, explaining lock_version behavior, and naming the sibling tools that supply valid IDs and field values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: change any writable field of a work package. It also distinguishes this multi-field update tool from narrower operations by listing assign/unassign, status, scheduling, re-parenting, progress, and custom fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage examples and ID/value sources for parameters. It does not explicitly mention when to prefer the sibling bulk_update_work_packages tool, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_work_package_relationUpdate work package relationAIdempotent
Change an existing relation's type, lag or description.
Use it to widen the gap between a predecessor and its successor, to correct a link that was created with the wrong type, or to explain why two work packages are connected. Returns the updated relation.
Pitfalls. At least one of type, lag or description must be given.
Relations carry no lock version, so this is a plain overwrite with no
conflict detection — a concurrent edit is silently replaced; re-read the
relation if that matters. The two work packages cannot be changed here:
delete the relation and create a new one instead. Raising the lag on a
follows relation reschedules the successor, so dates can move.
Cross-references: create_work_package_relation makes one;
delete_work_package_relation removes it;
get_work_package(include=['relations']) lists the ids.
| Name | Required | Description | Default |
|---|---|---|---|
| lag | No | New lag in working days; valid only while the relation is 'follows' or 'precedes'. Omit to leave it untouched, pass 0 to remove an existing lag. When lag is given without type, the current type is read first and a lag on a non-scheduling relation is refused before any write. | |
| type | No | New relation type. Omit to keep the current one. Switching to or from 'follows'/'precedes' changes whether the relation schedules dates. | |
| description | No | New note for the relation. Omit to leave it untouched; pass an empty string to clear it. | |
| relation_id | Yes | Id of the relation to change. It comes from create_work_package_relation or get_work_package(include=['relations']) — it is not a work package id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| lag | No | |
| type | No | |
| description | No | |
| reverse_type | No | |
| to_work_package | No | |
| from_work_package | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses important behavior: at least one field must be supplied, there is no lock version or conflict detection, concurrent edits are silently overwritten, and lag changes on follows relations can reschedule the successor. These are operationally significant details not captured by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and use cases, then uses a compact Pitfalls section for constraints and a Cross-references section for alternatives. Despite its length, each part adds useful guidance for correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has annotations and an output schema, and the description covers the remaining operational risks: required-field behavior, overwrite semantics, scheduling side effects, and what cannot be changed. An agent has enough information to invoke it correctly and avoid common errors.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already explains type, lag, description, and relation_id semantics. The description reinforces key constraints, especially that at least one of type/lag/description is required and that linked work packages cannot be changed here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Change an existing relation's type, lag or description.' It also distinguishes this tool from siblings by naming create, delete, and get-with-relations alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete use cases: widening predecessor/successor gaps, correcting wrong link types, and explaining connections. It also names the alternatives explicitly and explains when to use delete+create instead of updating linked work packages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_attachmentUpload attachmentA
Attach a local file to a work package, wiki page, meeting, document, budget or comment.
Use it when a file that already exists on the server's machine should be added to an existing container. The file's existence and its size against this instance's maximumAttachmentFileSize are checked locally first, so an oversized file fails instantly instead of after the transfer.
Returns the created attachment row (id, file_name, size_bytes, content_type, description, author, created_at, status) — the id feeds download_attachment.
Pitfalls: uploading to a container needs edit permission on that container, so to give a brand-new work package its files use create_work_package(attachment_paths=[...]) instead, which uploads the files unattached and claims them on create. Instances may restrict extensions; a rejected type comes back as validation_failed with the allowlist hint and nothing is stored. The stored name comes from file_name (or the path's basename), never from the multipart part.
Related: list_attachments shows what a container already holds; download_attachment is the reverse direction.
| Name | Required | Description | Default |
|---|---|---|---|
| file_name | No | Name to store the file under, with extension. This is the only thing that decides the stored name: OpenProject ignores the multipart filename and re-detects the content type from the bytes. Defaults to the basename of file_path. | |
| file_path | Yes | Absolute path of the file to upload, on the machine running this server. Existence and size are checked locally before anything is transferred. | |
| description | No | Optional caption shown next to the file in OpenProject. | |
| container_id | Yes | Numeric id of the container: work package id, wiki page id, meeting id, document id, budget id, or activity id for 'comment'. | |
| container_type | Yes | Kind of object to attach the file to. Use 'comment' to attach to a work-package comment and pass its activity id as container_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| author | No | |
| status | No | |
| file_name | No | |
| created_at | No | |
| size_bytes | No | |
| description | No | |
| content_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the annotations (which only say non-readonly, non-destructive, non-idempotent), it discloses local existence/size pre-checks against maximumAttachmentFileSize, the edit-permission requirement, extension allowlist enforcement with validation_failed and no partial storage, and the naming rule that ignores the multipart part. That is exactly the failure-mode context an agent needs for a write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and usage, then return value, pitfalls, and related tools in clearly separated blocks. Slightly long, and the return-field list is arguably redundant with the output schema, but nearly every line carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite being a multi-container mutation with 5 parameters, the description covers preconditions, failure modes, naming, permissions, and sibling routing. Since an output schema exists, the brief return summary is sufficient rather than necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents file_name precedence, container_id per-type meaning, and the container_type enum. The description's notes on file_name and 'comment' mapping largely restate what the schema provides, so it adds little parameter-level meaning beyond baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource (attach a local file) and enumerates the exact container kinds it targets. It is immediately distinguishable from siblings like list_attachments and download_attachment, which are named as the reverse/other directions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the selection condition ('when a file that already exists on the server's machine should be added to an existing container') and gives an explicit alternative with the case that selects it: create_work_package(attachment_paths=[...]) for brand-new work packages because uploading requires edit permission on the container.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
88 tool updates
v0.4.0- Removed
add_meeting_agenda_item - Removed
add_meeting_outcome - Changed
add_work_package_comment54 fields changed- removed
Output schema / descriptionRemoved value: -"One journal entry: a comment, a set of field changes, or both.\n\nOpenProject aggregates a comment and the edits saved with it into a single\njournal entry, so ``kind='comment'`` entries can still carry ``details``." - changed
Output schema / properties / author / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / author / defaultRemoved value: -null - removed
Output schema / properties / author / descriptionRemoved value: -"User who wrote the entry." - removed
Output schema / properties / comment / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / comment / defaultRemoved value: -null - removed
Output schema / properties / comment / descriptionRemoved value: -"Comment body as markdown (raw); html is dropped. Cut to max_comment_chars when 'truncated' is true." - added
Output schema / properties / comment / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / comment_length / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / comment_length / defaultRemoved value: -null - removed
Output schema / properties / comment_length / descriptionRemoved value: -"Character length of the untruncated comment; set only when truncated." - added
Output schema / properties / comment_length / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / details / descriptionRemoved value: -"Field changes recorded with this entry; always a list, empty for a comment-only entry." - removed
Output schema / properties / details / items / descriptionRemoved value: -"One field change inside a journal entry, parsed into its parts." - removed
Output schema / properties / details / items / properties / field / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / details / items / properties / field / defaultRemoved value: -null - removed
Output schema / properties / details / items / properties / field / descriptionRemoved value: -"Changed field as OpenProject labels it, e.g. 'Status', 'Start date'." - added
Output schema / properties / details / items / properties / field / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / details / items / properties / from / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / details / items / properties / from / defaultRemoved value: -null - removed
Output schema / properties / details / items / properties / from / descriptionRemoved value: -"Previous value; null when the field was set for the first time." - added
Output schema / properties / details / items / properties / from / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / details / items / properties / text / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / details / items / properties / text / defaultRemoved value: -null - removed
Output schema / properties / details / items / properties / text / descriptionRemoved value: -"The change as OpenProject phrases it, kept verbatim for anything the parser could not split (attachment adds, diff-only notes)." - added
Output schema / properties / details / items / properties / text / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / details / items / properties / to / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / details / items / properties / to / defaultRemoved value: -null - removed
Output schema / properties / details / items / properties / to / descriptionRemoved value: -"New value; null when the field was cleared." - added
Output schema / properties / details / items / properties / to / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Activity id. Pass it back as list_work_package_comments(activity_id=...) to read a truncated comment in full." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / internal / defaultRemoved value: -false - removed
Output schema / properties / internal / descriptionRemoved value: -"True for internal (project-member-only) comments; OpenProject >= 16." - removed
Output schema / properties / kind / descriptionRemoved value: -"'comment' when the entry carries comment text, 'field_change' otherwise." - removed
Output schema / properties / truncated / defaultRemoved value: -false - removed
Output schema / properties / truncated / descriptionRemoved value: -"True when the comment was cut to max_comment_chars." - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp of the last edit." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / version / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / version / defaultRemoved value: -null - removed
Output schema / properties / version / descriptionRemoved value: -"Journal version number of this entry within the work package." - added
Output schema / properties / version / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / work_package / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / work_package / defaultRemoved value: -null - removed
Output schema / properties / work_package / descriptionRemoved value: -"Work package the entry belongs to."
- Changed
add_work_package_watcher11 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of adding or removing one watcher." - removed
Output schema / properties / changed / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / changed / defaultRemoved value: -null - removed
Output schema / properties / changed / descriptionRemoved value: -"True when this call actually changed the watcher list, false when the user was already watching. Null when OpenProject does not report it — removals answer 204 whether or not the user was watching." - added
Output schema / properties / changed / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation." - changed
Output schema / properties / user / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / defaultRemoved value: -null - removed
Output schema / properties / user / descriptionRemoved value: -"The watcher. 'id' is the user id; 'name' is filled in only when OpenProject returned the user resource (it does on add, not on remove)." - removed
Output schema / properties / watching / descriptionRemoved value: -"Watch state after the call: true after adding, false after removing." - removed
Output schema / properties / work_package_id / descriptionRemoved value: -"Work package whose watcher list was changed."
- Changed
bulk_update_work_packages8 fields changed- removed
Output schema / properties / items / items / properties / changes / items / properties / after / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / changes / items / properties / before / defaultRemoved value: -null - changed
Output schema / properties / items / items / properties / error / anyOfPrevious value: -[ - { - "additionalProperties": true, - "description": "The body of the structured tool error.", - "properties": { - "error_identifier": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "OpenProject error identifier urn, when provided." - }, - "hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "How to fix it (always English)." - }, - "http_status": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Upstream HTTP status, if any." - }, - "message": { - "description": "What went wrong, in plain language.", - "type": "string" - }, - "type": { - "description": "Taxonomy member, e.g. 'validation_failed'.", - "type": "string" - }, - "violations": { - "anyOf": [ - { - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Field-level problems: [{attribute, message}]." - } - }, - "required": [ - "type", - "message" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "error_identifier": { + "type": [ + "string", + "null" + ] + }, + "hint": { + "type": [ + "string", + "null" + ] + }, + "http_status": { + "type": [ + "integer", + "null" + ] + }, + "message": { + "type": "string" + }, + "type": { + "type": "string" + }, + "violations": { + "anyOf": [ + { + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "type", + "message" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / error / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / lock_version / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / lock_version / defaultRemoved value: -null - added
Output schema / properties / items / items / properties / lock_version / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / items / items / properties / notes / defaultRemoved value: -null
- Removed
cancel_recurring_meeting_occurrence - Changed
copy_project22 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of ``copy_project`` — a *started* job, never a finished copy." - removed
Output schema / properties / job_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / job_id / defaultRemoved value: -null - removed
Output schema / properties / job_id / descriptionRemoved value: -"Background job id — pass it to get_job_status. Null when the instance reported none; 'notes' then says what to do instead." - added
Output schema / properties / job_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / message / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / message / defaultRemoved value: -null - removed
Output schema / properties / message / descriptionRemoved value: -"Message the job reported, when it carried one." - added
Output schema / properties / message / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / new_name / descriptionRemoved value: -"Name requested for the copy." - removed
Output schema / properties / notes / descriptionRemoved value: -"What is still outstanding. Always says the copy has to be polled." - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"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." - removed
Output schema / properties / scheduled / descriptionRemoved value: -"True once OpenProject accepted the request. The copy itself runs in the background and is not finished when this is true." - removed
Output schema / properties / source / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - removed
Output schema / properties / source / descriptionRemoved value: -"The project id or identifier that was copied." - added
Output schema / properties / source / typeAdded value: +[ + "integer", + "string" +] - removed
Output schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status / defaultRemoved value: -null - removed
Output schema / properties / status / descriptionRemoved value: -"Job state at the moment the copy was accepted, normally 'in_queue'. Null when the instance reported none." - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +]
- Removed
create_meeting - Removed
create_news - Changed
create_project48 fields changed- removed
Output schema / descriptionRemoved value: -"Full project detail: the row plus text fields and timestamps." - removed
Output schema / properties / active / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / active / defaultRemoved value: -null - removed
Output schema / properties / active / descriptionRemoved value: -"False for archived projects (read-only in the UI)." - added
Output schema / properties / active / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Description as markdown (raw); html is dropped." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Numeric project id; accepted by every project_id parameter." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / identifier / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / identifier / defaultRemoved value: -null - removed
Output schema / properties / identifier / descriptionRemoved value: -"URL slug from /projects/<identifier>; also accepted wherever an id is." - added
Output schema / properties / identifier / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / name / defaultRemoved value: -null - removed
Output schema / properties / name / descriptionRemoved value: -"Display name." - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / parent / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / parent / defaultRemoved value: -null - removed
Output schema / properties / parent / descriptionRemoved value: -"Parent project, when this is a subproject." - removed
Output schema / properties / public / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / public / defaultRemoved value: -null - removed
Output schema / properties / public / descriptionRemoved value: -"True when visible to users without a membership." - added
Output schema / properties / public / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / status_code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status_code / defaultRemoved value: -null - removed
Output schema / properties / status_code / descriptionRemoved value: -"Project status code, one of: on_track, at_risk, off_track, not_started, finished, discontinued. A code, never a translated label; null means no status has been set." - added
Output schema / properties / status_code / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / status_explanation / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status_explanation / defaultRemoved value: -null - removed
Output schema / properties / status_explanation / descriptionRemoved value: -"Free-text explanation of status_code, markdown (raw)." - added
Output schema / properties / status_explanation / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / workspace_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / workspace_type / defaultRemoved value: -null - removed
Output schema / properties / workspace_type / descriptionRemoved value: -"Workspace kind: 'project', 'program' or 'portfolio'. Pre-17 instances only have 'project'; on 17.x project listings mix all three kinds, so check this before treating a row as a plain project." - added
Output schema / properties / workspace_type / typeAdded value: +[ + "string", + "null" +]
- Removed
create_recurring_meeting - Changed
create_version42 fields changed- removed
Output schema / descriptionRemoved value: -"A single version as the write tools return it." - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Description as markdown (raw); html is dropped." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / end_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / end_date / defaultRemoved value: -null - removed
Output schema / properties / end_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD); the version's finish date." - added
Output schema / properties / end_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Version id — what update_version, delete_version and the work-package 'version' field consume." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / name / defaultRemoved value: -null - removed
Output schema / properties / name / descriptionRemoved value: -"Version name, e.g. 'Sprint 12' or '2.1'." - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"The project that DEFINES the version. A version shared from a parent project shows that parent here, not the project you asked about." - removed
Output schema / properties / sharing / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / sharing / defaultRemoved value: -null - removed
Output schema / properties / sharing / descriptionRemoved value: -"How far the version is shared: none, descendants, hierarchy, tree, system." - added
Output schema / properties / sharing / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / source / defaultRemoved value: -"version" - removed
Output schema / properties / source / descriptionRemoved value: -"'sprint' when the row came from the backlogs sprints endpoint, 'version' otherwise. Sprints ARE versions upstream, so a row can be both and is then reported as 'sprint'." - removed
Output schema / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / start_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status / defaultRemoved value: -null - removed
Output schema / properties / status / descriptionRemoved value: -"open, locked or closed. Locked and closed versions reject new work package assignments." - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +]
- Changed
create_work_package128 fields changed- changed
Input schema / properties / attachment_paths / descriptionPrevious value: -"Local file paths to attach (stdio transport only — the server must share your filesystem)."New value: +"Paths on the server's machine to attach. Over HTTP they must lie inside OPENPROJECT_MCP_UPLOAD_ROOT, and are refused when it is unset." - removed
Output schema / descriptionRemoved value: -"Detail projection plus the milestone ``date`` field.\n\nMilestone types carry a single ``date`` instead of ``start_date``/\n``due_date``; both shapes are surfaced so a caller never has to guess." - changed
Output schema / properties / assignee / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / assignee / defaultRemoved value: -null - removed
Output schema / properties / assignee / descriptionRemoved value: -"Assigned user or group." - changed
Output schema / properties / author / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / author / defaultRemoved value: -null - removed
Output schema / properties / author / descriptionRemoved value: -"Creating user." - removed
Output schema / properties / available / defaultRemoved value: -null - removed
Output schema / properties / available / descriptionRemoved value: -"Feature availability for this WP: dev links, meetings, files." - changed
Output schema / properties / category / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / category / defaultRemoved value: -null - removed
Output schema / properties / category / descriptionRemoved value: -"Category." - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / custom_fields / descriptionRemoved value: -"Always a list; empty when none are set." - removed
Output schema / properties / custom_fields / items / descriptionRemoved value: -"Canonical custom-field read shape." - removed
Output schema / properties / custom_fields / items / properties / key / descriptionRemoved value: -"Wire key, e.g. 'customField12'." - removed
Output schema / properties / custom_fields / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / custom_fields / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / name / descriptionRemoved value: -"Display name, e.g. 'Severity'." - added
Output schema / properties / custom_fields / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / custom_fields / items / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / custom_fields / items / properties / type / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / type / descriptionRemoved value: -"Schema type, e.g. 'list', 'string'." - added
Output schema / properties / custom_fields / items / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / custom_fields / items / properties / value / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / value / descriptionRemoved value: -"Scalar value or resolved name(s)." - changed
Output schema / properties / custom_fields / items / properties / value_ids / anyOfPrevious value: -[ - { - "items": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ] - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "type": [ + "integer", + "string" + ] + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / custom_fields / items / properties / value_ids / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / value_ids / descriptionRemoved value: -"Ids for list/user/version custom fields." - removed
Output schema / properties / date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / date / defaultRemoved value: -null - removed
Output schema / properties / date / descriptionRemoved value: -"Milestone date (ISO YYYY-MM-DD); null for non-milestones." - added
Output schema / properties / date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Description as markdown (raw); html is dropped." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / display_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / display_id / defaultRemoved value: -null - removed
Output schema / properties / display_id / descriptionRemoved value: -"Human-facing id as the instance renders it. Matches the numeric id unless the instance uses semantic identifiers (17.x, e.g. 'PROJ-42'); null when the instance predates it." - added
Output schema / properties / display_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / due_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / due_date / defaultRemoved value: -null - removed
Output schema / properties / due_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / due_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / estimated_hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / estimated_hours / defaultRemoved value: -null - removed
Output schema / properties / estimated_hours / descriptionRemoved value: -"Estimate in hours." - added
Output schema / properties / estimated_hours / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Work package id." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / lock_version / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / lock_version / defaultRemoved value: -null - removed
Output schema / properties / lock_version / descriptionRemoved value: -"Optimistic-locking version; pass to update_work_package." - added
Output schema / properties / lock_version / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation notes for this result." - changed
Output schema / properties / parent / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / parent / defaultRemoved value: -null - removed
Output schema / properties / parent / descriptionRemoved value: -"Parent work package." - removed
Output schema / properties / percentage_done / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / percentage_done / defaultRemoved value: -null - removed
Output schema / properties / percentage_done / descriptionRemoved value: -"Progress, 0-100." - added
Output schema / properties / percentage_done / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / priority / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / priority / defaultRemoved value: -null - removed
Output schema / properties / priority / descriptionRemoved value: -"Priority." - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"Owning project." - changed
Output schema / properties / project_phase / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project_phase / defaultRemoved value: -null - removed
Output schema / properties / project_phase / descriptionRemoved value: -"Project phase this work package sits in (16.1+, only when phases are active in the project and visible to this user); details via get_project_phase." - removed
Output schema / properties / remaining_hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / remaining_hours / defaultRemoved value: -null - removed
Output schema / properties / remaining_hours / descriptionRemoved value: -"Remaining work in hours." - added
Output schema / properties / remaining_hours / typeAdded value: +[ + "number", + "null" +] - changed
Output schema / properties / responsible / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / responsible / defaultRemoved value: -null - removed
Output schema / properties / responsible / descriptionRemoved value: -"Accountable user." - removed
Output schema / properties / spent_hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / spent_hours / defaultRemoved value: -null - removed
Output schema / properties / spent_hours / descriptionRemoved value: -"Logged time in hours." - added
Output schema / properties / spent_hours / typeAdded value: +[ + "number", + "null" +] - changed
Output schema / properties / sprint / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / sprint / defaultRemoved value: -null - removed
Output schema / properties / sprint / descriptionRemoved value: -"The sprint the work package is planned in; null when unassigned." - removed
Output schema / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / start_date / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / status / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / status / defaultRemoved value: -null - removed
Output schema / properties / status / descriptionRemoved value: -"Status." - removed
Output schema / properties / story_points / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / story_points / defaultRemoved value: -null - removed
Output schema / properties / story_points / descriptionRemoved value: -"Story points." - added
Output schema / properties / story_points / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / subject / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / subject / defaultRemoved value: -null - removed
Output schema / properties / subject / descriptionRemoved value: -"Subject line." - added
Output schema / properties / subject / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / target_versions / descriptionRemoved value: -"All target versions; legacy instances yield zero or one." - removed
Output schema / properties / target_versions / items / descriptionRemoved value: -"A reference to another resource. Canonical output shape." - removed
Output schema / properties / target_versions / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / target_versions / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / target_versions / items / properties / id / descriptionRemoved value: -"Resource id." - added
Output schema / properties / target_versions / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / target_versions / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / target_versions / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / target_versions / items / properties / name / descriptionRemoved value: -"Human-readable name." - added
Output schema / properties / target_versions / items / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / type / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / type / defaultRemoved value: -null - removed
Output schema / properties / type / descriptionRemoved value: -"Work package type." - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / version / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / version / defaultRemoved value: -null - removed
Output schema / properties / version / descriptionRemoved value: -"Legacy alias: the sole target version, or null for zero/multiple."
- Changed
create_work_package_relation27 fields changed- removed
Output schema / descriptionRemoved value: -"One work-package relation.\n\nThe two endpoints that produce relations — the ``relations`` include of\n``get_work_package`` and the relation write tools — return this same shape.\n``from_work_package``/``to_work_package`` are spelled out because the wire's\n``from``/``to`` read as prepositions rather than as the two ends of an edge." - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Free-text note stored on the relation; null when unset." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / from_work_package / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / from_work_package / defaultRemoved value: -null - removed
Output schema / properties / from_work_package / descriptionRemoved value: -"Work package the relation starts at." - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Relation id. Pass it to update_work_package_relation or delete_work_package_relation — it is not a work package id." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / lag / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / lag / defaultRemoved value: -null - removed
Output schema / properties / lag / descriptionRemoved value: -"Working days kept between the predecessor and the successor. Only follows/precedes relations carry one; null everywhere else." - added
Output schema / properties / lag / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / reverse_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / reverse_type / defaultRemoved value: -null - removed
Output schema / properties / reverse_type / descriptionRemoved value: -"The same relation read from the 'to' work package: 'follows' <-> 'precedes', 'blocks' <-> 'blocked', 'relates' <-> 'relates'." - added
Output schema / properties / reverse_type / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / to_work_package / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / to_work_package / defaultRemoved value: -null - removed
Output schema / properties / to_work_package / descriptionRemoved value: -"Work package the relation points to." - removed
Output schema / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / type / defaultRemoved value: -null - removed
Output schema / properties / type / descriptionRemoved value: -"Relation type as OpenProject stored it, read from the 'from' work package (e.g. 'follows' means 'from' is scheduled after 'to')." - added
Output schema / properties / type / typeAdded value: +[ + "string", + "null" +]
- Changed
delete_attachment11 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of ``delete_attachment``." - changed
Output schema / properties / container / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / container / defaultRemoved value: -null - removed
Output schema / properties / container / descriptionRemoved value: -"Object the file was attached to (work package, wiki page, meeting, ...); null for an uploaded file that was never claimed by one." - removed
Output schema / properties / deleted / descriptionRemoved value: -"True once OpenProject accepted the deletion." - removed
Output schema / properties / file_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / file_name / defaultRemoved value: -null - removed
Output schema / properties / file_name / descriptionRemoved value: -"Name of the file that was removed, read before deleting it." - added
Output schema / properties / file_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / descriptionRemoved value: -"Id of the attachment that was deleted." - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation."
- Removed
delete_meeting - Removed
delete_meeting_agenda_item - Removed
delete_meeting_outcome - Removed
delete_news - Changed
delete_project10 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of ``delete_project`` — a *scheduled* deletion, never a finished one." - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - removed
Output schema / properties / id / descriptionRemoved value: -"The project id or identifier the deletion was asked for." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string" +] - removed
Output schema / properties / job_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / job_id / defaultRemoved value: -null - removed
Output schema / properties / job_id / descriptionRemoved value: -"Background job id, when the instance reported one; null otherwise. OpenProject exposes it at /api/v3/job_statuses/{id}." - added
Output schema / properties / job_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / message / descriptionRemoved value: -"What was scheduled, in plain language." - removed
Output schema / properties / scheduled / descriptionRemoved value: -"True once OpenProject accepted the request. Deletion runs as a background job, so the project can still be readable for a while afterwards."
- Removed
delete_recurring_meeting - Changed
delete_time_entry4 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of ``delete_time_entry``." - removed
Output schema / properties / deleted / descriptionRemoved value: -"True once OpenProject accepted the deletion." - removed
Output schema / properties / id / descriptionRemoved value: -"Id of the time entry that was deleted." - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation."
- Changed
delete_version4 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of ``delete_version``." - removed
Output schema / properties / deleted / descriptionRemoved value: -"True once OpenProject accepted the deletion." - removed
Output schema / properties / id / descriptionRemoved value: -"Id of the version that was deleted." - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation."
- Changed
delete_work_package4 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of ``delete_work_package``." - removed
Output schema / properties / deleted / descriptionRemoved value: -"True once OpenProject accepted the deletion." - removed
Output schema / properties / id / descriptionRemoved value: -"Id of the work package that was deleted." - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation."
- Changed
delete_work_package_relation4 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of ``delete_work_package_relation``." - removed
Output schema / properties / deleted / descriptionRemoved value: -"True once OpenProject accepted the deletion." - removed
Output schema / properties / id / descriptionRemoved value: -"Id of the relation that was deleted." - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation."
- Changed
download_attachment11 fields changed- removed
Output schema / descriptionRemoved value: -"Where the bytes landed and what they were." - removed
Output schema / properties / content_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / content_type / defaultRemoved value: -null - removed
Output schema / properties / content_type / descriptionRemoved value: -"MIME type reported by OpenProject." - added
Output schema / properties / content_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / file_name / descriptionRemoved value: -"Name the file was saved under; may differ from the attachment's own name when it collided with an existing file." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: renamed target, image not shown inline, …" - removed
Output schema / properties / path / descriptionRemoved value: -"Absolute path of the saved file on the MCP server's machine." - removed
Output schema / properties / sha256 / descriptionRemoved value: -"SHA-256 of the downloaded bytes, hex encoded." - removed
Output schema / properties / size_bytes / descriptionRemoved value: -"Bytes actually written to disk."
- Changed
edit_work_package_comment54 fields changed- removed
Output schema / descriptionRemoved value: -"One journal entry: a comment, a set of field changes, or both.\n\nOpenProject aggregates a comment and the edits saved with it into a single\njournal entry, so ``kind='comment'`` entries can still carry ``details``." - changed
Output schema / properties / author / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / author / defaultRemoved value: -null - removed
Output schema / properties / author / descriptionRemoved value: -"User who wrote the entry." - removed
Output schema / properties / comment / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / comment / defaultRemoved value: -null - removed
Output schema / properties / comment / descriptionRemoved value: -"Comment body as markdown (raw); html is dropped. Cut to max_comment_chars when 'truncated' is true." - added
Output schema / properties / comment / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / comment_length / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / comment_length / defaultRemoved value: -null - removed
Output schema / properties / comment_length / descriptionRemoved value: -"Character length of the untruncated comment; set only when truncated." - added
Output schema / properties / comment_length / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / details / descriptionRemoved value: -"Field changes recorded with this entry; always a list, empty for a comment-only entry." - removed
Output schema / properties / details / items / descriptionRemoved value: -"One field change inside a journal entry, parsed into its parts." - removed
Output schema / properties / details / items / properties / field / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / details / items / properties / field / defaultRemoved value: -null - removed
Output schema / properties / details / items / properties / field / descriptionRemoved value: -"Changed field as OpenProject labels it, e.g. 'Status', 'Start date'." - added
Output schema / properties / details / items / properties / field / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / details / items / properties / from / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / details / items / properties / from / defaultRemoved value: -null - removed
Output schema / properties / details / items / properties / from / descriptionRemoved value: -"Previous value; null when the field was set for the first time." - added
Output schema / properties / details / items / properties / from / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / details / items / properties / text / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / details / items / properties / text / defaultRemoved value: -null - removed
Output schema / properties / details / items / properties / text / descriptionRemoved value: -"The change as OpenProject phrases it, kept verbatim for anything the parser could not split (attachment adds, diff-only notes)." - added
Output schema / properties / details / items / properties / text / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / details / items / properties / to / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / details / items / properties / to / defaultRemoved value: -null - removed
Output schema / properties / details / items / properties / to / descriptionRemoved value: -"New value; null when the field was cleared." - added
Output schema / properties / details / items / properties / to / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Activity id. Pass it back as list_work_package_comments(activity_id=...) to read a truncated comment in full." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / internal / defaultRemoved value: -false - removed
Output schema / properties / internal / descriptionRemoved value: -"True for internal (project-member-only) comments; OpenProject >= 16." - removed
Output schema / properties / kind / descriptionRemoved value: -"'comment' when the entry carries comment text, 'field_change' otherwise." - removed
Output schema / properties / truncated / defaultRemoved value: -false - removed
Output schema / properties / truncated / descriptionRemoved value: -"True when the comment was cut to max_comment_chars." - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp of the last edit." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / version / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / version / defaultRemoved value: -null - removed
Output schema / properties / version / descriptionRemoved value: -"Journal version number of this entry within the work package." - added
Output schema / properties / version / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / work_package / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / work_package / defaultRemoved value: -null - removed
Output schema / properties / work_package / descriptionRemoved value: -"Work package the entry belongs to."
- Changed
enable_tool_group6 fields changed- removed
Output schema / descriptionRemoved value: -"What ``enable_tool_group`` changed in this session's tool list." - removed
Output schema / properties / group / descriptionRemoved value: -"The group tag that was asked for, e.g. 'meetings'." - removed
Output schema / properties / notes / descriptionRemoved value: -"Why some tools of the group stay hidden (read-only mode, operator-disabled sub-groups); empty when the whole group is now visible." - removed
Output schema / properties / status / descriptionRemoved value: -"'enabled' when this call revealed tools; 'already_visible' when the group was already in this session's tool list and nothing changed." - removed
Output schema / properties / title / descriptionRemoved value: -"Human-readable group name, as the README heads its table." - removed
Output schema / properties / tools_enabled / descriptionRemoved value: -"Tool names that became callable in this session, sorted. Re-read the tool list to get their schemas."
- Changed
execute_custom_action44 fields changed- removed
Output schema / descriptionRemoved value: -"Compact work-package row for list results." - changed
Output schema / properties / assignee / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / assignee / defaultRemoved value: -null - removed
Output schema / properties / assignee / descriptionRemoved value: -"Assigned user or group." - removed
Output schema / properties / display_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / display_id / defaultRemoved value: -null - removed
Output schema / properties / display_id / descriptionRemoved value: -"Human-facing id as the instance renders it. Matches the numeric id unless the instance uses semantic identifiers (17.x, e.g. 'PROJ-42'); null when the instance predates it." - added
Output schema / properties / display_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / due_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / due_date / defaultRemoved value: -null - removed
Output schema / properties / due_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / due_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Work package id." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / percentage_done / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / percentage_done / defaultRemoved value: -null - removed
Output schema / properties / percentage_done / descriptionRemoved value: -"Progress, 0-100." - added
Output schema / properties / percentage_done / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / priority / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / priority / defaultRemoved value: -null - removed
Output schema / properties / priority / descriptionRemoved value: -"Priority." - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"Owning project." - removed
Output schema / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / start_date / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / status / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / status / defaultRemoved value: -null - removed
Output schema / properties / status / descriptionRemoved value: -"Status." - removed
Output schema / properties / subject / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / subject / defaultRemoved value: -null - removed
Output schema / properties / subject / descriptionRemoved value: -"Subject line." - added
Output schema / properties / subject / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / type / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / type / defaultRemoved value: -null - removed
Output schema / properties / type / descriptionRemoved value: -"Work package type." - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +]
- Removed
get_document - Removed
get_github_pull_request - Changed
get_instance_info59 fields changed- removed
Output schema / descriptionRemoved value: -"Connection test result plus what this instance supports." - removed
Output schema / properties / api_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / api_url / defaultRemoved value: -null - removed
Output schema / properties / api_url / descriptionRemoved value: -"API base URL this server talks to." - added
Output schema / properties / api_url / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / core_version / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / core_version / defaultRemoved value: -null - removed
Output schema / properties / core_version / descriptionRemoved value: -"OpenProject core version, e.g. '17.7.1'." - added
Output schema / properties / core_version / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / current_user / descriptionRemoved value: -"Who this server is authenticated as." - removed
Output schema / properties / current_user / properties / admin / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / current_user / properties / admin / defaultRemoved value: -null - removed
Output schema / properties / current_user / properties / admin / descriptionRemoved value: -"True for instance administrators; null when not disclosed." - added
Output schema / properties / current_user / properties / admin / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / current_user / properties / email / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / current_user / properties / email / defaultRemoved value: -null - removed
Output schema / properties / current_user / properties / email / descriptionRemoved value: -"Mail address, when the API exposes it." - added
Output schema / properties / current_user / properties / email / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / current_user / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / current_user / properties / id / defaultRemoved value: -null - removed
Output schema / properties / current_user / properties / id / descriptionRemoved value: -"Numeric user id." - added
Output schema / properties / current_user / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / current_user / properties / login / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / current_user / properties / login / defaultRemoved value: -null - removed
Output schema / properties / current_user / properties / login / descriptionRemoved value: -"Login handle." - added
Output schema / properties / current_user / properties / login / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / current_user / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / current_user / properties / name / defaultRemoved value: -null - removed
Output schema / properties / current_user / properties / name / descriptionRemoved value: -"Display name." - added
Output schema / properties / current_user / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / features / descriptionRemoved value: -"Probed feature availability; read it before using gated params." - removed
Output schema / properties / features / properties / capabilities_context_prefix / defaultRemoved value: -null - removed
Output schema / properties / features / properties / capabilities_context_prefix / descriptionRemoved value: -"Project context prefix for the capabilities API." - removed
Output schema / properties / features / properties / core_version / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / features / properties / core_version / defaultRemoved value: -null - removed
Output schema / properties / features / properties / core_version / descriptionRemoved value: -"OpenProject core version string, e.g. '17.7.1'." - added
Output schema / properties / features / properties / core_version / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / features / properties / instance_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / features / properties / instance_name / defaultRemoved value: -null - removed
Output schema / properties / features / properties / instance_name / descriptionRemoved value: -"Configured instance name." - added
Output schema / properties / features / properties / instance_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / features / properties / notes / descriptionRemoved value: -"Degradation markers for anything undetectable." - removed
Output schema / properties / features / properties / supports_emoji_reactions / defaultRemoved value: -false - removed
Output schema / properties / features / properties / supports_emoji_reactions / descriptionRemoved value: -"Emoji reactions on activities; OpenProject >= 16." - removed
Output schema / properties / features / properties / supports_internal_comments / defaultRemoved value: -false - removed
Output schema / properties / features / properties / supports_internal_comments / descriptionRemoved value: -"Internal (private) work-package comments; OpenProject >= 16." - removed
Output schema / properties / features / properties / supports_project_favorites / defaultRemoved value: -false - removed
Output schema / properties / features / properties / supports_project_favorites / descriptionRemoved value: -"Project favorite endpoints; OpenProject >= 17." - removed
Output schema / properties / features / properties / time_entry_work_package_filter / defaultRemoved value: -null - removed
Output schema / properties / features / properties / time_entry_work_package_filter / descriptionRemoved value: -"Filter name for scoping time entries to a work package." - removed
Output schema / properties / instance_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / instance_name / defaultRemoved value: -null - removed
Output schema / properties / instance_name / descriptionRemoved value: -"Configured instance name." - added
Output schema / properties / instance_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / maximum_attachment_file_size_bytes / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / maximum_attachment_file_size_bytes / defaultRemoved value: -null - removed
Output schema / properties / maximum_attachment_file_size_bytes / descriptionRemoved value: -"Upload ceiling; upload_attachment pre-flights against it." - added
Output schema / properties / maximum_attachment_file_size_bytes / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / per_page_options / descriptionRemoved value: -"Page sizes the instance offers; the largest is the effective page_size cap."
- Changed
get_job_status26 fields changed- removed
Output schema / descriptionRemoved value: -"One background job as ``GET /job_statuses/{uuid}`` reports it." - removed
Output schema / properties / finished / descriptionRemoved value: -"True once status is terminal. False means the job is still running — poll again rather than reporting a result." - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Job id (a uuid) this status belongs to." - added
Output schema / properties / id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / message / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / message / defaultRemoved value: -null - removed
Output schema / properties / message / descriptionRemoved value: -"What the job reported, e.g. why it failed." - added
Output schema / properties / message / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: still running, or a reference that had to be derived." - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"Project the job produced or acted on ({id, name}), when it names one — this is how a finished copy_project job hands back the new project." - removed
Output schema / properties / result_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / result_url / defaultRemoved value: -null - removed
Output schema / properties / result_url / descriptionRemoved value: -"Web URL the job stored for its result (the new project, an export download). A UI URL, not an API endpoint." - added
Output schema / properties / result_url / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status / defaultRemoved value: -null - removed
Output schema / properties / status / descriptionRemoved value: -"Job state: 'in_queue' or 'in_process' while it runs, 'success', 'failure', 'error' or 'cancelled' once it is over." - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / successful / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / successful / defaultRemoved value: -null - removed
Output schema / properties / successful / descriptionRemoved value: -"True when the job finished successfully, false when it failed, null while it is still running. Never guess from 'finished' alone." - added
Output schema / properties / successful / typeAdded value: +[ + "boolean", + "null" +]
- Removed
get_meeting - Removed
get_news - Changed
get_project48 fields changed- removed
Output schema / descriptionRemoved value: -"Full project detail: the row plus text fields and timestamps." - removed
Output schema / properties / active / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / active / defaultRemoved value: -null - removed
Output schema / properties / active / descriptionRemoved value: -"False for archived projects (read-only in the UI)." - added
Output schema / properties / active / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Description as markdown (raw); html is dropped." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Numeric project id; accepted by every project_id parameter." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / identifier / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / identifier / defaultRemoved value: -null - removed
Output schema / properties / identifier / descriptionRemoved value: -"URL slug from /projects/<identifier>; also accepted wherever an id is." - added
Output schema / properties / identifier / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / name / defaultRemoved value: -null - removed
Output schema / properties / name / descriptionRemoved value: -"Display name." - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / parent / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / parent / defaultRemoved value: -null - removed
Output schema / properties / parent / descriptionRemoved value: -"Parent project, when this is a subproject." - removed
Output schema / properties / public / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / public / defaultRemoved value: -null - removed
Output schema / properties / public / descriptionRemoved value: -"True when visible to users without a membership." - added
Output schema / properties / public / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / status_code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status_code / defaultRemoved value: -null - removed
Output schema / properties / status_code / descriptionRemoved value: -"Project status code, one of: on_track, at_risk, off_track, not_started, finished, discontinued. A code, never a translated label; null means no status has been set." - added
Output schema / properties / status_code / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / status_explanation / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status_explanation / defaultRemoved value: -null - removed
Output schema / properties / status_explanation / descriptionRemoved value: -"Free-text explanation of status_code, markdown (raw)." - added
Output schema / properties / status_explanation / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / workspace_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / workspace_type / defaultRemoved value: -null - removed
Output schema / properties / workspace_type / descriptionRemoved value: -"Workspace kind: 'project', 'program' or 'portfolio'. Pre-17 instances only have 'project'; on 17.x project listings mix all three kinds, so check this before treating a row as a plain project." - added
Output schema / properties / workspace_type / typeAdded value: +[ + "string", + "null" +]
- Changed
get_project_metadata87 fields changed- removed
Output schema / descriptionRemoved value: -"The ids and names that are valid here." - changed
Output schema / properties / categories / anyOfPrevious value: -[ - { - "items": { - "description": "A work-package category, defined per project.", - "properties": { - "default_assignee": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "User auto-assigned when this category is chosen." - }, - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id — pass this, not the name." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Display name as this instance spells it." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "default_assignee": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / categories / defaultRemoved value: -null - removed
Output schema / properties / categories / descriptionRemoved value: -"Project categories; null unless project_id was given." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation notes: modules off, permissions missing." - removed
Output schema / properties / priorities / descriptionRemoved value: -"All priorities." - removed
Output schema / properties / priorities / items / descriptionRemoved value: -"A work-package priority. Ids are instance-specific — never hardcode them." - removed
Output schema / properties / priorities / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / priorities / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / priorities / items / properties / id / descriptionRemoved value: -"Resource id — pass this, not the name." - added
Output schema / properties / priorities / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / priorities / items / properties / is_active / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / priorities / items / properties / is_active / defaultRemoved value: -null - removed
Output schema / properties / priorities / items / properties / is_active / descriptionRemoved value: -"False for retired priorities." - added
Output schema / properties / priorities / items / properties / is_active / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / priorities / items / properties / is_default / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / priorities / items / properties / is_default / defaultRemoved value: -null - removed
Output schema / properties / priorities / items / properties / is_default / descriptionRemoved value: -"Applied when none is given." - added
Output schema / properties / priorities / items / properties / is_default / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / priorities / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / priorities / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / priorities / items / properties / name / descriptionRemoved value: -"Display name as this instance spells it." - added
Output schema / properties / priorities / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / project_id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / project_id / defaultRemoved value: -null - removed
Output schema / properties / project_id / descriptionRemoved value: -"The project this was scoped to; null for the global sets." - added
Output schema / properties / project_id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / roles / descriptionRemoved value: -"All membership roles." - removed
Output schema / properties / roles / items / descriptionRemoved value: -"A membership role." - removed
Output schema / properties / roles / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / roles / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / roles / items / properties / id / descriptionRemoved value: -"Resource id — pass this, not the name." - added
Output schema / properties / roles / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / roles / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / roles / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / roles / items / properties / name / descriptionRemoved value: -"Display name as this instance spells it." - added
Output schema / properties / roles / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / statuses / descriptionRemoved value: -"All statuses, each with is_closed." - removed
Output schema / properties / statuses / items / descriptionRemoved value: -"A work-package status, with the flag that defines 'done'." - removed
Output schema / properties / statuses / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / statuses / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / statuses / items / properties / id / descriptionRemoved value: -"Resource id — pass this, not the name." - added
Output schema / properties / statuses / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / statuses / items / properties / is_closed / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / statuses / items / properties / is_closed / defaultRemoved value: -null - removed
Output schema / properties / statuses / items / properties / is_closed / descriptionRemoved value: -"Authoritative done/not-done flag — never classify by status name." - added
Output schema / properties / statuses / items / properties / is_closed / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / statuses / items / properties / is_default / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / statuses / items / properties / is_default / defaultRemoved value: -null - removed
Output schema / properties / statuses / items / properties / is_default / descriptionRemoved value: -"Status new work packages start in." - added
Output schema / properties / statuses / items / properties / is_default / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / statuses / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / statuses / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / statuses / items / properties / name / descriptionRemoved value: -"Display name as this instance spells it." - added
Output schema / properties / statuses / items / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / time_entry_activities / anyOfPrevious value: -[ - { - "items": { - "description": "A time-entry activity, discovered from the time-entry form (never hardcoded).", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id — pass this, not the name." - }, - "is_default": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Used when log_time omits activity." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Display name as this instance spells it." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "is_default": { + "type": [ + "boolean", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / time_entry_activities / defaultRemoved value: -null - removed
Output schema / properties / time_entry_activities / descriptionRemoved value: -"Activities log_time accepts here; null unless project_id was given." - removed
Output schema / properties / types / descriptionRemoved value: -"Work-package types; scoped to the project when project_id was given." - removed
Output schema / properties / types / items / descriptionRemoved value: -"A work-package type (Task, Bug, Milestone, …).\n\nOpenProject 17.7+ collapses type *variants* into their root type: the global\nlisting returns fewer types than older versions showed, and variant-aware\ninstances fill ``own_name``/``parent`` on the variants that do appear." - removed
Output schema / properties / types / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / types / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / types / items / properties / id / descriptionRemoved value: -"Resource id — pass this, not the name." - added
Output schema / properties / types / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / types / items / properties / is_default / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / types / items / properties / is_default / defaultRemoved value: -null - removed
Output schema / properties / types / items / properties / is_default / descriptionRemoved value: -"Pre-selected for new work packages." - added
Output schema / properties / types / items / properties / is_default / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / types / items / properties / is_milestone / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / types / items / properties / is_milestone / defaultRemoved value: -null - removed
Output schema / properties / types / items / properties / is_milestone / descriptionRemoved value: -"Milestone types take a single 'date', not start/due." - added
Output schema / properties / types / items / properties / is_milestone / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / types / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / types / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / types / items / properties / name / descriptionRemoved value: -"Display name as this instance spells it." - added
Output schema / properties / types / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / types / items / properties / own_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / types / items / properties / own_name / defaultRemoved value: -null - removed
Output schema / properties / types / items / properties / own_name / descriptionRemoved value: -"Variant's own name without the parent prefix (17.7+); null elsewhere." - added
Output schema / properties / types / items / properties / own_name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / types / items / properties / parent / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / types / items / properties / parent / defaultRemoved value: -null - removed
Output schema / properties / types / items / properties / parent / descriptionRemoved value: -"Parent type when this is a variant (17.7+); null elsewhere." - changed
Output schema / properties / versions / anyOfPrevious value: -[ - { - "items": { - "description": "A version / sprint defined in or shared with a project.", - "properties": { - "end_date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO date (YYYY-MM-DD)." - }, - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id — pass this, not the name." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Display name as this instance spells it." - }, - "sharing": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Sharing scope: none, descendants, hierarchy, tree, system." - }, - "start_date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO date (YYYY-MM-DD)." - }, - "status": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "open, locked or closed." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "end_date": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "sharing": { + "type": [ + "string", + "null" + ] + }, + "start_date": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / versions / defaultRemoved value: -null - removed
Output schema / properties / versions / descriptionRemoved value: -"Project versions/sprints; null unless project_id was given."
- Changed
get_project_phase29 fields changed- removed
Output schema / descriptionRemoved value: -"One project's instance of a phase definition." - removed
Output schema / properties / active / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / active / defaultRemoved value: -null - removed
Output schema / properties / active / descriptionRemoved value: -"False when the project switched this phase off." - added
Output schema / properties / active / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / definition / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / definition / defaultRemoved value: -null - removed
Output schema / properties / definition / descriptionRemoved value: -"The instance-global phase definition this instantiates." - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Phase id — a per-project record id, not the definition id." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / name / defaultRemoved value: -null - removed
Output schema / properties / name / descriptionRemoved value: -"Phase name." - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation notes for this result." - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"Project this phase belongs to." - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +]
- Removed
get_project_report_data - Removed
get_recurring_meeting - Changed
get_sprint36 fields changed- removed
Output schema / descriptionRemoved value: -"A single sprint as ``get_sprint`` returns it." - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Description as markdown (raw); html is dropped." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / finish_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / finish_date / defaultRemoved value: -null - removed
Output schema / properties / finish_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD); the sprint's finish date (wire 'finishDate')." - added
Output schema / properties / finish_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Sprint id — what the work-package 'sprint' field consumes." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / name / defaultRemoved value: -null - removed
Output schema / properties / name / descriptionRemoved value: -"Sprint name, e.g. 'Sprint 11'." - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / start_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status / defaultRemoved value: -null - removed
Output schema / properties / status / descriptionRemoved value: -"in_planning, active or completed (parsed from the status URN)." - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / workspace / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / workspace / defaultRemoved value: -null - removed
Output schema / properties / workspace / descriptionRemoved value: -"The project (workspace) that DEFINES the sprint."
- Changed
get_user37 fields changed- removed
Output schema / descriptionRemoved value: -"Full user detail. The avatar URL is deliberately dropped." - removed
Output schema / properties / admin / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / admin / defaultRemoved value: -null - removed
Output schema / properties / admin / descriptionRemoved value: -"True for instance administrators. Null when the field is not visible to the caller — treat null as 'unknown', never as 'not an admin'." - added
Output schema / properties / admin / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / email / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / email / defaultRemoved value: -null - removed
Output schema / properties / email / descriptionRemoved value: -"Email address; null when the authenticated account may not see it." - added
Output schema / properties / email / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Numeric user id." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / language / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / language / defaultRemoved value: -null - removed
Output schema / properties / language / descriptionRemoved value: -"Interface language code, e.g. 'en'. Absent on some instances." - added
Output schema / properties / language / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / login / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / login / defaultRemoved value: -null - removed
Output schema / properties / login / descriptionRemoved value: -"Login name used to sign in." - added
Output schema / properties / login / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / name / defaultRemoved value: -null - removed
Output schema / properties / name / descriptionRemoved value: -"Display name, e.g. 'Grace Hopper'." - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status / defaultRemoved value: -null - removed
Output schema / properties / status / descriptionRemoved value: -"Account status, one of: active, invited, registered, locked." - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +]
- Removed
get_wiki_page - Changed
get_work_package142 fields changed- removed
Output schema / descriptionRemoved value: -"``get_work_package`` result: detail plus the requested capped includes." - changed
Output schema / properties / assignee / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / assignee / defaultRemoved value: -null - removed
Output schema / properties / assignee / descriptionRemoved value: -"Assigned user or group." - changed
Output schema / properties / attachments / anyOfPrevious value: -[ - { - "properties": { - "items": { - "description": "Items included (capped).", - "items": { - "description": "An attachment on the work package.", - "properties": { - "author": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Uploading user." - }, - "content_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "MIME type reported by the server." - }, - "created_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO 8601 UTC timestamp." - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Caption, when one was given." - }, - "file_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Stored file name." - }, - "file_size": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Size in bytes." - }, - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Attachment id." - } - }, - "type": "object" - }, - "type": "array" - }, - "more_via": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tool call that returns the full list." - }, - "total": { - "default": 0, - "description": "Total available items.", - "type": "integer" - }, - "truncated": { - "default": false, - "description": "True when items were dropped.", - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "items": { + "items": { + "properties": { + "author": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "content_type": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "file_name": { + "type": [ + "string", + "null" + ] + }, + "file_size": { + "type": [ + "integer", + "null" + ] + }, + "id": { + "type": [ + "integer", + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "more_via": { + "type": [ + "string", + "null" + ] + }, + "total": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / attachments / defaultRemoved value: -null - removed
Output schema / properties / attachments / descriptionRemoved value: -"Present only when 'attachments' was requested." - changed
Output schema / properties / author / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / author / defaultRemoved value: -null - removed
Output schema / properties / author / descriptionRemoved value: -"Creating user." - removed
Output schema / properties / available / defaultRemoved value: -null - removed
Output schema / properties / available / descriptionRemoved value: -"Feature availability for this WP: dev links, meetings, files." - changed
Output schema / properties / category / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / category / defaultRemoved value: -null - removed
Output schema / properties / category / descriptionRemoved value: -"Category." - changed
Output schema / properties / children / anyOfPrevious value: -[ - { - "properties": { - "items": { - "description": "Items included (capped).", - "items": { - "description": "Compact work-package row for list results.", - "properties": { - "assignee": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Assigned user or group." - }, - "display_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-facing id as the instance renders it. Matches the numeric id unless the instance uses semantic identifiers (17.x, e.g. 'PROJ-42'); null when the instance predates it." - }, - "due_date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO date (YYYY-MM-DD)." - }, - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Work package id." - }, - "percentage_done": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Progress, 0-100." - }, - "priority": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Priority." - }, - "project": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Owning project." - }, - "start_date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO date (YYYY-MM-DD)." - }, - "status": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Status." - }, - "subject": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Subject line." - }, - "type": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Work package type." - }, - "updated_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO 8601 UTC timestamp." - } - }, - "type": "object" - }, - "type": "array" - }, - "more_via": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tool call that returns the full list." - }, - "total": { - "default": 0, - "description": "Total available items.", - "type": "integer" - }, - "truncated": { - "default": false, - "description": "True when items were dropped.", - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "items": { + "items": { + "properties": { + "assignee": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "display_id": { + "type": [ + "string", + "null" + ] + }, + "due_date": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "percentage_done": { + "type": [ + "integer", + "null" + ] + }, + "priority": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "project": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "start_date": { + "type": [ + "string", + "null" + ] + }, + "status": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "subject": { + "type": [ + "string", + "null" + ] + }, + "type": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "updated_at": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "more_via": { + "type": [ + "string", + "null" + ] + }, + "total": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / children / defaultRemoved value: -null - removed
Output schema / properties / children / descriptionRemoved value: -"Present only when 'children' was requested." - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / custom_actions / anyOfPrevious value: -[ - { - "properties": { - "items": { - "description": "Items included (capped).", - "items": { - "description": "An instance-defined one-click action available on this work package.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Custom action id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Button label as configured by an admin." - } - }, - "type": "object" - }, - "type": "array" - }, - "more_via": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tool call that returns the full list." - }, - "total": { - "default": 0, - "description": "Total available items.", - "type": "integer" - }, - "truncated": { - "default": false, - "description": "True when items were dropped.", - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "items": { + "items": { + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "more_via": { + "type": [ + "string", + "null" + ] + }, + "total": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / custom_actions / defaultRemoved value: -null - removed
Output schema / properties / custom_actions / descriptionRemoved value: -"Present only when 'custom_actions' was requested." - removed
Output schema / properties / custom_fields / descriptionRemoved value: -"Always a list; empty when none are set." - removed
Output schema / properties / custom_fields / items / descriptionRemoved value: -"Canonical custom-field read shape." - removed
Output schema / properties / custom_fields / items / properties / key / descriptionRemoved value: -"Wire key, e.g. 'customField12'." - removed
Output schema / properties / custom_fields / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / custom_fields / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / name / descriptionRemoved value: -"Display name, e.g. 'Severity'." - added
Output schema / properties / custom_fields / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / custom_fields / items / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / custom_fields / items / properties / type / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / type / descriptionRemoved value: -"Schema type, e.g. 'list', 'string'." - added
Output schema / properties / custom_fields / items / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / custom_fields / items / properties / value / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / value / descriptionRemoved value: -"Scalar value or resolved name(s)." - changed
Output schema / properties / custom_fields / items / properties / value_ids / anyOfPrevious value: -[ - { - "items": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ] - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "type": [ + "integer", + "string" + ] + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / custom_fields / items / properties / value_ids / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / value_ids / descriptionRemoved value: -"Ids for list/user/version custom fields." - removed
Output schema / properties / date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / date / defaultRemoved value: -null - removed
Output schema / properties / date / descriptionRemoved value: -"Milestone date (ISO YYYY-MM-DD); null for non-milestones." - added
Output schema / properties / date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Description as markdown (raw); html is dropped." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / display_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / display_id / defaultRemoved value: -null - removed
Output schema / properties / display_id / descriptionRemoved value: -"Human-facing id as the instance renders it. Matches the numeric id unless the instance uses semantic identifiers (17.x, e.g. 'PROJ-42'); null when the instance predates it." - added
Output schema / properties / display_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / due_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / due_date / defaultRemoved value: -null - removed
Output schema / properties / due_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / due_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / estimated_hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / estimated_hours / defaultRemoved value: -null - removed
Output schema / properties / estimated_hours / descriptionRemoved value: -"Estimate in hours." - added
Output schema / properties / estimated_hours / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Work package id." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / lock_version / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / lock_version / defaultRemoved value: -null - removed
Output schema / properties / lock_version / descriptionRemoved value: -"Optimistic-locking version; pass to update_work_package." - added
Output schema / properties / lock_version / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation notes for this result." - changed
Output schema / properties / parent / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / parent / defaultRemoved value: -null - removed
Output schema / properties / parent / descriptionRemoved value: -"Parent work package." - removed
Output schema / properties / percentage_done / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / percentage_done / defaultRemoved value: -null - removed
Output schema / properties / percentage_done / descriptionRemoved value: -"Progress, 0-100." - added
Output schema / properties / percentage_done / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / priority / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / priority / defaultRemoved value: -null - removed
Output schema / properties / priority / descriptionRemoved value: -"Priority." - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"Owning project." - changed
Output schema / properties / project_phase / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project_phase / defaultRemoved value: -null - removed
Output schema / properties / project_phase / descriptionRemoved value: -"Project phase this work package sits in (16.1+, only when phases are active in the project and visible to this user); details via get_project_phase." - changed
Output schema / properties / relations / anyOfPrevious value: -[ - { - "properties": { - "items": { - "description": "Items included (capped).", - "items": { - "description": "One work-package relation.\n\nThe two endpoints that produce relations — the ``relations`` include of\n``get_work_package`` and the relation write tools — return this same shape.\n``from_work_package``/``to_work_package`` are spelled out because the wire's\n``from``/``to`` read as prepositions rather than as the two ends of an edge.", - "properties": { - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Free-text note stored on the relation; null when unset." - }, - "from_work_package": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Work package the relation starts at." - }, - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Relation id. Pass it to update_work_package_relation or delete_work_package_relation — it is not a work package id." - }, - "lag": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Working days kept between the predecessor and the successor. Only follows/precedes relations carry one; null everywhere else." - }, - "reverse_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The same relation read from the 'to' work package: 'follows' <-> 'precedes', 'blocks' <-> 'blocked', 'relates' <-> 'relates'." - }, - "to_work_package": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Work package the relation points to." - }, - "type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Relation type as OpenProject stored it, read from the 'from' work package (e.g. 'follows' means 'from' is scheduled after 'to')." - } - }, - "type": "object" - }, - "type": "array" - }, - "more_via": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tool call that returns the full list." - }, - "total": { - "default": 0, - "description": "Total available items.", - "type": "integer" - }, - "truncated": { - "default": false, - "description": "True when items were dropped.", - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "items": { + "items": { + "properties": { + "description": { + "type": [ + "string", + "null" + ] + }, + "from_work_package": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "lag": { + "type": [ + "integer", + "null" + ] + }, + "reverse_type": { + "type": [ + "string", + "null" + ] + }, + "to_work_package": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "type": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "more_via": { + "type": [ + "string", + "null" + ] + }, + "total": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / relations / defaultRemoved value: -null - removed
Output schema / properties / relations / descriptionRemoved value: -"Present only when 'relations' was requested." - removed
Output schema / properties / remaining_hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / remaining_hours / defaultRemoved value: -null - removed
Output schema / properties / remaining_hours / descriptionRemoved value: -"Remaining work in hours." - added
Output schema / properties / remaining_hours / typeAdded value: +[ + "number", + "null" +] - changed
Output schema / properties / responsible / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / responsible / defaultRemoved value: -null - removed
Output schema / properties / responsible / descriptionRemoved value: -"Accountable user." - removed
Output schema / properties / spent_hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / spent_hours / defaultRemoved value: -null - removed
Output schema / properties / spent_hours / descriptionRemoved value: -"Logged time in hours." - added
Output schema / properties / spent_hours / typeAdded value: +[ + "number", + "null" +] - changed
Output schema / properties / sprint / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / sprint / defaultRemoved value: -null - removed
Output schema / properties / sprint / descriptionRemoved value: -"The sprint the work package is planned in; null when unassigned." - removed
Output schema / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / start_date / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / status / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / status / defaultRemoved value: -null - removed
Output schema / properties / status / descriptionRemoved value: -"Status." - removed
Output schema / properties / story_points / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / story_points / defaultRemoved value: -null - removed
Output schema / properties / story_points / descriptionRemoved value: -"Story points." - added
Output schema / properties / story_points / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / subject / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / subject / defaultRemoved value: -null - removed
Output schema / properties / subject / descriptionRemoved value: -"Subject line." - added
Output schema / properties / subject / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / target_versions / descriptionRemoved value: -"All target versions; legacy instances yield zero or one." - removed
Output schema / properties / target_versions / items / descriptionRemoved value: -"A reference to another resource. Canonical output shape." - removed
Output schema / properties / target_versions / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / target_versions / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / target_versions / items / properties / id / descriptionRemoved value: -"Resource id." - added
Output schema / properties / target_versions / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / target_versions / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / target_versions / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / target_versions / items / properties / name / descriptionRemoved value: -"Human-readable name." - added
Output schema / properties / target_versions / items / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / type / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / type / defaultRemoved value: -null - removed
Output schema / properties / type / descriptionRemoved value: -"Work package type." - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / version / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / version / defaultRemoved value: -null - removed
Output schema / properties / version / descriptionRemoved value: -"Legacy alias: the sole target version, or null for zero/multiple." - changed
Output schema / properties / watchers / anyOfPrevious value: -[ - { - "properties": { - "items": { - "description": "Items included (capped).", - "items": { - "description": "A user watching the work package.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "User id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Display name." - } - }, - "type": "object" - }, - "type": "array" - }, - "more_via": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tool call that returns the full list." - }, - "total": { - "default": 0, - "description": "Total available items.", - "type": "integer" - }, - "truncated": { - "default": false, - "description": "True when items were dropped.", - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "items": { + "items": { + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "more_via": { + "type": [ + "string", + "null" + ] + }, + "total": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / watchers / defaultRemoved value: -null - removed
Output schema / properties / watchers / descriptionRemoved value: -"Present only when 'watchers' was requested."
- Removed
get_work_package_git_activity - Changed
get_work_package_schema50 fields changed- removed
Output schema / descriptionRemoved value: -"Everything a create/update call needs to be valid." - removed
Output schema / properties / custom_fields / descriptionRemoved value: -"Always a list; empty when the type has none." - removed
Output schema / properties / custom_fields / items / descriptionRemoved value: -"Custom-field definition: the canonical custom-field read shape without a value." - removed
Output schema / properties / custom_fields / items / properties / key / descriptionRemoved value: -"Wire key, e.g. 'customField12' — use it in raw_filters." - removed
Output schema / properties / custom_fields / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / custom_fields / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / name / descriptionRemoved value: -"Display name, e.g. 'Severity'." - added
Output schema / properties / custom_fields / items / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / custom_fields / items / properties / options / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / custom_fields / items / properties / options / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / options / descriptionRemoved value: -"Allowed {id, name} options for list/user/version custom fields; null for free-text and numeric ones." - removed
Output schema / properties / custom_fields / items / properties / required / defaultRemoved value: -false - removed
Output schema / properties / custom_fields / items / properties / required / descriptionRemoved value: -"Creation fails without it." - removed
Output schema / properties / custom_fields / items / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / custom_fields / items / properties / type / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / type / descriptionRemoved value: -"Normalized custom-field type: 'list', 'string', 'text', 'user', 'date', … — the same vocabulary get_work_package reports in custom_fields[].type." - added
Output schema / properties / custom_fields / items / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / custom_fields / items / properties / writable / defaultRemoved value: -false - removed
Output schema / properties / custom_fields / items / properties / writable / descriptionRemoved value: -"False means computed/read-only." - removed
Output schema / properties / fields / descriptionRemoved value: -"Core attributes with type/required/writable." - removed
Output schema / properties / fields / items / descriptionRemoved value: -"One attribute of a work-package schema." - changed
Output schema / properties / fields / items / properties / allowed_values / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / fields / items / properties / allowed_values / defaultRemoved value: -null - removed
Output schema / properties / fields / items / properties / allowed_values / descriptionRemoved value: -"Valid {id, name} choices when the schema inlines them (status, category, version); null when the API only offers a lookup URL." - removed
Output schema / properties / fields / items / properties / has_default / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / fields / items / properties / has_default / defaultRemoved value: -null - removed
Output schema / properties / fields / items / properties / has_default / descriptionRemoved value: -"True when OpenProject fills it in for you." - added
Output schema / properties / fields / items / properties / has_default / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / fields / items / properties / key / descriptionRemoved value: -"Wire attribute name, e.g. 'subject', 'assignee', 'startDate'." - removed
Output schema / properties / fields / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / fields / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / fields / items / properties / name / descriptionRemoved value: -"Localized label shown in the UI." - added
Output schema / properties / fields / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / fields / items / properties / required / defaultRemoved value: -false - removed
Output schema / properties / fields / items / properties / required / descriptionRemoved value: -"Creation fails without it." - removed
Output schema / properties / fields / items / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / fields / items / properties / type / defaultRemoved value: -null - removed
Output schema / properties / fields / items / properties / type / descriptionRemoved value: -"Schema type, e.g. 'String', 'Formattable', 'User', '[]User'." - added
Output schema / properties / fields / items / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / fields / items / properties / writable / defaultRemoved value: -false - removed
Output schema / properties / fields / items / properties / writable / descriptionRemoved value: -"False means read-only; do not send it." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation notes, e.g. capped allowed-value lists." - removed
Output schema / properties / project_id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - removed
Output schema / properties / project_id / descriptionRemoved value: -"Project the schema was requested for." - added
Output schema / properties / project_id / typeAdded value: +[ + "integer", + "string" +] - removed
Output schema / properties / required_fields / descriptionRemoved value: -"Writable keys that must be supplied on create." - removed
Output schema / properties / type_id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - removed
Output schema / properties / type_id / descriptionRemoved value: -"Work-package type the schema was requested for." - added
Output schema / properties / type_id / typeAdded value: +[ + "integer", + "string" +]
- Removed
init_recurring_meeting_occurrence - Changed
list_attachments45 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One attached file." - changed
Output schema / properties / items / items / properties / author / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / author / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / author / descriptionRemoved value: -"User who uploaded the file." - removed
Output schema / properties / items / items / properties / content_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / content_type / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / content_type / descriptionRemoved value: -"MIME type detected by OpenProject from the bytes." - added
Output schema / properties / items / items / properties / content_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC upload timestamp." - added
Output schema / properties / items / items / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / description / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / description / descriptionRemoved value: -"Caption stored with the file." - added
Output schema / properties / items / items / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / file_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / file_name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / file_name / descriptionRemoved value: -"Stored file name including extension." - added
Output schema / properties / items / items / properties / file_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Attachment id; pass it to download_attachment." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / size_bytes / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / size_bytes / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / size_bytes / descriptionRemoved value: -"File size in bytes." - added
Output schema / properties / items / items / properties / size_bytes / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / items / items / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / status / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / status / descriptionRemoved value: -"Virus-scan state: 'uploaded'/'scanned' are downloadable, 'quarantined' is not, anything else is still being scanned." - added
Output schema / properties / items / items / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Removed
list_budgets - Removed
list_documents - Changed
list_file_links52 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One file on an external storage linked to a work package." - removed
Output schema / properties / items / items / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC time the link was created." - added
Output schema / properties / items / items / properties / created_at / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / creator / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / creator / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / creator / descriptionRemoved value: -"OpenProject user who linked the file to the work package." - removed
Output schema / properties / items / items / properties / download_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / download_url / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / download_url / descriptionRemoved value: -"Absolute OpenProject URL that redirects to the file's download on the storage. Also an OpenProject endpoint needing the user's login, so download_attachment cannot use it." - added
Output schema / properties / items / items / properties / download_url / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / file_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / file_name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / file_name / descriptionRemoved value: -"Name of the file as the storage reports it." - added
Output schema / properties / items / items / properties / file_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"File-link id inside OpenProject; not the file's own id." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / mime_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / mime_type / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / mime_type / descriptionRemoved value: -"MIME type reported by the storage, when it reports one." - added
Output schema / properties / items / items / properties / mime_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / open_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / open_url / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / open_url / descriptionRemoved value: -"Absolute OpenProject URL that opens the file: it redirects to the storage after resolving the link server-side. Give it to the user — it needs their own OpenProject login, and this server cannot fetch the bytes." - added
Output schema / properties / items / items / properties / open_url / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / origin_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / origin_id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / origin_id / descriptionRemoved value: -"The file's id INSIDE that storage (Nextcloud/OneDrive), not an OpenProject id." - added
Output schema / properties / items / items / properties / origin_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / permission / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / permission / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / permission / descriptionRemoved value: -"What the storage said about this account's access to the file: 'View allowed', 'View not allowed', 'Not found' or 'Error'. Null means the storage did not report a status, not that access is fine." - added
Output schema / properties / items / items / properties / permission / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / storage / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / storage / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / storage / descriptionRemoved value: -"The external storage the file lives on ({id, name}), e.g. a Nextcloud instance." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Removed
list_meetings - Changed
list_memberships44 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One project membership: a principal holding roles in a project." - removed
Output schema / properties / items / items / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / items / items / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Membership id. Pass it to update_membership or delete_membership; it is not the principal id and not the project id." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / notes / descriptionRemoved value: -"Markers about what this call did, e.g. notifications suppressed." - changed
Output schema / properties / items / items / properties / principal / anyOfPrevious value: -[ - { - "description": "A principal reference that keeps its kind — used inside memberships.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Principal id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Display name." - }, - "type": { - "anyOf": [ - { - "enum": [ - "user", - "group", - "placeholder" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "'user', 'group' or 'placeholder'; null when the instance did not say." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "type": { + "anyOf": [ + { + "enum": [ + "user", + "group", + "placeholder" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / principal / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / principal / descriptionRemoved value: -"Who holds the membership: user, group or placeholder user." - changed
Output schema / properties / items / items / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / project / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / project / descriptionRemoved value: -"Project the membership grants access to." - removed
Output schema / properties / items / items / properties / roles / descriptionRemoved value: -"Roles held in this project; always a list. Role ids come from list_roles." - removed
Output schema / properties / items / items / properties / roles / items / descriptionRemoved value: -"A reference to another resource. Canonical output shape." - removed
Output schema / properties / items / items / properties / roles / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / roles / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / roles / items / properties / id / descriptionRemoved value: -"Resource id." - added
Output schema / properties / items / items / properties / roles / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / roles / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / roles / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / roles / items / properties / name / descriptionRemoved value: -"Human-readable name." - added
Output schema / properties / items / items / properties / roles / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / items / items / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Removed
list_news - Changed
list_notifications37 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One notification in the authenticated user's inbox." - changed
Output schema / properties / items / items / properties / actor / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / actor / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / actor / descriptionRemoved value: -"User whose action triggered it; null for system-generated notifications such as date alerts." - removed
Output schema / properties / items / items / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp of when the notification was raised." - added
Output schema / properties / items / items / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Notification id. Pass it in mark_notifications(ids=[...]) to mark it read." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - changed
Output schema / properties / items / items / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / project / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / project / descriptionRemoved value: -"Project the notification belongs to; null for global ones." - removed
Output schema / properties / items / items / properties / read / defaultRemoved value: -false - removed
Output schema / properties / items / items / properties / read / descriptionRemoved value: -"True once the notification was marked read in the in-app inbox (readIAN)." - removed
Output schema / properties / items / items / properties / reason / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / reason / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / reason / descriptionRemoved value: -"Why it was sent: mentioned, assigned, responsible, watched, subscribed, commented, created, processed, prioritized, scheduled, shared, reminder, dateAlert." - added
Output schema / properties / items / items / properties / reason / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / resource / anyOfPrevious value: -[ - { - "description": "What a notification is about — polymorphic, usually a work package.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Id of the notified-about resource. For type='WorkPackage' this is the work package id that get_work_package and list_work_package_comments take." - }, - "title": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Subject/title of the resource as OpenProject renders it." - }, - "type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "OpenProject resource type, e.g. 'WorkPackage', 'WikiPage', 'Meeting'. Kinds this server does not map surface their API collection name instead." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / resource / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / resource / descriptionRemoved value: -"The notified-about resource: {id, type, title}. Usually a work package." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
list_permissions35 fields changed- removed
Output schema / descriptionRemoved value: -"The standard list envelope of capability rows, plus who was asked about and the check." - removed
Output schema / properties / capability_count / defaultRemoved value: -0 - removed
Output schema / properties / capability_count / descriptionRemoved value: -"Individual capabilities read from the API before grouping." - changed
Output schema / properties / check / anyOfPrevious value: -[ - { - "description": "The answer to the optional ``permission`` predicate.", - "properties": { - "allowed": { - "description": "True when the action appears in the capabilities listed here. False means 'not listed' — see the tool's caveat, it is not proof of a denial.", - "type": "boolean" - }, - "checked": { - "description": "The permission string that was checked, as normalized.", - "type": "string" - }, - "granted_in": { - "description": "Ids of the CapabilityGroup rows that carry the action; empty when not found.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "checked", - "allowed" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "allowed": { + "type": "boolean" + }, + "checked": { + "type": "string" + }, + "granted_in": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "checked", + "allowed" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / check / defaultRemoved value: -null - removed
Output schema / properties / check / descriptionRemoved value: -"Present only when the 'permission' parameter was given." - changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"The actions the current user may perform in one context." - removed
Output schema / properties / items / items / properties / actions / descriptionRemoved value: -"Action names as OpenProject spells them, e.g. 'memberships/create', 'work_packages/read'. Sorted; always a list." - removed
Output schema / properties / items / items / properties / context / descriptionRemoved value: -"'global' for instance-wide actions, 'project' for actions inside one project." - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Stable row id: 'global' or 'project:<id>'. Also the grouping key." - changed
Output schema / properties / items / items / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / project / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / project / descriptionRemoved value: -"The project this row is about; null for the global context." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / principal / descriptionRemoved value: -"The user the capabilities were resolved for — always the authenticated account, by numeric id." - removed
Output schema / properties / principal / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / principal / properties / id / defaultRemoved value: -null - removed
Output schema / properties / principal / properties / id / descriptionRemoved value: -"Resource id." - added
Output schema / properties / principal / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / principal / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / principal / properties / name / defaultRemoved value: -null - removed
Output schema / properties / principal / properties / name / descriptionRemoved value: -"Human-readable name." - added
Output schema / properties / principal / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
list_project_phase_definitions38 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One instance-global project phase definition, with its gates." - removed
Output schema / properties / items / items / properties / finish_gate / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / finish_gate / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / finish_gate / descriptionRemoved value: -"True when the phase ends with a gate." - added
Output schema / properties / items / items / properties / finish_gate / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / items / items / properties / finish_gate_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / finish_gate_name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / finish_gate_name / descriptionRemoved value: -"Display name of the finish gate; null without one." - added
Output schema / properties / items / items / properties / finish_gate_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Definition id — the value list_projects' in_phase accepts." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / name / descriptionRemoved value: -"Phase name, e.g. 'Executing'." - added
Output schema / properties / items / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / start_gate / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / start_gate / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / start_gate / descriptionRemoved value: -"True when the phase begins with a gate." - added
Output schema / properties / items / items / properties / start_gate / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / items / items / properties / start_gate_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / start_gate_name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / start_gate_name / descriptionRemoved value: -"Display name of the start gate; null without one." - added
Output schema / properties / items / items / properties / start_gate_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
list_projects45 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"Compact project row for list results." - removed
Output schema / properties / items / items / properties / active / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / active / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / active / descriptionRemoved value: -"False for archived projects (read-only in the UI)." - added
Output schema / properties / items / items / properties / active / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Numeric project id; accepted by every project_id parameter." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / identifier / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / identifier / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / identifier / descriptionRemoved value: -"URL slug from /projects/<identifier>; also accepted wherever an id is." - added
Output schema / properties / items / items / properties / identifier / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / name / descriptionRemoved value: -"Display name." - added
Output schema / properties / items / items / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / parent / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / parent / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / parent / descriptionRemoved value: -"Parent project, when this is a subproject." - removed
Output schema / properties / items / items / properties / public / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / public / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / public / descriptionRemoved value: -"True when visible to users without a membership." - added
Output schema / properties / items / items / properties / public / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / items / items / properties / status_code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / status_code / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / status_code / descriptionRemoved value: -"Project status code, one of: on_track, at_risk, off_track, not_started, finished, discontinued. A code, never a translated label; null means no status has been set." - added
Output schema / properties / items / items / properties / status_code / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / workspace_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / workspace_type / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / workspace_type / descriptionRemoved value: -"Workspace kind: 'project', 'program' or 'portfolio'. Pre-17 instances only have 'project'; on 17.x project listings mix all three kinds, so check this before treating a row as a plain project." - added
Output schema / properties / items / items / properties / workspace_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
list_queries33 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"Compact saved-query row." - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Query id — pass it to run_query as query_id." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / name / descriptionRemoved value: -"Query name as its author saved it." - added
Output schema / properties / items / items / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / project / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / project / descriptionRemoved value: -"Owning project, or null for a global (cross-project) query." - removed
Output schema / properties / items / items / properties / public / defaultRemoved value: -false - removed
Output schema / properties / items / items / properties / public / descriptionRemoved value: -"True when shared with everyone who can see the project; false when private to its owner." - removed
Output schema / properties / items / items / properties / starred / defaultRemoved value: -false - removed
Output schema / properties / items / items / properties / starred / descriptionRemoved value: -"True when the current user starred (favorited) it." - removed
Output schema / properties / items / items / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / items / items / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Removed
list_recurring_meetings - Changed
list_reminders32 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One personal reminder on a work package." - changed
Output schema / properties / items / items / properties / creator / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / creator / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / creator / descriptionRemoved value: -"Who created it — always the authenticated user." - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Reminder id. Personal and short-lived — set_work_package_reminder finds it by work package, so this is for reporting, not for addressing." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / note / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / note / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / note / descriptionRemoved value: -"Free-text note shown with the reminder; null when unset." - added
Output schema / properties / items / items / properties / note / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / remind_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / remind_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / remind_at / descriptionRemoved value: -"ISO 8601 UTC timestamp the reminder fires at." - added
Output schema / properties / items / items / properties / remind_at / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / work_package / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / work_package / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / work_package / descriptionRemoved value: -"Work package the reminder is attached to." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
list_roles24 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One role definition." - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Role id; this is what create_membership.role_ids wants." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / name / descriptionRemoved value: -"Role name as configured on the instance, e.g. 'Member'." - added
Output schema / properties / items / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / permissions / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / permissions / descriptionRemoved value: -"Permission identifiers granted by the role; present only when include_permissions=true and the instance exposes them." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
list_sprints41 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One sprint as list results return it." - removed
Output schema / properties / items / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / description / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / description / descriptionRemoved value: -"Description as markdown (raw); html is dropped." - added
Output schema / properties / items / items / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / finish_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / finish_date / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / finish_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD); the sprint's finish date (wire 'finishDate')." - added
Output schema / properties / items / items / properties / finish_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Sprint id — what the work-package 'sprint' field consumes." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / name / descriptionRemoved value: -"Sprint name, e.g. 'Sprint 11'." - added
Output schema / properties / items / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / items / items / properties / start_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / status / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / status / descriptionRemoved value: -"in_planning, active or completed (parsed from the status URN)." - added
Output schema / properties / items / items / properties / status / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / workspace / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / workspace / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / workspace / descriptionRemoved value: -"The project (workspace) that DEFINES the sprint." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
list_time_entries42 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One logged time entry, compact enough to list hundreds of." - changed
Output schema / properties / items / items / properties / activity / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / activity / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / activity / descriptionRemoved value: -"Time-entry activity (Development, Management, …); instance-defined." - removed
Output schema / properties / items / items / properties / comment / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / comment / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / comment / descriptionRemoved value: -"Free-text comment as entered (raw); html is dropped." - added
Output schema / properties / items / items / properties / comment / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / hours / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / hours / descriptionRemoved value: -"Logged duration in hours as a float (1.5 = one and a half hours), converted from OpenProject's ISO 8601 duration." - added
Output schema / properties / items / items / properties / hours / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Time entry id. Feed it to update_time_entry or delete_time_entry." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - changed
Output schema / properties / items / items / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / project / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / project / descriptionRemoved value: -"Project the entry belongs to." - removed
Output schema / properties / items / items / properties / spent_on / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / spent_on / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / spent_on / descriptionRemoved value: -"The date the work was done, ISO YYYY-MM-DD." - added
Output schema / properties / items / items / properties / spent_on / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / user / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / user / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / user / descriptionRemoved value: -"User the time is booked for." - changed
Output schema / properties / items / items / properties / work_package / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / work_package / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / work_package / descriptionRemoved value: -"Work package the time is booked on; null for project-level entries." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
list_versions47 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One version (or backlogs sprint) as list results return it." - removed
Output schema / properties / items / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / description / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / description / descriptionRemoved value: -"Description as markdown (raw); html is dropped." - added
Output schema / properties / items / items / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / end_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / end_date / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / end_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD); the version's finish date." - added
Output schema / properties / items / items / properties / end_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Version id — what update_version, delete_version and the work-package 'version' field consume." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / name / descriptionRemoved value: -"Version name, e.g. 'Sprint 12' or '2.1'." - added
Output schema / properties / items / items / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / project / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / project / descriptionRemoved value: -"The project that DEFINES the version. A version shared from a parent project shows that parent here, not the project you asked about." - removed
Output schema / properties / items / items / properties / sharing / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / sharing / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / sharing / descriptionRemoved value: -"How far the version is shared: none, descendants, hierarchy, tree, system." - added
Output schema / properties / items / items / properties / sharing / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / source / defaultRemoved value: -"version" - removed
Output schema / properties / items / items / properties / source / descriptionRemoved value: -"'sprint' when the row came from the backlogs sprints endpoint, 'version' otherwise. Sprints ARE versions upstream, so a row can be both and is then reported as 'sprint'." - removed
Output schema / properties / items / items / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / items / items / properties / start_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / status / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / status / descriptionRemoved value: -"open, locked or closed. Locked and closed versions reject new work package assignments." - added
Output schema / properties / items / items / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
list_work_package_comments67 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One journal entry: a comment, a set of field changes, or both.\n\nOpenProject aggregates a comment and the edits saved with it into a single\njournal entry, so ``kind='comment'`` entries can still carry ``details``." - changed
Output schema / properties / items / items / properties / author / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / author / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / author / descriptionRemoved value: -"User who wrote the entry." - removed
Output schema / properties / items / items / properties / comment / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / comment / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / comment / descriptionRemoved value: -"Comment body as markdown (raw); html is dropped. Cut to max_comment_chars when 'truncated' is true." - added
Output schema / properties / items / items / properties / comment / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / comment_length / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / comment_length / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / comment_length / descriptionRemoved value: -"Character length of the untruncated comment; set only when truncated." - added
Output schema / properties / items / items / properties / comment_length / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / items / items / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / items / items / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / details / descriptionRemoved value: -"Field changes recorded with this entry; always a list, empty for a comment-only entry." - removed
Output schema / properties / items / items / properties / details / items / descriptionRemoved value: -"One field change inside a journal entry, parsed into its parts." - removed
Output schema / properties / items / items / properties / details / items / properties / field / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / details / items / properties / field / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / details / items / properties / field / descriptionRemoved value: -"Changed field as OpenProject labels it, e.g. 'Status', 'Start date'." - added
Output schema / properties / items / items / properties / details / items / properties / field / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / details / items / properties / from / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / details / items / properties / from / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / details / items / properties / from / descriptionRemoved value: -"Previous value; null when the field was set for the first time." - added
Output schema / properties / items / items / properties / details / items / properties / from / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / details / items / properties / text / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / details / items / properties / text / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / details / items / properties / text / descriptionRemoved value: -"The change as OpenProject phrases it, kept verbatim for anything the parser could not split (attachment adds, diff-only notes)." - added
Output schema / properties / items / items / properties / details / items / properties / text / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / details / items / properties / to / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / details / items / properties / to / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / details / items / properties / to / descriptionRemoved value: -"New value; null when the field was cleared." - added
Output schema / properties / items / items / properties / details / items / properties / to / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Activity id. Pass it back as list_work_package_comments(activity_id=...) to read a truncated comment in full." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / internal / defaultRemoved value: -false - removed
Output schema / properties / items / items / properties / internal / descriptionRemoved value: -"True for internal (project-member-only) comments; OpenProject >= 16." - removed
Output schema / properties / items / items / properties / kind / descriptionRemoved value: -"'comment' when the entry carries comment text, 'field_change' otherwise." - removed
Output schema / properties / items / items / properties / truncated / defaultRemoved value: -false - removed
Output schema / properties / items / items / properties / truncated / descriptionRemoved value: -"True when the comment was cut to max_comment_chars." - removed
Output schema / properties / items / items / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp of the last edit." - added
Output schema / properties / items / items / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / version / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / version / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / version / descriptionRemoved value: -"Journal version number of this entry within the work package." - added
Output schema / properties / items / items / properties / version / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / items / items / properties / work_package / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / work_package / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / work_package / descriptionRemoved value: -"Work package the entry belongs to." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
list_work_packages65 fields changed- changed
Input schema / properties / created_since / descriptionPrevious value: -"Created on/after, ISO date."New value: +"Created on/after." - added
Input schema / properties / created_untilAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Created on/before." +} - changed
Input schema / properties / due_after / descriptionPrevious value: -"Due on/after, ISO date."New value: +"Due on/after." - changed
Input schema / properties / due_before / descriptionPrevious value: -"Due on/before, ISO date."New value: +"Due on/before." - changed
Input schema / properties / start_after / descriptionPrevious value: -"Starts on/after, ISO date."New value: +"Starts on/after." - changed
Input schema / properties / start_before / descriptionPrevious value: -"Starts on/before, ISO date."New value: +"Starts on/before." - changed
Input schema / properties / updated_since / descriptionPrevious value: -"Changed on/after, ISO date."New value: +"Changed on/after." - added
Input schema / properties / updated_untilAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Changed on/before." +} - changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"Compact work-package row for list results." - changed
Output schema / properties / items / items / properties / assignee / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / assignee / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / assignee / descriptionRemoved value: -"Assigned user or group." - removed
Output schema / properties / items / items / properties / display_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / display_id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / display_id / descriptionRemoved value: -"Human-facing id as the instance renders it. Matches the numeric id unless the instance uses semantic identifiers (17.x, e.g. 'PROJ-42'); null when the instance predates it." - added
Output schema / properties / items / items / properties / display_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / due_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / due_date / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / due_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / items / items / properties / due_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Work package id." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / percentage_done / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / percentage_done / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / percentage_done / descriptionRemoved value: -"Progress, 0-100." - added
Output schema / properties / items / items / properties / percentage_done / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / items / items / properties / priority / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / priority / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / priority / descriptionRemoved value: -"Priority." - changed
Output schema / properties / items / items / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / project / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / project / descriptionRemoved value: -"Owning project." - removed
Output schema / properties / items / items / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / items / items / properties / start_date / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / status / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / status / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / status / descriptionRemoved value: -"Status." - removed
Output schema / properties / items / items / properties / subject / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / subject / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / subject / descriptionRemoved value: -"Subject line." - added
Output schema / properties / items / items / properties / subject / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / type / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / type / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / type / descriptionRemoved value: -"Work package type." - removed
Output schema / properties / items / items / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / items / items / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
log_time41 fields changed- removed
Output schema / descriptionRemoved value: -"A single time entry with the fields only a detail read carries." - changed
Output schema / properties / activity / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / activity / defaultRemoved value: -null - removed
Output schema / properties / activity / descriptionRemoved value: -"Time-entry activity (Development, Management, …); instance-defined." - removed
Output schema / properties / comment / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / comment / defaultRemoved value: -null - removed
Output schema / properties / comment / descriptionRemoved value: -"Free-text comment as entered (raw); html is dropped." - added
Output schema / properties / comment / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / hours / defaultRemoved value: -null - removed
Output schema / properties / hours / descriptionRemoved value: -"Logged duration in hours as a float (1.5 = one and a half hours), converted from OpenProject's ISO 8601 duration." - added
Output schema / properties / hours / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Time entry id. Feed it to update_time_entry or delete_time_entry." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / lock_version / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / lock_version / defaultRemoved value: -null - removed
Output schema / properties / lock_version / descriptionRemoved value: -"Optimistic-locking version, when this instance reports one for time entries; null means the resource is updated without a lock version." - added
Output schema / properties / lock_version / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"Project the entry belongs to." - removed
Output schema / properties / spent_on / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / spent_on / defaultRemoved value: -null - removed
Output schema / properties / spent_on / descriptionRemoved value: -"The date the work was done, ISO YYYY-MM-DD." - added
Output schema / properties / spent_on / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / user / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / defaultRemoved value: -null - removed
Output schema / properties / user / descriptionRemoved value: -"User the time is booked for." - changed
Output schema / properties / work_package / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / work_package / defaultRemoved value: -null - removed
Output schema / properties / work_package / descriptionRemoved value: -"Work package the time is booked on; null for project-level entries."
- Changed
mark_all_notifications_read6 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of a mark-read/unread call." - removed
Output schema / properties / ids / defaultRemoved value: -null - removed
Output schema / properties / ids / descriptionRemoved value: -"The notification ids that were marked; null for the filter-based bulk tool." - removed
Output schema / properties / marked / descriptionRemoved value: -"Number of notifications the call covered. For mark_notifications this is the number of ids sent; for mark_all_notifications_read it is how many unread notifications matched the filters when the call ran." - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation of what happened." - removed
Output schema / properties / read / descriptionRemoved value: -"True when they were marked read, false when marked unread."
- Changed
mark_notifications6 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of a mark-read/unread call." - removed
Output schema / properties / ids / defaultRemoved value: -null - removed
Output schema / properties / ids / descriptionRemoved value: -"The notification ids that were marked; null for the filter-based bulk tool." - removed
Output schema / properties / marked / descriptionRemoved value: -"Number of notifications the call covered. For mark_notifications this is the number of ids sent; for mark_all_notifications_read it is how many unread notifications matched the filters when the call ran." - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation of what happened." - removed
Output schema / properties / read / descriptionRemoved value: -"True when they were marked read, false when marked unread."
- Changed
remove_work_package_watcher11 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of adding or removing one watcher." - removed
Output schema / properties / changed / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / changed / defaultRemoved value: -null - removed
Output schema / properties / changed / descriptionRemoved value: -"True when this call actually changed the watcher list, false when the user was already watching. Null when OpenProject does not report it — removals answer 204 whether or not the user was watching." - added
Output schema / properties / changed / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation." - changed
Output schema / properties / user / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / defaultRemoved value: -null - removed
Output schema / properties / user / descriptionRemoved value: -"The watcher. 'id' is the user id; 'name' is filled in only when OpenProject returned the user resource (it does on add, not on remove)." - removed
Output schema / properties / watching / descriptionRemoved value: -"Watch state after the call: true after adding, false after removing." - removed
Output schema / properties / work_package_id / descriptionRemoved value: -"Work package whose watcher list was changed."
- Changed
run_query86 fields changed- removed
Output schema / descriptionRemoved value: -"A saved query's results: the standard list envelope plus what actually ran." - changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"Compact work-package row for list results." - changed
Output schema / properties / items / items / properties / assignee / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / assignee / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / assignee / descriptionRemoved value: -"Assigned user or group." - removed
Output schema / properties / items / items / properties / display_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / display_id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / display_id / descriptionRemoved value: -"Human-facing id as the instance renders it. Matches the numeric id unless the instance uses semantic identifiers (17.x, e.g. 'PROJ-42'); null when the instance predates it." - added
Output schema / properties / items / items / properties / display_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / due_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / due_date / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / due_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / items / items / properties / due_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Work package id." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / percentage_done / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / percentage_done / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / percentage_done / descriptionRemoved value: -"Progress, 0-100." - added
Output schema / properties / items / items / properties / percentage_done / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / items / items / properties / priority / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / priority / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / priority / descriptionRemoved value: -"Priority." - changed
Output schema / properties / items / items / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / project / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / project / descriptionRemoved value: -"Owning project." - removed
Output schema / properties / items / items / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / items / items / properties / start_date / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / status / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / status / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / status / descriptionRemoved value: -"Status." - removed
Output schema / properties / items / items / properties / subject / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / subject / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / subject / descriptionRemoved value: -"Subject line." - added
Output schema / properties / items / items / properties / subject / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / type / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / type / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / type / descriptionRemoved value: -"Work package type." - removed
Output schema / properties / items / items / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / items / items / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / query / descriptionRemoved value: -"The stored query definition, so the rows can be interpreted." - removed
Output schema / properties / query / properties / display_sums / defaultRemoved value: -false - removed
Output schema / properties / query / properties / display_sums / descriptionRemoved value: -"True when the query asks for totals; then the result 'sums' is populated." - removed
Output schema / properties / query / properties / filters / descriptionRemoved value: -"The stored filters as readable sentences, e.g. 'Status open' or 'Assignee is (OR) Grace Hopper'. Empty when the query filters nothing." - removed
Output schema / properties / query / properties / group_by / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / query / properties / group_by / defaultRemoved value: -null - removed
Output schema / properties / query / properties / group_by / descriptionRemoved value: -"Column the results are grouped by, when the query groups." - added
Output schema / properties / query / properties / group_by / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / query / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / query / properties / id / defaultRemoved value: -null - removed
Output schema / properties / query / properties / id / descriptionRemoved value: -"Query id — pass it to run_query as query_id." - added
Output schema / properties / query / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / query / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / query / properties / name / defaultRemoved value: -null - removed
Output schema / properties / query / properties / name / descriptionRemoved value: -"Query name as its author saved it." - added
Output schema / properties / query / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / query / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / query / properties / project / defaultRemoved value: -null - removed
Output schema / properties / query / properties / project / descriptionRemoved value: -"Owning project, or null for a global (cross-project) query." - removed
Output schema / properties / query / properties / public / defaultRemoved value: -false - removed
Output schema / properties / query / properties / public / descriptionRemoved value: -"True when shared with everyone who can see the project; false when private to its owner." - removed
Output schema / properties / query / properties / sort_by / descriptionRemoved value: -"Stored sort order, e.g. ['Finish date asc']." - removed
Output schema / properties / query / properties / starred / defaultRemoved value: -false - removed
Output schema / properties / query / properties / starred / descriptionRemoved value: -"True when the current user starred (favorited) it." - removed
Output schema / properties / query / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / query / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / query / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / query / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
save_query29 fields changed- removed
Output schema / descriptionRemoved value: -"The query ``save_query`` created, exactly as OpenProject stored it." - removed
Output schema / properties / display_sums / defaultRemoved value: -false - removed
Output schema / properties / display_sums / descriptionRemoved value: -"True when the query asks for totals; then the result 'sums' is populated." - removed
Output schema / properties / filters / descriptionRemoved value: -"The stored filters as readable sentences, e.g. 'Status open' or 'Assignee is (OR) Grace Hopper'. Empty when the query filters nothing." - removed
Output schema / properties / group_by / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / group_by / defaultRemoved value: -null - removed
Output schema / properties / group_by / descriptionRemoved value: -"Column the results are grouped by, when the query groups." - added
Output schema / properties / group_by / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Query id — pass it to run_query as query_id." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / name / defaultRemoved value: -null - removed
Output schema / properties / name / descriptionRemoved value: -"Query name as its author saved it." - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / descriptionRemoved value: -"What happened beyond the create itself: a failed star, filters OpenProject did not keep. Empty when everything landed as asked." - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"Owning project, or null for a global (cross-project) query." - removed
Output schema / properties / public / defaultRemoved value: -false - removed
Output schema / properties / public / descriptionRemoved value: -"True when shared with everyone who can see the project; false when private to its owner." - removed
Output schema / properties / sort_by / descriptionRemoved value: -"Stored sort order, e.g. ['Finish date asc']." - removed
Output schema / properties / starred / defaultRemoved value: -false - removed
Output schema / properties / starred / descriptionRemoved value: -"True when the current user starred (favorited) it." - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +]
- Changed
search_principals36 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"One user, group or placeholder user." - removed
Output schema / properties / items / items / properties / email / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / email / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / email / descriptionRemoved value: -"Email address; users only, and only when the caller may see it." - added
Output schema / properties / items / items / properties / email / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Principal id. This is the value every principal parameter wants: assignee_id, watcher ids, time-entry user_id, create_membership.principal_id." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / login / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / login / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / login / descriptionRemoved value: -"Login name; users only, and only when the caller may see it." - added
Output schema / properties / items / items / properties / login / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / name / descriptionRemoved value: -"Display name as OpenProject renders it." - added
Output schema / properties / items / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / status / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / status / descriptionRemoved value: -"Account status, one of: active, invited, registered, locked. Users only. 'locked' accounts still appear in old assignments but cannot be assigned new work." - added
Output schema / properties / items / items / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / type / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / type / descriptionRemoved value: -"'user' for a person, 'group' for a user group, 'placeholder' for a placeholder user (a licence-free stand-in that can be assigned work but cannot log in)." - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
search_work_packages57 fields changed- changed
Output schema / properties / groups / anyOfPrevious value: -[ - { - "items": { - "description": "A server-side group bucket, computed over the full filtered set.", - "properties": { - "count": { - "default": 0, - "description": "Records in this group across all pages.", - "type": "integer" - }, - "sums": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Per-group sums when show_sums was requested." - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Group value, e.g. a status name." - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sums": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / groups / defaultRemoved value: -null - removed
Output schema / properties / groups / descriptionRemoved value: -"Present only when group_by was requested." - removed
Output schema / properties / items / descriptionRemoved value: -"The page of results." - removed
Output schema / properties / items / items / descriptionRemoved value: -"Compact work-package row for list results." - changed
Output schema / properties / items / items / properties / assignee / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / assignee / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / assignee / descriptionRemoved value: -"Assigned user or group." - removed
Output schema / properties / items / items / properties / display_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / display_id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / display_id / descriptionRemoved value: -"Human-facing id as the instance renders it. Matches the numeric id unless the instance uses semantic identifiers (17.x, e.g. 'PROJ-42'); null when the instance predates it." - added
Output schema / properties / items / items / properties / display_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / due_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / due_date / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / due_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / items / items / properties / due_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / id / descriptionRemoved value: -"Work package id." - added
Output schema / properties / items / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / items / items / properties / percentage_done / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / percentage_done / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / percentage_done / descriptionRemoved value: -"Progress, 0-100." - added
Output schema / properties / items / items / properties / percentage_done / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / items / items / properties / priority / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / priority / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / priority / descriptionRemoved value: -"Priority." - changed
Output schema / properties / items / items / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / project / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / project / descriptionRemoved value: -"Owning project." - removed
Output schema / properties / items / items / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / items / items / properties / start_date / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / status / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / status / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / status / descriptionRemoved value: -"Status." - removed
Output schema / properties / items / items / properties / subject / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / subject / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / subject / descriptionRemoved value: -"Subject line." - added
Output schema / properties / items / items / properties / subject / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / items / items / properties / type / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / type / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / type / descriptionRemoved value: -"Work package type." - removed
Output schema / properties / items / items / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / items / items / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / items / items / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / items / items / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation markers: capped aggregations, unavailable modules, …" - removed
Output schema / properties / pagination / descriptionRemoved value: -"Total/page/page_size/has_more." - removed
Output schema / properties / pagination / properties / has_more / descriptionRemoved value: -"True when further pages exist." - removed
Output schema / properties / pagination / properties / page / descriptionRemoved value: -"1-based page number of this result." - removed
Output schema / properties / pagination / properties / page_size / descriptionRemoved value: -"Records requested per page." - removed
Output schema / properties / pagination / properties / total / descriptionRemoved value: -"Total matching records on the server." - removed
Output schema / properties / sums / defaultRemoved value: -null - removed
Output schema / properties / sums / descriptionRemoved value: -"Present only when show_sums was requested."
- Changed
set_project_favorite6 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of ``set_project_favorite`` (OpenProject >= 17)." - removed
Output schema / properties / favorite / descriptionRemoved value: -"The state now in effect: true when the project was favorited, false when the favorite was removed." - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - removed
Output schema / properties / id / descriptionRemoved value: -"Project id or identifier that was changed." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string" +] - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation."
- Changed
set_work_package_reminder7 fields changed- removed
Output schema / descriptionRemoved value: -"Outcome of ``set_work_package_reminder``." - removed
Output schema / properties / action / descriptionRemoved value: -"What actually happened: 'created' a new reminder, 'updated' the existing one, 'deleted' it, or 'unchanged' when there was nothing to clear." - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation." - changed
Output schema / properties / reminder / anyOfPrevious value: -[ - { - "description": "One personal reminder on a work package.", - "properties": { - "creator": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Who created it — always the authenticated user." - }, - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Reminder id. Personal and short-lived — set_work_package_reminder finds it by work package, so this is for reporting, not for addressing." - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Free-text note shown with the reminder; null when unset." - }, - "remind_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO 8601 UTC timestamp the reminder fires at." - }, - "work_package": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Work package the reminder is attached to." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "creator": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "note": { + "type": [ + "string", + "null" + ] + }, + "remind_at": { + "type": [ + "string", + "null" + ] + }, + "work_package": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / reminder / defaultRemoved value: -null - removed
Output schema / properties / reminder / descriptionRemoved value: -"The reminder after the call; the deleted one when action='deleted', null when there was none." - removed
Output schema / properties / work_package_id / descriptionRemoved value: -"Work package whose reminder was set or cleared."
- Changed
toggle_comment_reaction35 fields changed- removed
Output schema / descriptionRemoved value: -"The reactions on a comment after one of them was toggled." - removed
Output schema / properties / activity_id / descriptionRemoved value: -"Activity (journal entry) whose reactions these are." - removed
Output schema / properties / message / descriptionRemoved value: -"Human-readable confirmation." - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation notes; always a list, usually empty." - removed
Output schema / properties / reacted / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / reacted / defaultRemoved value: -null - removed
Output schema / properties / reacted / descriptionRemoved value: -"True when YOU now react with it, false when this call removed your reaction. Null when the authenticated user could not be determined." - added
Output schema / properties / reacted / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / reaction / descriptionRemoved value: -"The reaction this call toggled." - removed
Output schema / properties / reactions / descriptionRemoved value: -"Every reaction on the comment after the toggle; always a list, empty once the last one is removed." - removed
Output schema / properties / reactions / items / descriptionRemoved value: -"One reaction group on a comment: an emoji and everyone who picked it." - removed
Output schema / properties / reactions / items / properties / count / defaultRemoved value: -0 - removed
Output schema / properties / reactions / items / properties / count / descriptionRemoved value: -"How many people reacted with this emoji." - removed
Output schema / properties / reactions / items / properties / emoji / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / reactions / items / properties / emoji / defaultRemoved value: -null - removed
Output schema / properties / reactions / items / properties / emoji / descriptionRemoved value: -"The emoji character itself, e.g. '🚀'." - added
Output schema / properties / reactions / items / properties / emoji / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / reactions / items / properties / first_reaction_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / reactions / items / properties / first_reaction_at / defaultRemoved value: -null - removed
Output schema / properties / reactions / items / properties / first_reaction_at / descriptionRemoved value: -"ISO 8601 UTC timestamp of the first reaction of this kind." - added
Output schema / properties / reactions / items / properties / first_reaction_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / reactions / items / properties / reaction / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / reactions / items / properties / reaction / defaultRemoved value: -null - removed
Output schema / properties / reactions / items / properties / reaction / descriptionRemoved value: -"Reaction name, e.g. 'thumbs_up' or 'rocket'." - added
Output schema / properties / reactions / items / properties / reaction / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / reactions / items / properties / users / descriptionRemoved value: -"Users who reacted with it; always a list, never empty for a group OpenProject still reports." - removed
Output schema / properties / reactions / items / properties / users / items / descriptionRemoved value: -"A reference to another resource. Canonical output shape." - removed
Output schema / properties / reactions / items / properties / users / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / reactions / items / properties / users / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / reactions / items / properties / users / items / properties / id / descriptionRemoved value: -"Resource id." - added
Output schema / properties / reactions / items / properties / users / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / reactions / items / properties / users / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / reactions / items / properties / users / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / reactions / items / properties / users / items / properties / name / descriptionRemoved value: -"Human-readable name." - added
Output schema / properties / reactions / items / properties / users / items / properties / name / typeAdded value: +[ + "string", + "null" +]
- Removed
update_meeting - Removed
update_meeting_agenda_item - Removed
update_meeting_outcome - Removed
update_news - Changed
update_project48 fields changed- removed
Output schema / descriptionRemoved value: -"Full project detail: the row plus text fields and timestamps." - removed
Output schema / properties / active / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / active / defaultRemoved value: -null - removed
Output schema / properties / active / descriptionRemoved value: -"False for archived projects (read-only in the UI)." - added
Output schema / properties / active / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Description as markdown (raw); html is dropped." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Numeric project id; accepted by every project_id parameter." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / identifier / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / identifier / defaultRemoved value: -null - removed
Output schema / properties / identifier / descriptionRemoved value: -"URL slug from /projects/<identifier>; also accepted wherever an id is." - added
Output schema / properties / identifier / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / name / defaultRemoved value: -null - removed
Output schema / properties / name / descriptionRemoved value: -"Display name." - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / parent / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / parent / defaultRemoved value: -null - removed
Output schema / properties / parent / descriptionRemoved value: -"Parent project, when this is a subproject." - removed
Output schema / properties / public / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Output schema / properties / public / defaultRemoved value: -null - removed
Output schema / properties / public / descriptionRemoved value: -"True when visible to users without a membership." - added
Output schema / properties / public / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / status_code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status_code / defaultRemoved value: -null - removed
Output schema / properties / status_code / descriptionRemoved value: -"Project status code, one of: on_track, at_risk, off_track, not_started, finished, discontinued. A code, never a translated label; null means no status has been set." - added
Output schema / properties / status_code / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / status_explanation / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status_explanation / defaultRemoved value: -null - removed
Output schema / properties / status_explanation / descriptionRemoved value: -"Free-text explanation of status_code, markdown (raw)." - added
Output schema / properties / status_explanation / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / workspace_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / workspace_type / defaultRemoved value: -null - removed
Output schema / properties / workspace_type / descriptionRemoved value: -"Workspace kind: 'project', 'program' or 'portfolio'. Pre-17 instances only have 'project'; on 17.x project listings mix all three kinds, so check this before treating a row as a plain project." - added
Output schema / properties / workspace_type / typeAdded value: +[ + "string", + "null" +]
- Changed
update_time_entry41 fields changed- removed
Output schema / descriptionRemoved value: -"A single time entry with the fields only a detail read carries." - changed
Output schema / properties / activity / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / activity / defaultRemoved value: -null - removed
Output schema / properties / activity / descriptionRemoved value: -"Time-entry activity (Development, Management, …); instance-defined." - removed
Output schema / properties / comment / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / comment / defaultRemoved value: -null - removed
Output schema / properties / comment / descriptionRemoved value: -"Free-text comment as entered (raw); html is dropped." - added
Output schema / properties / comment / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / hours / defaultRemoved value: -null - removed
Output schema / properties / hours / descriptionRemoved value: -"Logged duration in hours as a float (1.5 = one and a half hours), converted from OpenProject's ISO 8601 duration." - added
Output schema / properties / hours / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Time entry id. Feed it to update_time_entry or delete_time_entry." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / lock_version / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / lock_version / defaultRemoved value: -null - removed
Output schema / properties / lock_version / descriptionRemoved value: -"Optimistic-locking version, when this instance reports one for time entries; null means the resource is updated without a lock version." - added
Output schema / properties / lock_version / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"Project the entry belongs to." - removed
Output schema / properties / spent_on / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / spent_on / defaultRemoved value: -null - removed
Output schema / properties / spent_on / descriptionRemoved value: -"The date the work was done, ISO YYYY-MM-DD." - added
Output schema / properties / spent_on / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / user / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / defaultRemoved value: -null - removed
Output schema / properties / user / descriptionRemoved value: -"User the time is booked for." - changed
Output schema / properties / work_package / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / work_package / defaultRemoved value: -null - removed
Output schema / properties / work_package / descriptionRemoved value: -"Work package the time is booked on; null for project-level entries."
- Changed
update_version42 fields changed- removed
Output schema / descriptionRemoved value: -"A single version as the write tools return it." - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Description as markdown (raw); html is dropped." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / end_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / end_date / defaultRemoved value: -null - removed
Output schema / properties / end_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD); the version's finish date." - added
Output schema / properties / end_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Version id — what update_version, delete_version and the work-package 'version' field consume." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / name / defaultRemoved value: -null - removed
Output schema / properties / name / descriptionRemoved value: -"Version name, e.g. 'Sprint 12' or '2.1'." - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"The project that DEFINES the version. A version shared from a parent project shows that parent here, not the project you asked about." - removed
Output schema / properties / sharing / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / sharing / defaultRemoved value: -null - removed
Output schema / properties / sharing / descriptionRemoved value: -"How far the version is shared: none, descendants, hierarchy, tree, system." - added
Output schema / properties / sharing / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / source / defaultRemoved value: -"version" - removed
Output schema / properties / source / descriptionRemoved value: -"'sprint' when the row came from the backlogs sprints endpoint, 'version' otherwise. Sprints ARE versions upstream, so a row can be both and is then reported as 'sprint'." - removed
Output schema / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / start_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status / defaultRemoved value: -null - removed
Output schema / properties / status / descriptionRemoved value: -"open, locked or closed. Locked and closed versions reject new work package assignments." - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +]
- Changed
update_work_package127 fields changed- removed
Output schema / descriptionRemoved value: -"Detail projection plus the milestone ``date`` field.\n\nMilestone types carry a single ``date`` instead of ``start_date``/\n``due_date``; both shapes are surfaced so a caller never has to guess." - changed
Output schema / properties / assignee / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / assignee / defaultRemoved value: -null - removed
Output schema / properties / assignee / descriptionRemoved value: -"Assigned user or group." - changed
Output schema / properties / author / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / author / defaultRemoved value: -null - removed
Output schema / properties / author / descriptionRemoved value: -"Creating user." - removed
Output schema / properties / available / defaultRemoved value: -null - removed
Output schema / properties / available / descriptionRemoved value: -"Feature availability for this WP: dev links, meetings, files." - changed
Output schema / properties / category / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / category / defaultRemoved value: -null - removed
Output schema / properties / category / descriptionRemoved value: -"Category." - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / custom_fields / descriptionRemoved value: -"Always a list; empty when none are set." - removed
Output schema / properties / custom_fields / items / descriptionRemoved value: -"Canonical custom-field read shape." - removed
Output schema / properties / custom_fields / items / properties / key / descriptionRemoved value: -"Wire key, e.g. 'customField12'." - removed
Output schema / properties / custom_fields / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / custom_fields / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / name / descriptionRemoved value: -"Display name, e.g. 'Severity'." - added
Output schema / properties / custom_fields / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / custom_fields / items / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / custom_fields / items / properties / type / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / type / descriptionRemoved value: -"Schema type, e.g. 'list', 'string'." - added
Output schema / properties / custom_fields / items / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / custom_fields / items / properties / value / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / value / descriptionRemoved value: -"Scalar value or resolved name(s)." - changed
Output schema / properties / custom_fields / items / properties / value_ids / anyOfPrevious value: -[ - { - "items": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ] - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "type": [ + "integer", + "string" + ] + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / custom_fields / items / properties / value_ids / defaultRemoved value: -null - removed
Output schema / properties / custom_fields / items / properties / value_ids / descriptionRemoved value: -"Ids for list/user/version custom fields." - removed
Output schema / properties / date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / date / defaultRemoved value: -null - removed
Output schema / properties / date / descriptionRemoved value: -"Milestone date (ISO YYYY-MM-DD); null for non-milestones." - added
Output schema / properties / date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Description as markdown (raw); html is dropped." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / display_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / display_id / defaultRemoved value: -null - removed
Output schema / properties / display_id / descriptionRemoved value: -"Human-facing id as the instance renders it. Matches the numeric id unless the instance uses semantic identifiers (17.x, e.g. 'PROJ-42'); null when the instance predates it." - added
Output schema / properties / display_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / due_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / due_date / defaultRemoved value: -null - removed
Output schema / properties / due_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / due_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / estimated_hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / estimated_hours / defaultRemoved value: -null - removed
Output schema / properties / estimated_hours / descriptionRemoved value: -"Estimate in hours." - added
Output schema / properties / estimated_hours / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Work package id." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / lock_version / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / lock_version / defaultRemoved value: -null - removed
Output schema / properties / lock_version / descriptionRemoved value: -"Optimistic-locking version; pass to update_work_package." - added
Output schema / properties / lock_version / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / notes / defaultRemoved value: -null - removed
Output schema / properties / notes / descriptionRemoved value: -"Degradation notes for this result." - changed
Output schema / properties / parent / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / parent / defaultRemoved value: -null - removed
Output schema / properties / parent / descriptionRemoved value: -"Parent work package." - removed
Output schema / properties / percentage_done / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / percentage_done / defaultRemoved value: -null - removed
Output schema / properties / percentage_done / descriptionRemoved value: -"Progress, 0-100." - added
Output schema / properties / percentage_done / typeAdded value: +[ + "integer", + "null" +] - changed
Output schema / properties / priority / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / priority / defaultRemoved value: -null - removed
Output schema / properties / priority / descriptionRemoved value: -"Priority." - changed
Output schema / properties / project / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project / defaultRemoved value: -null - removed
Output schema / properties / project / descriptionRemoved value: -"Owning project." - changed
Output schema / properties / project_phase / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / project_phase / defaultRemoved value: -null - removed
Output schema / properties / project_phase / descriptionRemoved value: -"Project phase this work package sits in (16.1+, only when phases are active in the project and visible to this user); details via get_project_phase." - removed
Output schema / properties / remaining_hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / remaining_hours / defaultRemoved value: -null - removed
Output schema / properties / remaining_hours / descriptionRemoved value: -"Remaining work in hours." - added
Output schema / properties / remaining_hours / typeAdded value: +[ + "number", + "null" +] - changed
Output schema / properties / responsible / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / responsible / defaultRemoved value: -null - removed
Output schema / properties / responsible / descriptionRemoved value: -"Accountable user." - removed
Output schema / properties / spent_hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Output schema / properties / spent_hours / defaultRemoved value: -null - removed
Output schema / properties / spent_hours / descriptionRemoved value: -"Logged time in hours." - added
Output schema / properties / spent_hours / typeAdded value: +[ + "number", + "null" +] - changed
Output schema / properties / sprint / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / sprint / defaultRemoved value: -null - removed
Output schema / properties / sprint / descriptionRemoved value: -"The sprint the work package is planned in; null when unassigned." - removed
Output schema / properties / start_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / start_date / defaultRemoved value: -null - removed
Output schema / properties / start_date / descriptionRemoved value: -"ISO date (YYYY-MM-DD)." - added
Output schema / properties / start_date / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / status / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / status / defaultRemoved value: -null - removed
Output schema / properties / status / descriptionRemoved value: -"Status." - removed
Output schema / properties / story_points / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / story_points / defaultRemoved value: -null - removed
Output schema / properties / story_points / descriptionRemoved value: -"Story points." - added
Output schema / properties / story_points / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / subject / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / subject / defaultRemoved value: -null - removed
Output schema / properties / subject / descriptionRemoved value: -"Subject line." - added
Output schema / properties / subject / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / target_versions / descriptionRemoved value: -"All target versions; legacy instances yield zero or one." - removed
Output schema / properties / target_versions / items / descriptionRemoved value: -"A reference to another resource. Canonical output shape." - removed
Output schema / properties / target_versions / items / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / target_versions / items / properties / id / defaultRemoved value: -null - removed
Output schema / properties / target_versions / items / properties / id / descriptionRemoved value: -"Resource id." - added
Output schema / properties / target_versions / items / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / target_versions / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / target_versions / items / properties / name / defaultRemoved value: -null - removed
Output schema / properties / target_versions / items / properties / name / descriptionRemoved value: -"Human-readable name." - added
Output schema / properties / target_versions / items / properties / name / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / type / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / type / defaultRemoved value: -null - removed
Output schema / properties / type / descriptionRemoved value: -"Work package type." - removed
Output schema / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / updated_at / defaultRemoved value: -null - removed
Output schema / properties / updated_at / descriptionRemoved value: -"ISO 8601 UTC timestamp." - added
Output schema / properties / updated_at / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / version / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / version / defaultRemoved value: -null - removed
Output schema / properties / version / descriptionRemoved value: -"Legacy alias: the sole target version, or null for zero/multiple."
- Changed
update_work_package_relation27 fields changed- removed
Output schema / descriptionRemoved value: -"One work-package relation.\n\nThe two endpoints that produce relations — the ``relations`` include of\n``get_work_package`` and the relation write tools — return this same shape.\n``from_work_package``/``to_work_package`` are spelled out because the wire's\n``from``/``to`` read as prepositions rather than as the two ends of an edge." - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Free-text note stored on the relation; null when unset." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / from_work_package / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / from_work_package / defaultRemoved value: -null - removed
Output schema / properties / from_work_package / descriptionRemoved value: -"Work package the relation starts at." - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Relation id. Pass it to update_work_package_relation or delete_work_package_relation — it is not a work package id." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / lag / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / lag / defaultRemoved value: -null - removed
Output schema / properties / lag / descriptionRemoved value: -"Working days kept between the predecessor and the successor. Only follows/precedes relations carry one; null everywhere else." - added
Output schema / properties / lag / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / reverse_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / reverse_type / defaultRemoved value: -null - removed
Output schema / properties / reverse_type / descriptionRemoved value: -"The same relation read from the 'to' work package: 'follows' <-> 'precedes', 'blocks' <-> 'blocked', 'relates' <-> 'relates'." - added
Output schema / properties / reverse_type / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / to_work_package / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / to_work_package / defaultRemoved value: -null - removed
Output schema / properties / to_work_package / descriptionRemoved value: -"Work package the relation points to." - removed
Output schema / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / type / defaultRemoved value: -null - removed
Output schema / properties / type / descriptionRemoved value: -"Relation type as OpenProject stored it, read from the 'from' work package (e.g. 'follows' means 'from' is scheduled after 'to')." - added
Output schema / properties / type / typeAdded value: +[ + "string", + "null" +]
- Changed
upload_attachment32 fields changed- removed
Output schema / descriptionRemoved value: -"One attached file." - changed
Output schema / properties / author / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "integer", + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / author / defaultRemoved value: -null - removed
Output schema / properties / author / descriptionRemoved value: -"User who uploaded the file." - removed
Output schema / properties / content_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / content_type / defaultRemoved value: -null - removed
Output schema / properties / content_type / descriptionRemoved value: -"MIME type detected by OpenProject from the bytes." - added
Output schema / properties / content_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / created_at / defaultRemoved value: -null - removed
Output schema / properties / created_at / descriptionRemoved value: -"ISO 8601 UTC upload timestamp." - added
Output schema / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / description / defaultRemoved value: -null - removed
Output schema / properties / description / descriptionRemoved value: -"Caption stored with the file." - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / file_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / file_name / defaultRemoved value: -null - removed
Output schema / properties / file_name / descriptionRemoved value: -"Stored file name including extension." - added
Output schema / properties / file_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / id / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / id / defaultRemoved value: -null - removed
Output schema / properties / id / descriptionRemoved value: -"Attachment id; pass it to download_attachment." - added
Output schema / properties / id / typeAdded value: +[ + "integer", + "string", + "null" +] - removed
Output schema / properties / size_bytes / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Output schema / properties / size_bytes / defaultRemoved value: -null - removed
Output schema / properties / size_bytes / descriptionRemoved value: -"File size in bytes." - added
Output schema / properties / size_bytes / typeAdded value: +[ + "integer", + "null" +] - removed
Output schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Output schema / properties / status / defaultRemoved value: -null - removed
Output schema / properties / status / descriptionRemoved value: -"Virus-scan state: 'uploaded'/'scanned' are downloadable, 'quarantined' is not, anything else is still being scanned." - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +]
8 tool updates
v0.3.3- Changed
bulk_update_work_packages7 fields changed- changed
Input schema / properties / updates / items / properties / changes / properties / assignee / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / updates / items / properties / changes / properties / priority / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / updates / items / properties / changes / properties / responsible / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / updates / items / properties / changes / properties / sprintAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": "__unchanged__", + "description": "Numeric sprint id from list_sprints; null (or 'none') clears it." +} - changed
Input schema / properties / updates / items / properties / changes / properties / status / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / updates / items / properties / changes / properties / type / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / updates / items / properties / changes / properties / version / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
create_work_package11 fields changed- changed
Input schema / properties / assignee / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / parent_id / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / priority / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / responsible / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / sprintAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Numeric sprint id; from list_sprints. Omit to leave unset." +} - changed
Input schema / properties / status / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / type / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "string" + } +] - removed
Input schema / properties / type / typeRemoved value: -"string" - changed
Input schema / properties / version / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / version / descriptionPrevious value: -"Numeric version / sprint id; from get_project_metadata."New value: +"Numeric version id; from get_project_metadata." - added
Output schema / properties / sprintAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "description": "A reference to another resource. Canonical output shape.", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Resource id." + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Human-readable name." + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The sprint the work package is planned in; null when unassigned." +}
- Added
get_sprint - Changed
get_work_package1 field changed- added
Output schema / properties / sprintAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "description": "A reference to another resource. Canonical output shape.", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Resource id." + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Human-readable name." + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The sprint the work package is planned in; null when unassigned." +}
- Added
list_sprints - Changed
list_versions1 field changed- changed
Input schema / properties / include_sprints / descriptionPrevious value: -"Also read /projects/{id}/sprints from the backlogs module and merge the rows in with source='sprint'. Requires project_id. If backlogs is not installed the versions are still returned and 'notes' says why sprints are missing — the call does not fail."New value: +"Also read /projects/{id}/sprints from the backlogs module and merge the rows in with source='sprint'. Requires project_id. If backlogs is not installed the versions are still returned and 'notes' says why sprints are missing — the call does not fail. Legacy backlogs versions only: on 17.3+ the endpoint serves standalone Sprint objects, which are skipped here (noted) — use list_sprints/get_sprint for those."
- Changed
list_work_packages2 fields changed- added
Input schema / properties / sprint_idsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Sprint ids; from list_sprints." +} - changed
Input schema / properties / version_ids / descriptionPrevious value: -"Version / sprint ids."New value: +"Version ids."
- Changed
update_work_package9 fields changed- changed
Input schema / properties / assignee / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / priority / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / responsible / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / sprintAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": "__unchanged__", + "description": "Numeric sprint id from list_sprints; null removes it." +} - changed
Input schema / properties / status / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / type / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / version / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / version / descriptionPrevious value: -"Numeric version/sprint id; null removes it."New value: +"Numeric version id; null removes it." - added
Output schema / properties / sprintAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "description": "A reference to another resource. Canonical output shape.", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Resource id." + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Human-readable name." + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The sprint the work package is planned in; null when unassigned." +}
8 tool updates
v0.3.2- Changed
create_recurring_meeting13 fields changed- changed
Input schema / properties / duration_minutes / descriptionPrevious value: -"Length of each occurrence in minutes (90 = one and a half hours). The result reports it back as duration_hours."New value: +"Length of each occurrence in minutes (90 = 1.5 hours); echoed as duration_hours." - changed
Input schema / properties / end_date / descriptionPrevious value: -"Last possible date as 'YYYY-MM-DD'; required for, and only valid with, end_after='specific_date'."New value: +"Last date as 'YYYY-MM-DD'; only with end_after='specific_date'." - changed
Input schema / properties / frequency / descriptionPrevious value: -"Repetition rule: 'daily', 'working_days' (every working day), 'weekly' (the default), 'monthly_day_of_month' (needs monthly_day) or 'monthly_nth_weekday' (needs monthly_ordinal + monthly_weekday)."New value: +"Repetition rule: 'daily', 'working_days', 'weekly' (default), 'monthly_day_of_month' (needs monthly_day) or 'monthly_nth_weekday' (needs monthly_ordinal + monthly_weekday)." - changed
Input schema / properties / interval / descriptionPrevious value: -"Every N days/weeks/months (default 1 = every occurrence of the rule). Not applicable to 'working_days'."New value: +"Every N days/weeks/months (default 1). Not applicable to 'working_days'." - changed
Input schema / properties / iterations / descriptionPrevious value: -"Total number of occurrences (1-1000); required for, and only valid with, end_after='iterations'."New value: +"Total occurrences (1-1000); only with end_after='iterations'." - changed
Input schema / properties / location / descriptionPrevious value: -"Room name or meeting URL every occurrence inherits. Omit for none."New value: +"Room name or URL every occurrence inherits; omit for none." - changed
Input schema / properties / monthly_day / descriptionPrevious value: -"Day of the month (1-31); required for, and only valid with, frequency='monthly_day_of_month'."New value: +"Day of the month (1-31); only with frequency='monthly_day_of_month'." - changed
Input schema / properties / monthly_ordinal / descriptionPrevious value: -"Which weekday of the month: 1-4, or -1 for the last one; required for, and only valid with, frequency='monthly_nth_weekday'."New value: +"Which weekday of the month: 1-4, or -1 for the last one; only with frequency='monthly_nth_weekday'." - changed
Input schema / properties / monthly_weekday / descriptionPrevious value: -"Weekday name ('monday'…'sunday'); required for, and only valid with, frequency='monthly_nth_weekday'."New value: +"Weekday name ('monday'…'sunday'); only with frequency='monthly_nth_weekday'." - changed
Input schema / properties / notify / descriptionPrevious value: -"True emails participants about schedule changes and cancellations. Defaults to false — an API-created series stays quiet."New value: +"Emails participants about schedule changes and cancellations; defaults to false (quiet)." - changed
Input schema / properties / project_id / descriptionPrevious value: -"Numeric id or identifier of the project the series belongs to. It must have the Meetings module enabled and this account needs the 'create meetings' permission in it."New value: +"Numeric id or identifier of the project; needs the Meetings module and 'create meetings' permission." - changed
Input schema / properties / start_time / descriptionPrevious value: -"First occurrence as ISO 8601 WITH a timezone: '2026-09-01T09:00:00Z' or '2026-09-01T11:00:00+02:00'. Must be now or in the future; a time without an offset is rejected locally."New value: +"First occurrence as ISO 8601 with a timezone: '2026-09-01T09:00:00Z' or '...+02:00'. Must be now or later; offset-less times are rejected locally." - changed
Input schema / properties / time_zone / descriptionPrevious value: -"IANA time zone the schedule computes in, e.g. 'Europe/Berlin' or 'Etc/UTC' — required, because it decides what 'every Monday 09:00' means across DST changes. Validated locally: OpenProject would store a typo silently and fall back to the account's zone."New value: +"IANA time zone the schedule computes in, e.g. 'Europe/Berlin'; decides what 'every Monday 09:00' means across DST. Validated locally — OpenProject would silently store a typo and fall back to the account's zone."
- Changed
create_work_package18 fields changed- changed
Input schema / properties / assignee / descriptionPrevious value: -"Numeric user id to assign. 'me' is not accepted in writes — call get_instance_info for the current user's id."New value: +"Numeric user id ('me' isn't accepted in writes; get_instance_info gives the current user's id)." - changed
Input schema / properties / attachment_paths / descriptionPrevious value: -"Local file paths to attach. Files upload uncontainered first and are claimed by the new work package, which is the flow that works even when the author lacks edit permission. Only usable when the server shares a filesystem with you (stdio transport)."New value: +"Local file paths to attach (stdio transport only — the server must share your filesystem)." - changed
Input schema / properties / custom_fields / descriptionPrevious value: -"Custom field writes keyed by wire key or display name: {'customField12': 'High'} or {'Severity': 'High'}. List/user/version fields accept option ids or option names. Unknown or ambiguous keys fail with the valid keys listed — nothing is ever silently dropped. get_work_package_schema shows what this project and type accept."New value: +"Custom field writes keyed by wire key or display name: {'customField12': 'High'} or {'Severity': 'High'}. List/user/version fields take ids or names. Unknown keys fail listing the valid ones. get_work_package_schema shows what this project/type accepts." - changed
Input schema / properties / date / descriptionPrevious value: -"The single ISO date of a **milestone**. Milestones carry `date` instead of start_date/due_date; passing both shapes is rejected locally."New value: +"ISO date for a **milestone** (used instead of start_date/due_date). Passing both is rejected locally." - changed
Input schema / properties / description / descriptionPrevious value: -"Body text in markdown. Omit for an empty description."New value: +"Body text in markdown." - changed
Input schema / properties / due_date / descriptionPrevious value: -"ISO date (YYYY-MM-DD). Not valid on milestone types."New value: +"ISO date (YYYY-MM-DD); not valid on milestones." - changed
Input schema / properties / estimated_hours / descriptionPrevious value: -"Estimate in hours as a decimal (7.5 = seven and a half)."New value: +"Estimate in hours, decimal (e.g. 7.5)." - changed
Input schema / properties / notify / descriptionPrevious value: -"Send OpenProject notification emails for this creation."New value: +"Email notifications for this creation." - changed
Input schema / properties / parent_id / descriptionPrevious value: -"Create this as a child of an existing work package id."New value: +"Work package id to create this as a child of." - changed
Input schema / properties / priority / descriptionPrevious value: -"Priority name or numeric id ('High', 'Normal', or 8). Omit for the instance default; priority ids differ per instance."New value: +"Priority name or id ('High', 'Normal', or 8). Omit for default." - changed
Input schema / properties / project / descriptionPrevious value: -"Numeric project id or project identifier (URL slug). Both come from list_projects."New value: +"Numeric project id or identifier (URL slug); from list_projects." - changed
Input schema / properties / remaining_hours / descriptionPrevious value: -"Remaining work in hours as a decimal."New value: +"Remaining work in hours, decimal." - changed
Input schema / properties / responsible / descriptionPrevious value: -"Numeric user id of the accountable person."New value: +"Numeric id of the accountable person." - changed
Input schema / properties / start_date / descriptionPrevious value: -"ISO date (YYYY-MM-DD). Not valid on milestone types."New value: +"ISO date (YYYY-MM-DD); not valid on milestones." - changed
Input schema / properties / status / descriptionPrevious value: -"Status name or numeric id. Omit to take the type's default status — do not guess an id."New value: +"Status name or numeric id. Omit for the type's default; don't guess." - changed
Input schema / properties / subject / descriptionPrevious value: -"The title. Required and must not be blank."New value: +"The title; must not be blank." - changed
Input schema / properties / target_versions / descriptionPrevious value: -"Target version ids. [] clears assignments; omit to use defaults. Multiple values require instance support. Mutually exclusive with version."New value: +"Target version ids. [] clears; omit to keep defaults. Multiple values need instance support. Mutually exclusive with version." - changed
Input schema / properties / type / descriptionPrevious value: -"Work package type as a **name or numeric id** ('Task', 'Bug', 'Milestone', or 7). Names resolve against this instance's types; an unknown or ambiguous name fails with the valid values listed."New value: +"Type name or id ('Task', 'Bug', 'Milestone', or 7). Unknown or ambiguous names fail listing the valid values."
- Added
enable_tool_group - Changed
list_time_entries8 fields changed- changed
Input schema / properties / activity_id / descriptionPrevious value: -"Only entries booked on this activity. Activity ids are instance-specific and come from get_project_metadata(project_id=...)."New value: +"Only entries booked on this activity; ids are instance-specific, from get_project_metadata(project_id=...)." - changed
Input schema / properties / fetch_all / descriptionPrevious value: -"Aggregate every page of rows into one result instead of returning page 1. Capped at 500 items with a note when the cap bites; mutually exclusive with page. sum_hours already reads every matching entry for its total, with or without fetch_all."New value: +"Aggregate every page into one result instead of page 1. Capped at 500 items (noted when it bites); mutually exclusive with page. sum_hours already reads every entry regardless." - changed
Input schema / properties / from_date / descriptionPrevious value: -"Earliest spent-on date, ISO YYYY-MM-DD, inclusive. Combine with to_date for a range; either bound may be omitted for an open-ended one."New value: +"Earliest spent-on date, ISO YYYY-MM-DD, inclusive; combine with to_date for a range (either bound optional)." - changed
Input schema / properties / page_size / descriptionPrevious value: -"Entries per page (max 100); the instance may clamp it lower and the returned pagination reports what actually came back."New value: +"Entries per page (max 100); the instance may clamp lower, reported in pagination." - changed
Input schema / properties / project_id / descriptionPrevious value: -"Only entries in this project (numeric id or identifier, from list_projects). Includes project-level entries that have no work package."New value: +"Only entries in this project (numeric id or identifier; from list_projects), including project-level entries with no work package." - changed
Input schema / properties / sum_hours / descriptionPrevious value: -"Compute an accurate total over EVERY matching entry (not just this page) and break it down per activity. Costs one request per 100 matches and is capped at 2000 entries — a cap hit is reported in 'notes'. Leave false when you only need rows."New value: +"Accurate total over every matching entry (not just this page), broken down per activity. One request per 100 matches, capped at 2000 (noted if hit). Leave false for rows only." - changed
Input schema / properties / user / descriptionPrevious value: -"Whose time to list: a numeric user id, or the literal 'me' for the token owner. Omit for everyone you are allowed to see — on most instances that is only your own entries unless you hold the view-all-time-entries permission."New value: +"Whose time to list: numeric user id, or 'me'. Omit for everyone you're permitted to see." - changed
Input schema / properties / work_package_id / descriptionPrevious value: -"Only entries booked on this work package. Ids come from search_work_packages / list_work_packages. The filter name differs between OpenProject versions; this tool probes the instance and uses the right one."New value: +"Only entries on this work package; ids from search_work_packages / list_work_packages."
- Changed
list_work_packages28 fields changed- changed
Input schema / properties / ancestor_id / descriptionPrevious value: -"Everything in this work package's subtree at any depth, unlike parent_id which is one level only."New value: +"Whole subtree, any depth (parent_id is one level only)." - changed
Input schema / properties / assignee / descriptionPrevious value: -"Assignee filter: numeric user ids, the single value 'me', or the single value 'none' for unassigned work. Ids come from search_principals; get_instance_info gives the current user."New value: +"Assignee filter: numeric user ids, 'me', or 'none' for unassigned work. get_instance_info gives the current user." - changed
Input schema / properties / author / descriptionPrevious value: -"Author (creator) user ids, or 'me'. 'none' is not valid here."New value: +"Author (creator) user ids, or 'me' ('none' not valid)." - changed
Input schema / properties / created_since / descriptionPrevious value: -"Created on or after this ISO date (YYYY-MM-DD)."New value: +"Created on/after, ISO date." - changed
Input schema / properties / due_after / descriptionPrevious value: -"Due on or after this ISO date (YYYY-MM-DD)."New value: +"Due on/after, ISO date." - changed
Input schema / properties / due_before / descriptionPrevious value: -"Due on or before this ISO date (YYYY-MM-DD)."New value: +"Due on/before, ISO date." - changed
Input schema / properties / fetch_all / descriptionPrevious value: -"Aggregate every page into one result instead of returning page 1. Capped at 500 items with a note when the cap bites; mutually exclusive with page."New value: +"Aggregate every page into one result instead of page 1. Capped at 500 items (noted when it bites); mutually exclusive with page." - changed
Input schema / properties / group_by / descriptionPrevious value: -"Group the full filtered set by one snake_case column (e.g. 'status', 'assignee'). Counts in `groups` cover every page, not just this one."New value: +"Group the full filtered set by one snake_case column (e.g. 'status'). Counts in `groups` cover every page." - changed
Input schema / properties / milestones_only / descriptionPrevious value: -"Only milestone-type work packages. Resolved against this instance's own types (no hardcoded ids) and intersected with type_ids when both are given."New value: +"Only milestone-type work packages; intersected with type_ids when both are given." - changed
Input schema / properties / parent_id / descriptionPrevious value: -"Direct children of this work package only. Mutually exclusive with top_level_only; use ancestor_id for the whole subtree."New value: +"Direct children only. Mutually exclusive with top_level_only; use ancestor_id for the whole subtree." - changed
Input schema / properties / percentage_done_max / descriptionPrevious value: -"Maximum progress percentage, 0-100."New value: +"Maximum progress percent." - changed
Input schema / properties / percentage_done_min / descriptionPrevious value: -"Minimum progress percentage, 0-100."New value: +"Minimum progress percent." - changed
Input schema / properties / priority_ids / descriptionPrevious value: -"Priority ids; from get_project_metadata. Never guess these — priority ids differ per instance."New value: +"Priority ids." - changed
Input schema / properties / project / descriptionPrevious value: -"Numeric project id or project identifier (URL slug) to scope the query. Both come from list_projects. Omit for a cross-project view."New value: +"Numeric project id or identifier (URL slug); from list_projects. Omit for a cross-project view." - changed
Input schema / properties / query / descriptionPrevious value: -"Optional free text, AND-combined with every other filter. Matches subject, description and comments. For text-only lookups prefer search_work_packages."New value: +"Free text, AND-combined with other filters; matches subject, description and comments." - changed
Input schema / properties / raw_filters / descriptionPrevious value: -"Escape hatch for filters this tool does not type, most importantly custom fields: [{'name': 'customField12', 'operator': '=', 'values': ['4']}]. Custom field names and option ids come from get_work_package_schema."New value: +"Escape hatch for untyped filters, e.g. custom fields: [{'name': 'customField12', 'operator': '=', 'values': ['4']}]. Field names and option ids come from get_work_package_schema." - changed
Input schema / properties / responsible / descriptionPrevious value: -"Accountable user ids, 'me', or 'none' for no accountable user."New value: +"Accountable user ids, 'me', or 'none' (no accountable user)." - changed
Input schema / properties / show_sums / descriptionPrevious value: -"Ask the server for totals (estimated/remaining/spent hours, story points) over the full filtered set. Never add up pages yourself."New value: +"Server-computed totals (estimated/remaining/spent hours, story points) over the full filtered set; never add up pages yourself." - changed
Input schema / properties / sort_by / descriptionPrevious value: -"Server-side sort as snake_case pairs, e.g. [['due_date','asc'],['priority','desc']]. An unknown key fails with the allowed set listed."New value: +"Sort as snake_case pairs, e.g. [['due_date','asc'],['priority','desc']]. An unknown key fails, listing the allowed set." - changed
Input schema / properties / start_after / descriptionPrevious value: -"Starts on or after this ISO date (YYYY-MM-DD)."New value: +"Starts on/after, ISO date." - changed
Input schema / properties / start_before / descriptionPrevious value: -"Starts on or before this ISO date (YYYY-MM-DD)."New value: +"Starts on/before, ISO date." - changed
Input schema / properties / status_ids / descriptionPrevious value: -"Exact status ids. **Overrides status_scope** — the two never fight. Ids come from get_project_metadata."New value: +"Exact status ids. **Overrides status_scope**." - changed
Input schema / properties / status_scope / descriptionPrevious value: -"Status bucket: 'open' (default), 'closed' or 'all'. An explicit status filter is always sent, so the server's implicit open-only default never silently applies. Ignored when status_ids is given."New value: +"Status bucket: 'open' (default), 'closed' or 'all'. Ignored when status_ids is given." - changed
Input schema / properties / top_level_only / descriptionPrevious value: -"Only work packages that have no parent. Excludes every subtask."New value: +"Work packages with no parent (excludes every subtask)." - changed
Input schema / properties / type_ids / descriptionPrevious value: -"Work package type ids (Task, Bug…); from get_project_metadata."New value: +"Type ids (Task, Bug…)." - changed
Input schema / properties / updated_since / descriptionPrevious value: -"Last changed on or after this ISO date (YYYY-MM-DD)."New value: +"Changed on/after, ISO date." - changed
Input schema / properties / version_ids / descriptionPrevious value: -"Version / sprint ids; from get_project_metadata."New value: +"Version / sprint ids." - changed
Input schema / properties / watcher / descriptionPrevious value: -"Work packages watched by these user ids, or 'me'."New value: +"Watched by these user ids, or 'me'."
- Changed
save_query7 fields changed- changed
Input schema / properties / filters / descriptionPrevious value: -"The filters to store, in the same shape run_query's override_filters and list_work_packages' raw_filters take — e.g. [{'name': 'status', 'operator': 'o', 'values': []}, {'name': 'assignee', 'operator': '=', 'values': ['12']}]. Values are ids (or 'me'), not display names. Pass [] deliberately for a view that filters nothing: unlike a listing, a stored query with no filters shows every status."New value: +"The filters to store, same shape as run_query's override_filters / list_work_packages' raw_filters, e.g. [{'name': 'status', 'operator': 'o', 'values': []}, {'name': 'assignee', 'operator': '=', 'values': ['12']}]. Values are ids (or 'me'), not names. Pass [] for a view with no filters — unlike a listing, it then shows every status." - changed
Input schema / properties / group_by / descriptionPrevious value: -"Column to group the results by, e.g. 'status', 'assignee', 'type' or 'version'. Grouping is what makes run_query return 'groups' with per-group counts. Omit for a flat list."New value: +"Column to group results by, e.g. 'status', 'assignee'. Makes run_query return 'groups' with per-group counts. Omit for a flat list." - changed
Input schema / properties / name / descriptionPrevious value: -"Name the view is saved under, e.g. 'Overdue in Platform'. Names are not unique upstream, so a second save with the same name creates a second view."New value: +"Name the view is saved under, e.g. 'Overdue in Platform'. Not unique upstream — a repeat name creates a second view." - changed
Input schema / properties / project_id / descriptionPrevious value: -"Numeric project id the view belongs to, from list_projects. Omit for a global (cross-project) view — but project-scoped filters such as version, category or subprojectId are then rejected."New value: +"Numeric project id the view belongs to; from list_projects. Omit for a global view — project-scoped filters (version, category, subprojectId) are then rejected." - changed
Input schema / properties / public / descriptionPrevious value: -"true shares the view with everyone who can see the project; false (default) keeps it private to the authenticated user. Sharing usually needs the 'manage public queries' permission."New value: +"true shares the view with everyone who can see the project; false (default) keeps it private. Sharing usually needs 'manage public queries'." - changed
Input schema / properties / sort_by / descriptionPrevious value: -"Stored sort order, e.g. [['due_date', 'asc'], ['id', 'desc']]. Keys are the snake_case work-package columns list_work_packages sorts by; unknown keys are rejected locally with the allowed set listed. Omit for the default."New value: +"Stored sort order, e.g. [['due_date', 'asc'], ['id', 'desc']]. Unknown keys are rejected locally, listing the allowed set. Omit for the default." - changed
Input schema / properties / star / descriptionPrevious value: -"Also star (favorite) the view for the authenticated user, so it appears in their sidebar. Done as a second call after the query exists; if it fails the query is still saved and 'notes' says so."New value: +"Also star (favorite) the view, so it appears in the sidebar. A second call after the query exists; a failure still leaves it saved (noted in 'notes') — don't re-save."
- Changed
update_meeting8 fields changed- changed
Input schema / properties / duration_minutes / descriptionPrevious value: -"New length in minutes (90 = one and a half hours); the end time is derived from it. Omit to keep the current duration."New value: +"New length in minutes (90 = 1.5 hours); the end time is derived from it. Omit to keep the current duration." - changed
Input schema / properties / location / descriptionPrevious value: -"New room name or meeting URL; REPLACES the stored one. Pass null or an empty string to clear it. Omit the parameter entirely (the default) to leave it untouched."New value: +"New room name or meeting URL; replaces the stored one. Null or an empty string clears it; omit to leave it untouched." - changed
Input schema / properties / lock_version / descriptionPrevious value: -"The lock_version you read from get_meeting. Pass it and the write fails loudly (409) if somebody else edited the meeting in the meantime. Omit it and the current version is fetched and echoed — still safe, just one more round trip and a slightly wider conflict window."New value: +"The lock_version from get_meeting. Passing it makes a concurrent edit fail loudly (409); omitting it fetches and echoes the current version — safe, but a wider conflict window." - changed
Input schema / properties / meeting_id / descriptionPrevious value: -"Numeric meeting id from list_meetings or get_meeting. Never a project id or an agenda item id."New value: +"Numeric meeting id from list_meetings or get_meeting (never a project or agenda item id)." - changed
Input schema / properties / participants / descriptionPrevious value: -"User ids of the FULL new invite list, from search_principals or a project's memberships. This REPLACES the whole set — anyone not listed is uninvited — so read the current list with get_meeting first and send it complete. Omit to leave the participants untouched."New value: +"Full new invite list (user ids), from search_principals or a project's memberships. Replaces the whole set — read the current list with get_meeting first and send it complete. Omit to leave untouched." - changed
Input schema / properties / start_time / descriptionPrevious value: -"New start as ISO 8601 WITH a timezone: '2026-08-03T14:00:00Z' or '2026-08-03T16:00:00+02:00'. A time without an offset is rejected locally rather than booked in the wrong hour. Omit to keep the current time."New value: +"New start as ISO 8601 with a timezone: '2026-08-03T14:00:00Z' or '...+02:00'. Offset-less times are rejected locally. Omit to keep the current time." - changed
Input schema / properties / state / descriptionPrevious value: -"New lifecycle state: 'open' publishes a draft to its participants (exactly what the UI's publish does), 'in_progress' starts it (required before outcomes can be recorded), 'closed' freezes it, 'cancelled' calls it off. There is no dedicated state endpoint upstream — this plain field is it."New value: +"New lifecycle state: 'open' publishes a draft to participants, 'in_progress' starts it (required before outcomes can be recorded), 'closed' freezes it, 'cancelled' calls it off." - changed
Input schema / properties / title / descriptionPrevious value: -"New meeting title. Omit to leave it alone; it cannot be cleared."New value: +"New title. Omit to leave alone; cannot be cleared."
- Changed
update_work_package13 fields changed- changed
Input schema / properties / assignee / descriptionPrevious value: -"Numeric user id to assign. Omit to leave unchanged; pass null (or 'none') to unassign — that sends a null href rather than a bogus user id."New value: +"Numeric user id; omit to leave unchanged, null (or 'none') to unassign." - changed
Input schema / properties / custom_fields / descriptionPrevious value: -"Custom field writes keyed by wire key or display name, e.g. {'Severity': 'High'}. Unknown or non-writable keys fail with the valid keys listed. Only the keys you pass are touched."New value: +"Custom field writes keyed by wire key or display name, e.g. {'Severity': 'High'}. Unknown or non-writable keys fail listing the valid ones. Only passed keys are touched." - changed
Input schema / properties / description / descriptionPrevious value: -"New markdown body. Omit to leave unchanged; pass null to empty it. Replaces the whole description — read it with get_work_package first if you mean to append."New value: +"New markdown body; omit to leave unchanged, null to empty it. Replaces the whole text; read it first to append instead." - changed
Input schema / properties / estimated_hours / descriptionPrevious value: -"Estimate in hours as a decimal."New value: +"Estimate in hours, decimal." - changed
Input schema / properties / id / descriptionPrevious value: -"Work package id to change (the #1234 number)."New value: +"Work package id to change (#1234)." - changed
Input schema / properties / lock_version / descriptionPrevious value: -"The `lock_version` you read from get_work_package. Pass it and the write fails loudly (409) if somebody else edited the work package in the meantime. Omit it and the current version is fetched and echoed — still safe, just one more round trip and a slightly wider conflict window."New value: +"The `lock_version` from get_work_package. Passing it makes a concurrent edit fail loudly (409); omitting it fetches and echoes the current version — safe, but a wider conflict window." - changed
Input schema / properties / notify / descriptionPrevious value: -"Send OpenProject notification emails for this change."New value: +"Email notifications for this change." - changed
Input schema / properties / parent_id / descriptionPrevious value: -"Re-parent this work package under another id; null detaches it and makes it top level. This is the only hierarchy tool — there is no separate set/remove-parent tool."New value: +"Re-parent under another id; null detaches to top level (the only hierarchy tool)." - changed
Input schema / properties / remaining_hours / descriptionPrevious value: -"Remaining work in hours as a decimal."New value: +"Remaining work in hours, decimal." - changed
Input schema / properties / responsible / descriptionPrevious value: -"Numeric user id of the accountable person; null clears it."New value: +"Numeric id of the accountable person; null clears it." - changed
Input schema / properties / status / descriptionPrevious value: -"New status as a name or numeric id. Validated through the form endpoint, so an invalid workflow transition comes back listing the statuses that *are* reachable from the current one."New value: +"New status as a name or id; invalid transitions list the reachable statuses." - changed
Input schema / properties / target_versions / descriptionPrevious value: -"Target version ids. [] clears assignments; omit to leave unchanged. Multiple values require instance support. Mutually exclusive with version."New value: +"Target version ids; [] clears, omit leaves unchanged. Multiple values need instance support. Mutually exclusive with version." - changed
Input schema / properties / version / descriptionPrevious value: -"Numeric version / sprint id; null removes it from the version."New value: +"Numeric version/sprint id; null removes it."
4 tool updates
v0.3.1- Changed
bulk_update_work_packages3 fields changed- added
Input schema / properties / updates / items / properties / changes / properties / remaining_hoursAdded value: +{ + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / updates / items / properties / changes / properties / story_pointsAdded value: +{ + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / items / items / properties / notesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null +}
- Changed
create_work_package4 fields changed- added
Input schema / properties / remaining_hoursAdded value: +{ + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Remaining work in hours as a decimal." +} - added
Input schema / properties / story_pointsAdded value: +{ + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Story points as a non-negative integer." +} - added
Output schema / properties / remaining_hoursAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Remaining work in hours." +} - added
Output schema / properties / story_pointsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Story points." +}
- Changed
get_work_package2 fields changed- added
Output schema / properties / remaining_hoursAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Remaining work in hours." +} - added
Output schema / properties / story_pointsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Story points." +}
- Changed
update_work_package4 fields changed- added
Input schema / properties / remaining_hoursAdded value: +{ + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Remaining work in hours as a decimal." +} - added
Input schema / properties / story_pointsAdded value: +{ + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Story points as a non-negative integer." +} - added
Output schema / properties / remaining_hoursAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Remaining work in hours." +} - added
Output schema / properties / story_pointsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Story points." +}
5 tool updates
v0.3.0- Added
bulk_update_work_packages - Changed
create_work_package3 fields changed- added
Input schema / properties / target_versionsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Target version ids. [] clears assignments; omit to use defaults. Multiple values require instance support. Mutually exclusive with version." +} - added
Output schema / properties / target_versionsAdded value: +{ + "description": "All target versions; legacy instances yield zero or one.", + "items": { + "additionalProperties": false, + "description": "A reference to another resource. Canonical output shape.", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Resource id." + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Human-readable name." + } + }, + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / version / descriptionPrevious value: -"Version / sprint."New value: +"Legacy alias: the sole target version, or null for zero/multiple."
- Changed
get_project_report_data3 fields changed- removed
Output schema / properties / closedRemoved value: -{ - "description": "Work packages in a closed status that changed inside the window — the 'done this week' set.", - "properties": { - "items": { - "description": "Items included (capped).", - "items": { - "description": "One work package inside a report window, compact enough to list hundreds of.", - "properties": { - "assignee": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Assigned user or group; null when unassigned." - }, - "created_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO 8601 UTC timestamp the work package was raised. A created_at whose date equals updated_at's is a row nothing has happened to since it was raised." - }, - "due_date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO date (YYYY-MM-DD); null when unset." - }, - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Work package id — the #1234 number get_work_package takes." - }, - "is_closed": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "True when this status carries the instance's isClosed flag. Null means the status was not in GET /statuses — treat it as unknown, never as open." - }, - "status": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Status as the instance names it." - }, - "subject": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Subject line." - }, - "type": { - "anyOf": [ - { - "additionalProperties": false, - "description": "A reference to another resource. Canonical output shape.", - "properties": { - "id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Resource id." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Human-readable name." - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Work package type (Task, Bug, …)." - }, - "updated_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO 8601 UTC timestamp." - } - }, - "type": "object" - }, - "type": "array" - }, - "more_via": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tool call that returns the full list." - }, - "total": { - "default": 0, - "description": "Total available items.", - "type": "integer" - }, - "truncated": { - "default": false, - "description": "True when items were dropped.", - "type": "boolean" - } - }, - "type": "object" -} - added
Output schema / properties / closed_updatedAdded value: +{ + "description": "Work packages currently closed and updated inside the window. This is not a completion-date filter; old closed tickets can be edited later.", + "properties": { + "items": { + "description": "Items included (capped).", + "items": { + "description": "One work package inside a report window, compact enough to list hundreds of.", + "properties": { + "assignee": { + "anyOf": [ + { + "additionalProperties": false, + "description": "A reference to another resource. Canonical output shape.", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Resource id." + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Human-readable name." + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Assigned user or group; null when unassigned." + }, + "created_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "ISO 8601 UTC timestamp the work package was raised. A created_at whose date equals updated_at's is a row nothing has happened to since it was raised." + }, + "due_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "ISO date (YYYY-MM-DD); null when unset." + }, + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Work package id — the #1234 number get_work_package takes." + }, + "is_closed": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "True when this status carries the instance's isClosed flag. Null means the status was not in GET /statuses — treat it as unknown, never as open." + }, + "status": { + "anyOf": [ + { + "additionalProperties": false, + "description": "A reference to another resource. Canonical output shape.", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Resource id." + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Human-readable name." + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Status as the instance names it." + }, + "subject": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Subject line." + }, + "type": { + "anyOf": [ + { + "additionalProperties": false, + "description": "A reference to another resource. Canonical output shape.", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Resource id." + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Human-readable name." + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Work package type (Task, Bug, …)." + }, + "updated_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "ISO 8601 UTC timestamp." + } + }, + "type": "object" + }, + "type": "array" + }, + "more_via": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Tool call that returns the full list." + }, + "total": { + "default": 0, + "description": "Total available items.", + "type": "integer" + }, + "truncated": { + "default": false, + "description": "True when items were dropped.", + "type": "boolean" + } + }, + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "from_date", - "to_date", - "created", - "updated", - "closed", - "time" -]New value: +[ + "from_date", + "to_date", + "created", + "updated", + "closed_updated", + "time" +]
- Changed
get_work_package2 fields changed- added
Output schema / properties / target_versionsAdded value: +{ + "description": "All target versions; legacy instances yield zero or one.", + "items": { + "additionalProperties": false, + "description": "A reference to another resource. Canonical output shape.", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Resource id." + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Human-readable name." + } + }, + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / version / descriptionPrevious value: -"Version / sprint."New value: +"Legacy alias: the sole target version, or null for zero/multiple."
- Changed
update_work_package3 fields changed- added
Input schema / properties / target_versionsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Target version ids. [] clears assignments; omit to leave unchanged. Multiple values require instance support. Mutually exclusive with version." +} - added
Output schema / properties / target_versionsAdded value: +{ + "description": "All target versions; legacy instances yield zero or one.", + "items": { + "additionalProperties": false, + "description": "A reference to another resource. Canonical output shape.", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Resource id." + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Human-readable name." + } + }, + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / version / descriptionPrevious value: -"Version / sprint."New value: +"Legacy alias: the sole target version, or null for zero/multiple."
84 tool updates
v0.1.0- First observed
add_meeting_agenda_item - First observed
add_meeting_outcome - First observed
add_work_package_comment - First observed
add_work_package_watcher - First observed
cancel_recurring_meeting_occurrence - First observed
copy_project - First observed
create_meeting - First observed
create_news - First observed
create_project - First observed
create_recurring_meeting - First observed
create_version - First observed
create_work_package - First observed
create_work_package_relation - First observed
delete_attachment - First observed
delete_meeting - First observed
delete_meeting_agenda_item - First observed
delete_meeting_outcome - First observed
delete_news - First observed
delete_project - First observed
delete_recurring_meeting - First observed
delete_time_entry - First observed
delete_version - First observed
delete_work_package - First observed
delete_work_package_relation - First observed
download_attachment - First observed
edit_work_package_comment - First observed
execute_custom_action - First observed
get_document - First observed
get_github_pull_request - First observed
get_instance_info - First observed
get_job_status - First observed
get_meeting - First observed
get_news - First observed
get_project - First observed
get_project_metadata - First observed
get_project_phase - First observed
get_project_report_data - First observed
get_recurring_meeting - First observed
get_user - First observed
get_wiki_page - First observed
get_work_package - First observed
get_work_package_git_activity - First observed
get_work_package_schema - First observed
init_recurring_meeting_occurrence - First observed
list_attachments - First observed
list_budgets - First observed
list_documents - First observed
list_file_links - First observed
list_meetings - First observed
list_memberships - First observed
list_news - First observed
list_notifications - First observed
list_permissions - First observed
list_project_phase_definitions - First observed
list_projects - First observed
list_queries - First observed
list_recurring_meetings - First observed
list_reminders - First observed
list_roles - First observed
list_time_entries - First observed
list_versions - First observed
list_work_package_comments - First observed
list_work_packages - First observed
log_time - First observed
mark_all_notifications_read - First observed
mark_notifications - First observed
remove_work_package_watcher - First observed
run_query - First observed
save_query - First observed
search_principals - First observed
search_work_packages - First observed
set_project_favorite - First observed
set_work_package_reminder - First observed
toggle_comment_reaction - First observed
update_meeting - First observed
update_meeting_agenda_item - First observed
update_meeting_outcome - First observed
update_news - First observed
update_project - First observed
update_time_entry - First observed
update_version - First observed
update_work_package - First observed
update_work_package_relation - First observed
upload_attachment
TDQS
Scored across 59 tools
Most tools target a distinct resource+action, and descriptions explicitly cross-reference alternatives (search_work_packages vs list_work_packages vs run_query; list_versions vs list_sprints; get_project_metadata vs get_work_package_schema). A few pairs remain easy to confuse at a glance—sprints versus versions, saved queries versus ad-hoc filters, and project phase definitions versus project phases—but the descriptions resolve them.
All 59 tools use snake_case verb_noun names (get_work_package, update_project, list_time_entries, delete_attachment, mark_notifications), with predictable list/get/create/update/delete patterns across domains. Minor outliers like run_query, save_query, log_time and toggle_comment_reaction still follow the verb_noun convention.
At 59 exposed tools this is a very heavy surface for an agent to navigate, spanning work packages, comments, watchers, relations, reminders, reactions, attachments, file links, projects, phases, queries, notifications, time entries, versions, sprints, principals, roles, memberships and metadata. The breadth is justified by OpenProject's domain, but 59 tools exceeds a comfortable selection budget and risks misselection.
Core lifecycle coverage is strong: work packages, projects, time entries, versions and comments each have full CRUD, with supporting metadata, schema, permission, job-status and notification tools. Gaps such as no edit/delete for saved queries, read-only file links and sprints, and admin-gated membership writes are explicitly documented but still leave a few dead ends.
Maintenance
Related MCP Connectors
Related MCP Servers
- MIT
- AlicenseNot gradedqualityAmaintenanceOpen source MCP server specializing in easy, fast, and secure tools for Databases.16,717Apache 2.0
- AGPL 3.0
- AlicenseNot gradedqualityCmaintenanceProduction-grade MCP server for universal reverse engineering automation.86GPL 3.0