Skip to main content
Glama

OpenProject CE MCP

PyPI Python 3.10+ License: MIT MCP

An MCP server for OpenProject that lets local AI agents read and manage project data through structured, guarded tools.

The server runs as a local subprocess of your MCP client over stdio. It wraps OpenProject API v3 and exposes typed tools for projects, work packages, memberships, versions, boards, meetings, time entries, and more.

Reading this on PyPI? All links below point to the GitHub repository — the docs/ pages and images ship in the git repo and source distribution, not in the installed package itself.

Why use this MCP

  • Context-frugal by design — compact, agent-shaped responses instead of raw HAL payloads (~21 fields + ~46 links per item in the raw API). Measured up to −99% tokens per response with select; see Context efficiency for the full numbers.

  • Guarded writes — every write follows a preview-then-confirm pattern; there is no way to bypass it.

  • Defense-in-depth project scope — MCP read/write allowlists restrict the token's effective scope in addition to OpenProject's own server-side permissions.

  • Typed tools, not a raw REST client — one call per intent (list, search, create, update) instead of hand-built HAL requests and link-following.


Related MCP server: OpenProject MCP Server

What you can do

Projects

  • List, create, copy, update, and delete projects

  • Read project configurations, lifecycle phases, and admin context

  • Create, update, and delete memberships and versions; list roles

Work packages

  • List and search work packages with structured filters

  • Create, update, and delete work packages; create subtasks; create, update, and delete relations; add comments (no edit or delete)

  • Upload, read (images and text inlined for the model), and delete attachments; add and remove watchers; read activity logs

  • Log, update, and delete time entries

Boards and views

  • Create, read, update, and delete saved boards (queries); read views

Meetings

  • Create, read, update, and delete meetings with their agenda items, sections, and outcomes

  • Manage recurring meetings: create, update, and delete series; list occurrences; initialize or cancel a single occurrence

Administration and schedules (opt-in)

  • Read user accounts and group memberships

  • Create, update, lock, unlock, and delete users; add and remove group members

  • Read and manage file storage connections (e.g. Nextcloud)

  • Read and manage users' non-working times and working hours

Supporting data

  • Fetch individual wiki pages by id; create, update, and delete news; read and update documents

  • Read and mark notifications; read help texts, working days, and instance configuration

  • Create and inspect grids; inspect custom options

All write operations follow a preview-then-confirm pattern: call a tool once to get a validated preview, then again with confirm=true to execute. There is no way to bypass this.


Scope: Community Edition

This MCP server targets OpenProject Community Edition only. It does not support Enterprise Edition features such as:

  • Placeholder Users

  • Portfolios

  • Programs

  • Custom Actions

  • Baseline Comparisons

Note: OpenProject Enterprise Edition includes its own MCP server. If you have an Enterprise license, use the official Enterprise MCP instead of this one.


How it works

  • Communicates with the MCP client over stdio — no remote server, no persistent storage

  • The core read groups (projects, work packages, memberships, versions, boards, meetings) are on by default, but until OPENPROJECT_READ_PROJECTS lists a project, only project-independent tools such as list_statuses, list_types and get_current_user are registered. Personal, admin, user-schedule, and extended metadata tools are opt-in

  • The project-scoped write categories are on by default, but their tools are registered only when both OPENPROJECT_READ_PROJECTS and OPENPROJECT_WRITE_PROJECTS list a project, and a write reaches only projects in both. The allowlists, not the category flags, are the real gate. Personal-data, admin, and user-schedule writes are opt-in

  • Create and update operations validate the payload against OpenProject form endpoints before writing; delete and other simple operations execute directly once confirmed

  • Project scope is enforced server-side: the MCP only exposes what the configured allowlists permit

  • Responses are bounded and paginated — compact summaries, not raw HAL payloads

A core reason to use this MCP instead of calling the OpenProject REST API directly: it returns context-frugal responses instead of raw HAL payloads — and not just for listing. The numbers below are measured against the same three representative work packages (real tiktoken counts, not a bytes/4 approximation); read/search/write/batch calls all land in the same −85% to −98% range. For the full per-call-type breakdown, the tool-catalog size numbers, and how to reproduce them, see Context efficiency.

Response

Tokens

vs. raw API

Raw OpenProject REST API v3 (HAL)

~9,992

baseline

list_work_packages (MCP)

~861

−91%

list_work_packages with select (5 fields)

~174

−98%


Install

This quickstart requires pipx; see Installation if it isn't installed yet.

pipx install openproject-ce-mcp
openproject-ce-mcp configure
openproject-ce-mcp --version

Already use uv? uv tool install openproject-ce-mcp works the same way. See Installation for when plain pip install is appropriate instead, and for uvx (a zero-install, run-on-demand alternative to installing at all).

configure collects your OpenProject URL, API token, and project scope, then writes the config for the MCP client(s) you choose. Project-scoped is recommended: the server is then available only in the current project. Global makes it available everywhere. Restart your MCP client afterward, then ask it to call get_current_user or list_projects to verify.

See Installation for requirements, updating, source installs, and uninstalling, and Clients for per-client setup guides.


Documentation

Full documentation lives in docs/, starting at the documentation hub:


Configuration essentials

Your client config (.mcp.json, .codex/config.toml, or .vscode/mcp.json) contains your API token — treat it like a password and keep it out of version control; choose your client-specific guide from Clients for the exact .gitignore step. configure writes a minimal config: only the values that differ from a safe default. The core read groups and the project-scoped write categories are enabled by default, but their project-bound tools are registered, and project access is granted, only once you list projects in OPENPROJECT_READ_PROJECTS (and, for writes, in OPENPROJECT_WRITE_PROJECTS too); that allowlist pair, not the category flags, is the real gate.

See Configuration for the full environment variable reference and what configure --quick vs. --advanced ask.


Security

Prompt Injection

User-provided text (work-package descriptions, comments, news, wiki content) is marked with <user-content> tags and flagged in server instructions as untrusted. Agents should treat this content as data, not as instructions.

See SECURITY.md for the full security model, including prompt injection mitigations, reporting procedures, and supported versions.


Questions and bug reports

Ask questions in GitHub Discussions. Report bugs and request features in GitHub Issues. Report security vulnerabilities privately as described in SECURITY.md.


Development

main is a frozen snapshot of the last release, not the active development branch. See CONTRIBUTING.md for which branch to clone (active development vs. bugfixes) and the full test suite (unit, integration, and Docker test instances).


License

MIT — see LICENSE. A single top-level license file covers the whole project; individual source files don't carry per-file copyright headers, matching common practice for MIT-licensed Python packages.

Available Tools

147 tools
add_work_package_commentB

Add a comment to a work package.

notify=false avoids change emails by default. The result never includes details/created_at, even on an ordinary, non-aggregated comment: OpenProject can aggregate a new comment into an existing, more recent journal entry (e.g. a prior status change) instead of always creating a fresh one, which would otherwise surface that unrelated change's details and timestamp here, and there is no reliable way to tell an aggregated response from a fresh one, so both fields are omitted unconditionally rather than only when aggregation is suspected; details_omitted is true. user is normally populated, but on rare cases where OpenProject's own write response omits it, a best-effort follow-up lookup fills it in; if that also comes back empty, user stays null even though the comment was saved successfully.

NameRequiredDescriptionDefault
notifyNo
commentYes
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
internalNo
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readOnly, non-destructive, non-idempotent, open-world, so the safety profile is covered. The description then adds genuinely non-obvious behavior: OpenProject may aggregate a new comment into an existing journal entry, `details`/`created_at` are omitted unconditionally, `details_omitted` is true, and `user` may be null after a failed follow-up lookup. It stops short of explaining permissions or the preview/confirm write flow.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and correct, but the aggregation explanation is a single sprawling multi-clause sentence that reasons through 'no reliable way to tell an aggregated response from a fresh one' at length. The same fact – details/timestamp are always omitted because of journal aggregation – could be stated in a quarter of the text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so for the tricky parts (omitted fields, `details_omitted`, possibly-null `user`). The remaining gap is that it never says what a successful response otherwise contains and says nothing about `internal` visibility semantics for a mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 40%, so the description should compensate. It clarifies `notify` beyond the bare 'Notify' title, and the schema itself documents `work_package_id` and `confirm`. However, `internal` (internal vs. external visibility) is undocumented in both places and `comment` gets no guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Add a comment to a work package.' Unambiguous, and no sibling tool competes for this action. It does not explicitly differentiate itself from siblings, but the operation is inherently distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only usage-adjacent statement is 'notify=false avoids change emails by default,' which is a parameter default rather than when-to-use guidance. Nothing is said about when to prefer an internal comment, when to use this versus editing the work package description, or when the confirm/preview flow matters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bulk_create_work_packagesA
Destructive

Create multiple work packages in one call.

New items have no identifier field to set (unlike bulk_update_work_packages's work_package_id); each result item is matched back to its input purely by index.

Each item in items must contain project, type, and subject. Optional fields per item: description, version, target_versions (a list of version names/ids for OpenProject's multi-version feature; cannot be combined with version on the same item), project_phase, assignee, responsible, priority, category, custom_fields, parent_work_package_id (or parent, an alias for the same field, matching create_work_package's naming; do not specify both on the same item), start_date (YYYY-MM-DD), due_date (YYYY-MM-DD), estimated_time, remaining_time, duration (ISO8601 duration strings, e.g. 'PT8H' or 'P1D'). An item containing any other key is rejected with an indexed validation error rather than silently dropping the unrecognized field. due_date falling on a non-working day (e.g. a weekend) can be silently moved forward to the next working day by OpenProject; compare the request and the returned item's result.result.due_date if the exact calendar date matters. This server does not expose a way to opt out of that shift (OpenProject's own ignoreNonWorkingDays flag is not a write parameter here).

A rejected item's validation is not a tool error; inspect each item's success, error, and nested result rather than the MCP error envelope.

select restricts each item's nested result to the given fields (e.g. ["ready", "work_package_id"]); an invalid name returns the allowed set. These are write-result fields (work_package_id, ready, state, ...), not work package fields: display_id and the rest come with result, the full written work package. The index/success/error fields on each item are always included regardless of select, so you can still tell which items succeeded; listing them in select is accepted and changes nothing. For batches with many items or long descriptions, set select proactively; an unconfirmed preview echoes each item's full proposed payload, and an unbounded batch can exceed the tool-result size limit and get redirected to a file.

A per-item timeout is reported as that item's failure and does not stop the loop. If this call is cancelled outright (e.g. the host cancels the request), items already created beforehand remain on the server; items not yet attempted are not created. No result summary is returned in that case (the call ends via cancellation, not a normal return); use list_work_packages/get_work_package afterward to determine what was actually written. This operation is not atomic; OpenProject CE has no batch/transaction endpoint.

Items are processed strictly sequentially in list order, and each result's index reflects that order; use this tool instead of parallel create_work_package/create_subtask calls whenever the relative order of a batch matters.

NameRequiredDescriptionDefault
itemsYes
selectNoFields to return; a requested unset field comes back as null. Allowed: action, error, index, message, payload, project, ready, result, state, success, validation_errors, work_package_id.
confirmNofalse: preview of every item, nothing changes. true: attempts every item; get the user's approval of the preview first. Failed items are reported per item; items already written are not undone.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes far beyond the annotations (destructiveHint=true, idempotentHint=false) by disclosing that the operation is non-atomic, that per-item validation failures are not tool errors, that a per-item timeout does not stop the loop, that an outright cancellation leaves already-created items on the server with no result summary, and that due_date may be silently shifted off non-working days with no opt-out. This is exactly the mutation-risk context an agent needs and 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and organized into topical paragraphs (fields, errors, select, cancellation, ordering), so it scans well despite its length. The field enumeration is long but each item carries non-obvious semantics; a few clauses (e.g. restating that listing always-included fields in select changes nothing) could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, yet the description fully explains the per-item result shape (index, success, error, nested result), how items map back to inputs, and what to do after a cancellation (query list_work_packages/get_work_package). Combined with the partial-failure and size-limit guidance, an agent has everything needed to call this correctly and interpret the outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 67% schema coverage, the description compensates thoroughly: it names the three required keys, enumerates every optional field with semantics the schema lacks (target_versions is incompatible with version, parent is an alias for parent_work_package_id and must not be combined, ISO8601 duration format, YYYY-MM-DD dates), and warns that unknown keys are rejected rather than dropped. It also explains select precisely (write-result fields vs. the nested result work package, index/success/error always included) and what confirm=false vs. true does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope ('Create multiple work packages in one call') and immediately differentiates itself from bulk_update_work_packages by noting there is no identifier field, only an index-based match. It also contrasts itself with create_work_package/create_subtask, so an agent can pick it out of a very crowded sibling list 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit selection rule against alternatives: use this instead of parallel create_work_package/create_subtask calls when the relative order of a batch matters. It also prescribes when to set select proactively (many items or long descriptions) and requires user approval of the preview before setting confirm=true.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bulk_update_work_packagesA
DestructiveIdempotent

Update multiple work packages in one call.

Each item's identifier field is work_package_id, not id, e.g. {"work_package_id": 952, "status": "Closed"}.

Each item in items must contain work_package_id. At least one other field must be present per item. Optional fields per item: subject, description, type, version, target_versions (a list of version names/ids for OpenProject's multi-version feature; pass [] to clear all; cannot be combined with version on the same item; rejected if the item's work package already has more than one target version assigned), sprint (Backlogs sprint name/id, requires the Backlogs module and OpenProject 17.3+), project_phase, status, assignee, responsible, priority, category, custom_fields, parent_work_package_id (or parent, an alias for the same field, matching update_work_package's naming; do not specify both on the same item), start_date (YYYY-MM-DD), due_date (YYYY-MM-DD), estimated_time, remaining_time, duration (ISO8601 duration strings, e.g. 'PT8H' or 'P1D'; pass 'none' to clear one of these), percentage_done (integer 0-100). Pass 'none' to version, sprint, project_phase, assignee, responsible, category, parent_work_package_id, or parent to clear that field on the item, same as update_work_package. An item containing any other key is rejected with an indexed validation error rather than silently dropping the unrecognized field. Setting an item's status to a closed status auto-fills percentage_done=100 and remaining_time=PT0H when that item doesn't supply them explicitly and OpenProject's schema reports those fields as writable. On an instance using status-based progress calculation, explicitly passing percentage_done together with a closing status on the same item is rejected with a hard, indexed validation error (percentageDone is not writable there) rather than silently ignored; omit percentage_done on that item and let OpenProject derive it instead.

due_date's non-working-day shift, the confirm/preview contract, select's item-trimming behavior, and cancellation/atomicity semantics all work exactly as documented on bulk_create_work_packages; only the affected result field differs (result.result.due_date here too). As there, select names write-result fields (work_package_id, ready, state, ...), not work package fields: display_id and the rest come with result, the full written work package.

NameRequiredDescriptionDefault
itemsYes
selectNoFields to return; a requested unset field comes back as null. Allowed: action, error, index, message, payload, project, ready, result, state, success, validation_errors, work_package_id.
confirmNofalse: preview of every item, nothing changes. true: attempts every item; get the user's approval of the preview first. Failed items are reported per item; items already written are not undone.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (destructive/idempotent/openWorld) with real behavioral detail: unknown keys are rejected with indexed errors, 'none' clears nullable fields, closed status auto-fills percentage_done/remaining_time, and percentage_done plus a closing status is hard-rejected on status-based-progress instances. However, the confirm/preview contract, item-trimming via select, and cancellation/atomicity semantics — critical for a destructive tool — are delegated to bulk_create_work_packages rather than restated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the highest-value fact (the work_package_id key naming) and is organized as lead sentence, field inventory, then edge-case rules. It is dense and the target_versions/sprint parentheticals plus the deferred-contract paragraph make it longer than strictly necessary, but every sentence carries operational rules.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description partially compensates by naming result shape fields (result.result.due_date, work_package_id, ready, state, display_id) and noting that select refers to write-result fields. Combined with the schema's confirm parameter documenting preview vs. execute, the description is nearly complete, though atomicity/cancellation behavior must still be read from a sibling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds substantial meaning beyond the 67%-covered schema: the 'none' sentinel for clearing, mutual exclusion of target_versions vs version and parent vs parent_work_package_id, target_versions [] to clear all, ISO8601 duration format, YYYY-MM-DD dates, percentage_done 0-100, and that select names write-result fields rather than work package fields. This compensates for the schema's terse titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: 'Update multiple work packages in one call'. The bulk scope distinguishes it from update_work_package, and the explicit instruction that the key is `work_package_id`, not `id`, immediately separates it from the single-item sibling's payload shape.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is clear from 'in one call' and the repeated comparison to update_work_package ('same as update_work_package', 'matching update_work_package's naming') plus the pointer to bulk_create_work_packages for shared contracts. It never states an explicit when-not-to-use (e.g. use update_work_package for a single item), leaving that inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_recurring_meeting_occurrenceA
DestructiveIdempotent

Cancel a virtual (not-yet-materialized) recurring-meeting occurrence.

Requires OpenProject 17.4+.

start_time: the occurrence's exact start time (ISO 8601), matching init_recurring_meeting_occurrence's addressing scheme.

If the occurrence has already been materialized into a real Meeting and is not itself cancelled, this fails with an error (delete_meeting the materialized meeting directly instead). If NOT yet materialized, OpenProject records the cancellation as a cancelled Meeting (init_recurring_meeting_occurrence restores it, a later schedule change of the series other than the time of day can delete it); this call's result does not report that new meeting's id; list_meetings/ list_recurring_meeting_occurrences(filter="cancelled") can be used to find it afterward if needed.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
start_timeYes
recurring_meeting_idYesRecurring meeting series id, from list_recurring_meetings.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructive/idempotent, but the description adds what actually happens underneath: a cancelled Meeting record is created, its id is not returned, and a series schedule change (other than time of day) can delete it later. It also names the recovery path (list_meetings / list_recurring_meeting_occurrences filter='cancelled'), 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then a version requirement, then parameter guidance, then the materialized-vs-virtual branch. Dense and nearly waste-free, though the informal parentheticals and line-broken layout make it slightly harder to scan than a tight paragraph would.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, so the description correctly notes that the result omits the new meeting's id and tells the agent how to locate it afterwards. Version requirement, failure mode, recovery path and semantics are all covered for a destructive mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%; start_time is undocumented in the schema, and the description compensates by specifying ISO 8601 and tying it to init_recurring_meeting_occurrence's addressing scheme. The confirm preview/apply workflow is left to the schema rather than reinforced here, so this stops short of 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Cancel a ... recurring-meeting occurrence') with the crucial qualifier 'virtual (not-yet-materialized)', which distinguishes it from delete_meeting and init_recurring_meeting_occurrence. An agent can immediately tell what this does and what it is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: if the occurrence is already materialized, use delete_meeting on the real Meeting instead; if not, this tool records a cancelled Meeting that init_recurring_meeting_occurrence can restore. Names the alternatives and the exact conditions selecting them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

copy_projectA

Copy an existing project into a new project.

name, identifier and the optional fields describe the new project. A confirmed copy starts a background job; poll get_job_status with the returned job_status_id. A rejected validation preview is not a tool error; inspect ready and validation_errors in the result rather than the MCP error envelope.

NameRequiredDescriptionDefault
nameYesDisplay name, at most 255 characters.
activeNofalse means archived.
parentNoParent project identifier, id, or name; omit for a top-level project.
publicNoWhether the project is public.
statusNoStatus title, any case, as listed in get_project_admin_context's available_statuses.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
identifierYesURL identifier such as "my-proj": letters, digits, ".", "_" and "-".
descriptionNoMarkdown text.
source_projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.
status_explanationNoMarkdown text explaining the status.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, it discloses the asynchronous background-job behavior, the need to poll get_job_status with job_status_id, and that rejected validation previews are not MCP errors but should be inspected via ready and validation_errors. These are high-value, non-obvious behavioral details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded: purpose first, then parameter scoping, then async job behavior, then validation-error handling. Every sentence carries necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a 10-parameter mutation tool with no output schema, the description covers the critical operational details: preview versus confirmed execution, background polling, and validation results. An agent has enough context to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameter documentation is already strong. The description adds useful grouping by saying name, identifier, and optional fields describe the new project, but it largely reiterates schema-level confirm semantics rather than adding substantially new parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: copy an existing project into a new project. It is clear and distinguishable from generic create/update siblings, though it does not explicitly name those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the confirm-preview workflow and says to poll get_job_status after a confirmed copy. It does not explicitly contrast with create_project or list when copying is preferable, but the operating context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_boardA

Create a saved OpenProject board/query.

This saves a work package query (filters, columns, sorting, grouping); a board grid that shows queries as columns is created with create_grid.

NameRequiredDescriptionDefault
nameYesBoard name, at most 255 characters.
hiddenNoIgnored by OpenProject; the value is not stored.
publicNoVisible to other users; false keeps it to its creator.
columnsNoColumn attribute ids (e.g. "id", "subject") or /api/v3/queries/columns/ hrefs.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
filtersNoOpenProject query filter objects, sent unchanged, e.g. {"_links": {"filter": {"href": "/api/v3/queries/filters/status"}, "operator": {"href": "/api/v3/queries/operators/o"}, "values": []}}.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.
sort_byNoSort criteria, each "field:direction" or "field-direction" (e.g. "id:asc"), a bare field (ascending), or a /api/v3/queries/sort_bys/ href; the direction is case-insensitive.
starredNoMark as a favorite query.
group_byNoGroup-by attribute id (e.g. "status") or its /api/v3/queries/group_bys/ href.
show_hierarchiesNoShow parent/child tree; cannot combine with group_by, so it defaults to false there.
timeline_visibleNoShow the Gantt timeline.
include_subprojectsNoAlso show work packages of subprojects.
highlighted_attributesNoColumn ids or hrefs whose values are highlighted.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-read-only, non-destructive, non-idempotent, open-world write; the description adds meaningful context by clarifying that what is persisted is a query definition (filters, columns, sorting, grouping) rather than a grid layout. It does not surface the preview/confirm two-step or the fact that some inputs are ignored, but the schema documents both, so the gap is modest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the core definition front-loaded and the sibling disambiguation second. The line break is cosmetic and does not hurt readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter mutation with no output schema, the description covers identity and routing, and the schema carries the rest. What is missing is the workflow-level context an agent needs before calling it: the preview-then-confirm approval loop and the permission implications of `public`.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 14 parameters is already documented in detail, including the ignored `hidden` flag and the confirm-preview semantics. The description only names the query attributes generically (filters, columns, sorting, grouping), which adds little beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Create a saved OpenProject board/query") and immediately defines what the resource actually is: a persisted work package query with filters, columns, sorting and grouping. It also explicitly separates itself from the sibling create_grid, so an agent can route correctly 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit alternative: if the intent is a board grid showing queries as columns, use create_grid instead. That is a real routing decision the agent would otherwise get wrong. It stops short of full when/when-not coverage (e.g. no mention of update_board for existing boards or permissions for public boards).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_gridA

Create a dashboard grid on a page.

A grid is the widget layout of My Page, a project overview or a board. The grid starts with OpenProject's default widgets for that page; other widgets are added in OpenProject. A board's saved work package queries are created with create_board.

NameRequiredDescriptionDefault
nameYesDisplay name, at most 255 characters.
scopeYesPage path: "/my/page", "/projects/<identifier>" or "/projects/<identifier>/boards", after the instance's root path on a subpath install. Any other scope is rejected before a request.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
row_countNoPositive integer; omitted lets OpenProject choose.
column_countNoPositive integer; omitted lets OpenProject choose.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only, non-destructive, open-world, non-idempotent mutation, so safety signaling is carried by structured fields. The description adds useful behavior (grid is seeded with default widgets, widgets are managed elsewhere) but does not cover permissions, the preview-then-confirm flow, or what gets created/returned, which the schema partly handles.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action in one short sentence, then adds only two supporting sentences of genuinely useful context about default widgets and create_board. No redundant restatement of name or schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create tool with no output schema but a fully documented input schema (including the confirm preview), the description supplies enough conceptual context to call it correctly. It could say slightly more about what a successful creation yields or permission needs, but the essentials are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so every parameter including the confirm preview semantics and scope path rules is already documented in the schema. The description adds no parameter-level meaning beyond that, which is the expected baseline when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific verb (create) and resource (dashboard grid) plus where it lives (a page), and defines what a grid is: the widget layout of My Page, a project overview, or a board. It also names the sibling create_board and explains that a board's saved queries come from it, so the agent can distinguish the two without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly notes that the grid starts with OpenProject's default widgets and that other widgets are added in OpenProject rather than via this tool, and routes board query creation to create_board. Clear context, though it doesn't explicitly contrast with update_grid or list_grids or state prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_meetingA

Create an OpenProject meeting.

Requires OpenProject 17.4+.

duration: an ISO 8601 duration like "PT1H30M" (hours/minutes only). state and notify cannot be set on create: OpenProject starts a new meeting as a draft with notifications off, so passing either is rejected; set them afterwards with update_meeting.

NameRequiredDescriptionDefault
stateNo
titleYes
notifyNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.
sharingNo
durationNo
locationNo
start_timeNo
participant_user_refsNoUsers to invite (id, login or name). The meeting gets exactly these participants, so name yourself to take part; it cannot be empty. No invitation is sent: a new meeting starts as a draft with notifications off.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover mutability (non-read-only, non-destructive, not idempotent), and the description adds real behavioral context: the meeting is created as a draft with notifications off, and state/notify are rejected. It does not mention permission requirements or what the response contains, which keeps it below 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation and version, then two short field-specific notes. Every sentence carries new information and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter creation tool with no output schema, the description says nothing about what is returned (e.g., the new meeting id), which an agent needs to chain follow-up calls. Behavioral and parameter context is otherwise adequate for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 30% schema description coverage, the description compensates by explaining the duration format (ISO 8601, hours/minutes only) and the rejection of state/notify. Combined with the schema-documented confirm and participant_user_refs, the important semantics are covered, though sharing, location, and start_time receive no added meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Create an OpenProject meeting") with a version prerequisite. It does not distinguish itself from siblings like create_recurring_meeting, but the intended operation is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit constraints (requires 17.4+) and pre-empts a common misuse by saying state and notify cannot be set on create and should be set with update_meeting instead. No general when-not-to-use guidance, but the routing for the excluded fields is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_meeting_agenda_itemA

Add an item to a meeting's agenda.

Requires OpenProject 17.6+. Rejected while the meeting is closed. For a work package, its project must be inside OPENPROJECT_WRITE_PROJECTS. To record a result of a discussed item use create_meeting_outcome.

NameRequiredDescriptionDefault
notesNoNotes in Markdown, at most 50,000 characters.
titleYesItem title, at most 255 characters; always required here.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
item_typeNo"simple" (a titled item) or "work_package" (an item for the work package given in work_package_id, which it then requires).
meeting_idYesMeeting id, from list_meetings.
work_package_idNoWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.
meeting_section_idNoSection of this meeting to add the item to, from list_meeting_sections; default: the last.
duration_in_minutesNoPlanned duration in minutes, 0 to 1440.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real context beyond annotations: version gating, the closed-meeting rejection rule, and the OPENPROJECT_WRITE_PROJECTS write guard, which annotations alone (readOnlyHint=false, destructiveHint=false) do not convey. It stops short of warning that the call is non-idempotent, i.e. repeating it creates duplicate items, which is the one behavior an agent most needs to know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences: purpose first, then the key precondition, then the routing rule to the alternative tool. No filler and no repetition of schema text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation with no output schema, the description covers preconditions, permissions, and sibling routing well, while confirm/preview semantics and id defaults are covered by the rich schema. Minor gap: nothing about ordering or duplicate creation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 a cross-parameter constraint the schema cannot express: a work_package item's project must fall inside OPENPROJECT_WRITE_PROJECTS. It does not otherwise elaborate on parameters such as confirm, which the schema already documents well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add an item to a meeting's agenda') and explicitly names the sibling it is not for ('To record a result of a discussed item use create_meeting_outcome'), so an agent can pick it apart from the outcome tools without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives when-to-use, when-not ('Rejected while the meeting is closed'), prerequisites (OpenProject 17.6+, project inside OPENPROJECT_WRITE_PROJECTS) and the alternative tool for the adjacent use case. Nothing essential 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_meeting_outcomeA

Create a meeting outcome on an agenda item.

Requires OpenProject 17.6+.

kind must be one of "information", "decision", "work_package" (OpenProject's real enum values, not e.g. "info" or "action", which OpenProject rejects with an internal server error rather than a clean validation error). "information"-kind outcomes require notes; "work_package"-kind outcomes require work_package_id.

NameRequiredDescriptionDefault
kindYes
notesNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
agenda_item_idYes
work_package_idNoWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly=false, destructive=false, idempotent=false), it discloses the version requirement and, notably, that a wrong kind value triggers a 500 internal server error instead of a clean validation error — genuinely useful behavioral context for an agent. It does not describe the write result or whether duplicates are allowed, but the safety profile is already carried by annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, then constraints follow in a sensible order. The parenthetical warning about "info"/"action" is long but earns its place by preventing a server error; the prose is otherwise tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A mutation tool with 5 parameters and no output schema; the description covers purpose, version gate, enum values, and per-kind requirements, while the confirm preview workflow is documented in the schema. Only the return shape (does it return the created outcome?) is left unstated, a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40% and the kind parameter has no enum in the schema at all, yet the description enumerates the exact valid values and explicitly rejects near-miss strings like "info" and "action". It also states the conditional requirements linking kind to notes and work_package_id, which the schema does not express.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Create a meeting outcome on an agenda item" gives a specific verb (create), a specific resource (meeting outcome) and its parent scope (agenda item), which separates it cleanly from create_meeting, create_meeting_agenda_item, and update_meeting_outcome 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives real preconditions: the OpenProject 17.6+ version floor, the allowed kind values, and which parameters each kind forces (notes for information, work_package_id for work_package). It does not say when to prefer this over update_meeting_outcome or how it relates to an existing outcome, so it stops short of full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_meeting_sectionA

Create a meeting section.

Requires OpenProject 17.6+.

backlog cannot be changed after creation via update_meeting_section; pass it only here, on create.

NameRequiredDescriptionDefault
titleYes
backlogNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
positionNo
meeting_idYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation safety profile. The description adds meaningful behavioral context by requiring OpenProject 17.6+ and warning that backlog is immutable after creation, which is not captured by annotations. It does not explain the confirm-preview workflow, though the schema does describe confirm separately.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short and front-loaded: the action comes first, followed by the version requirement and the backlog constraint. Every sentence adds practical information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with five parameters and low schema coverage, the description covers the most non-obvious constraint but does not provide enough parameter or workflow context. Annotations reduce the safety-disclosure burden, but the low schema coverage still leaves gaps around required fields and positioning.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 20%, so the description needs to compensate for undocumented parameters. It adds useful semantics for backlog, but leaves title, meeting_id, and position unexplained, and only marginally clarifies the creation flow.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create a meeting section.' It is distinguishable from update_meeting_section and delete_meeting_section by the create action, but it does not explicitly compare itself to those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a version prerequisite and a useful create-only rule for the backlog field. However, it does not explicitly say when to create a new section versus updating an existing one, nor does it describe workflow expectations for positioning or confirming creation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_membershipA

Create a project membership.

The preview is validated by OpenProject; problems come back in validation_errors.

NameRequiredDescriptionDefault
rolesYesAt least one; role ids or exact role names (case-insensitive), from list_roles.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.
principalYesUser or group: numeric id, exact name (case-insensitive), or "me".
notification_messageNoMarkdown text for OpenProject's membership notification.

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose that this is a non-read-only, non-destructive, non-idempotent mutation. The description adds useful behavioral context beyond annotations by explaining that the preview is validated by OpenProject and that problems are returned in validation_errors. It does not contradict 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loads the core action, and contains no wasted wording. Both sentences contribute useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema and annotations are rich enough to support calling the tool, but there is no output schema. The description notes validation_errors but does not explain the successful return value or summarize the confirm/apply workflow, leaving some contextual gaps for a mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are already well documented in the input schema. The description does not add parameter-specific meaning beyond that, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create a project membership.' This clearly distinguishes it from update_membership and delete_membership by operation type, though it does not explicitly name or route the agent away from those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not say when to use create_membership versus update_membership, when not to use it, or what prerequisites are needed. The mention of preview validation hints at the tool's workflow but does not provide explicit usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_newsC

Create a news entry inside a project.

NameRequiredDescriptionDefault
titleYesAt most 255 characters.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.
summaryNoShort plain text, at most 500 characters.
descriptionNoFull text in Markdown.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds only the project-scoping context and says nothing about the two-phase confirm/preview behavior, permission requirements, or whether duplicate titles are allowed — meaningful traits for 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero waste, but it is under-specified rather than efficient — the brevity leaves real gaps (confirm workflow, permissions) that would have earned their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 5 parameters, full schema coverage, and mutation annotations, the essentials are covered by structured fields; however, no output schema exists and the description never says what a successful create returns (e.g. the new news id) or how the confirm preview behaves, leaving gaps an agent would want filled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so title length, summary length, Markdown description, flexible project identifier, and the confirm preview/apply semantics are all documented in the schema. The description contributes no additional parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a news entry') and scopes it to 'inside a project', which is enough for an agent to distinguish it from get_news/list_news. It does not contrast itself with update_news or explain why one would create news versus other project content, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no when-to-use guidance, no prerequisites (e.g. project membership/permissions), and no mention of the preview-then-apply workflow that the confirm parameter implies. An agent must infer usage entirely from the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_projectA

Create a project.

Omitted optional fields are not sent, so OpenProject's defaults apply. A rejected validation preview is not a tool error; inspect ready and validation_errors in the result rather than the MCP error envelope.

NameRequiredDescriptionDefault
nameYesDisplay name, at most 255 characters.
activeNofalse means archived.
parentNoParent project identifier, id, or name; omit for a top-level project.
publicNoWhether the project is public.
statusNoStatus title, any case, as listed in get_project_admin_context's available_statuses.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
identifierYesURL identifier such as "my-proj": letters, digits, ".", "_" and "-".
descriptionNoMarkdown text.
status_explanationNoMarkdown text explaining the status.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real context beyond the annotations: omitted optional fields are not sent so OpenProject defaults apply, and the two-phase preview/apply pattern is disclosed. It also explains that a rejected preview returns in `ready`/`validation_errors` rather than the MCP error envelope, which is genuinely non-obvious. It stops short of stating permission requirements or the fact that confirm=true is a real, non-idempotent write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences with no padding, and the result-inspection caveat is placed after the default-behavior note. Slightly back-loaded: the most actionable detail (preview vs apply) could have been front-loaded above the defaults sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation with no output schema, the description covers the two things an agent would otherwise get wrong: the confirm gate and where validation failures appear. Missing only permission/authorization notes and what a successful result contains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so per-parameter meaning (including `confirm` and `status`) is already fully documented. The description only adds the general rule that omitted optionals fall back to defaults, which is marginal added value; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a project') which unambiguously distinguishes it from update_project, copy_project and delete_project in the sibling list. However it adds no scoping detail (where the project lands, required identifier constraints) that would sharpen purpose beyond the name itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies the create flow and explains the confirm/preview protocol, but never says when to use this versus copy_project or when a project should be created at all. No prerequisites (permissions, uniqueness of identifier) are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_recurring_meetingA

Create a recurring meeting series; its template meeting starts as a draft.

Requires OpenProject 17.4+. For a single meeting use create_meeting. Occurrences are virtual until init_recurring_meeting_occurrence creates one; the series is changed with update_recurring_meeting.

NameRequiredDescriptionDefault
titleYesSeries title, at most 255 characters.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.
end_dateNoLast date (YYYY-MM-DD); required for end_after "specific_date".
intervalNoEvery n-th day, week or month, 1 to 100; "working_days" always uses 1.
end_afterNo"never" (default), "specific_date" (requires end_date) or "iterations" (requires iterations).
frequencyYes"daily", "working_days", "weekly", and from 17.5 "monthly_day_of_month" or "monthly_nth_weekday".
iterationsNoNumber of occurrences, 1 to 1000; required for end_after "iterations".
start_timeYesFirst occurrence, ISO 8601 date-time with offset; its time of day is the series'.
monthly_dayNoDay of month, 1 to 31; required for "monthly_day_of_month".
monthly_ordinalNo"1" to "4", or "-1" for the last; required for "monthly_nth_weekday".
monthly_weekdayNoLowercase English weekday, e.g. "monday"; required for "monthly_nth_weekday".

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare non-read-only, non-destructive, non-idempotent, open-world; the description adds real behavioral context beyond them — the template meeting is created as a draft, and occurrences do not exist until initialized. It does not cover the preview/confirm workflow or authentication needs, but the confirm preview semantics are already spelled out in the schema, so the remaining gap is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and the object, then the sibling routing, then the occurrence lifecycle. Nothing is wasted and the line breaks do not impede reading.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter scheduling tool with no output schema, the description covers version requirements, sibling alternatives, draft state, and occurrence lifecycle. The only real omission is what the call returns (e.g. the series identifier an agent would need for follow-up calls), which the schema cannot supply.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all twelve parameters including the frequency/end_after conditional dependencies are already documented. The description adds no parameter-level meaning beyond the schema (no frequency/interval interaction guidance), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a recurring meeting series') and immediately distinguishes the artifact from a single meeting and from the series' individual occurrences. An agent can tell this apart from create_meeting, update_recurring_meeting, and init_recurring_meeting_occurrence 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'For a single meeting use create_meeting' and 'the series is changed with update_recurring_meeting', plus the prerequisite 'Requires OpenProject 17.4+'. It also flags that occurrences are virtual until init_recurring_meeting_occurrence creates one, which is the key alternative an agent would otherwise get wrong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_subtaskA
Destructive

Create a subtask under an existing work package.

The tool validates the payload first. Concurrent calls to this tool (or create_work_package) do not preserve call order in the resulting IDs; use bulk_create_work_packages when order across several new items matters. target_versions accepts a list of version names/ids to assign multiple target versions at once (OpenProject's multi-version feature). target_versions and version write the same underlying data and cannot be used together in one call.

NameRequiredDescriptionDefault
typeYes
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
subjectYes
versionNo
assigneeNo
categoryNo
due_dateNo
priorityNo
start_dateNo
descriptionNo
responsibleNo
custom_fieldsNo
project_phaseNo
target_versionsNo
parent_work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a destructive, non-idempotent, open-world write, so the bar is lower; the description still adds real behavior beyond them — payload validation before writing, the non-deterministic ID ordering under concurrency, and the mutually exclusive version fields. It omits the preview/confirm workflow (only documented in the confirm parameter) and says nothing about permissions or what a validation failure looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and each following sentence adds a distinct constraint (validation, ordering, version exclusivity) with no filler. The mid-sentence line breaks make it slightly harder to scan, but nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter mutation with no output schema, the description covers the tricky interactions but leaves the agent without guidance on the preview-then-confirm flow at the top level, on which of the many optional fields are typically required, or on failure behavior. Adequate but clearly incomplete for this schema size.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 15 parameters and only 13% schema description coverage, the description must compensate and largely does not. It explains target_versions (multi-version assignment) and its exclusivity with version, but the other thirteen parameters — type, subject, assignee, category, priority, dates, responsible, custom_fields, project_phase, confirm — get no semantics at all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a subtask') and pins it to a required parent ('under an existing work package'), which distinguishes it from the generic create_work_package sibling. It does not explicitly say 'use create_work_package for top-level items', so the sibling boundary is implied by the parent requirement rather than spelled out.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete routing guidance: use bulk_create_work_packages when ordering across several new items matters, and target_versions vs version cannot be combined. It does not state prerequisites such as required permissions or when a subtask should be created versus a child work package via create_work_package.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_time_entryA

Create a time entry.

hours accepts an ISO8601 duration string (e.g., 'PT8H' for 8 hours, 'P1D' for 1 day). start_time is an ISO 8601 date-time and requires the instance setting "allow tracking of start and end times"; ignored otherwise. No end_time parameter -- OpenProject derives it read-only from start_time + hours. Use create_time_entry_until to specify an end time instead of hours directly.

NameRequiredDescriptionDefault
userNo
hoursYes
commentNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
ongoingNo
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.
activityYes
spent_onYes
start_timeNo
work_package_idNoWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry the write/open-world/non-idempotent profile, and the description adds real behavioral facts beyond them: start_time is silently ignored unless an instance setting is enabled, and end_time is server-derived (read-only) rather than settable. It doesn't discuss side effects on work-package spent time or duplicate-entry behavior, but the key silent-failure mode is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short paragraphs with the purpose front-loaded and each following sentence introducing a distinct, non-obvious fact (duration format, conditional start_time, derived end_time, sibling routing). No filler or repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter mutation with no output schema and 30% coverage, the description covers the trickiest inputs but omits what 'activity' should be (a sibling list_time_entry_activities exists and isn't referenced), what 'spent_on' expects format-wise, and what 'ongoing' toggles. The confirm/preview workflow is handled by the schema, so its absence here is acceptable, but the remaining gaps are material.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 30% schema coverage, the description does the heavy lifting on the two hardest parameters: hours is an ISO8601 duration with 'PT8H'/'P1D' examples, and start_time is an ISO 8601 date-time with an enablement condition. It also explains why no end_time exists. Activity, spent_on, ongoing, and user remain undocumented in both places, so it doesn't fully compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource ('Create a time entry') and the closing sentence differentiates it from the sibling create_time_entry_until by the exact condition that separates them (end time vs. hours). An agent can pick between the two creation tools from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit alternative and the condition selecting it ('Use create_time_entry_until to specify an end time instead of hours directly'), plus a runtime prerequisite for start_time ('requires the instance setting "allow tracking of start and end times"; ignored otherwise'). It stops short of stating when not to log time at all or noting the sibling that supplies valid activity values.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_time_entry_untilA

Create a time entry by start/end time instead of a duration.

Computes hours = end_time - start_time locally; only hours and start_time are sent to OpenProject (end_time itself is never accepted by the server, see create_time_entry's docstring). end_time must be strictly after start_time. There is no ongoing parameter here -- a time entry with a known end time is complete, not still running; use create_time_entry for an ongoing entry.

NameRequiredDescriptionDefault
userNo
commentNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.
activityYes
end_timeYes
spent_onYes
start_timeYes
work_package_idNoWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare mutating, non-idempotent, non-destructive behavior, and the description adds genuinely new context: hours are computed locally and only hours + start_time are submitted because the server rejects end_time, plus the strict end_time > start_time constraint. It stops short of stating permission requirements or what the confirm=false preview returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core behavior is front-loaded in the first sentence and the constraint follows immediately. The parenthetical cross-reference to create_time_entry's docstring is only mildly wasteful, and every remaining sentence carries behavioral information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation with no output schema, it covers the non-obvious computation and ordering rules that would otherwise cause failed calls. It leaves the preview-vs-applied result shape and permission prerequisites to the schema's confirm description and annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33% (9 params, most undocumented), and the description compensates for the critical pair — it explains that end_time is never transmitted and is converted to hours, and that start_time defines the base. However, required parameters activity, spent_on, and the optional user/comment remain unexplained in both places, leaving a real gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a time entry') plus the distinguishing mechanism ('by start/end time instead of a duration'). It explicitly names the sibling it differs from (create_time_entry / ongoing entries), so an agent can route between them 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The closing sentence gives a clear selection rule: known end time → this tool, ongoing entry → create_time_entry. It does not address the update counterparts (update_time_entry, update_time_entry_until), so the routing guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_versionB

Create a version for a project.

A rejected validation preview is not a tool error; inspect ready and validation_errors in the result rather than the MCP error envelope.

NameRequiredDescriptionDefault
nameYesDisplay name, at most 60 characters.
statusNoOne of "open", "locked", "closed".
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.
sharingNoOne of "none", "descendants", "hierarchy", "tree".
end_dateNoISO 8601 date (YYYY-MM-DD).
start_dateNoISO 8601 date (YYYY-MM-DD).
descriptionNoPlain text, not Markdown.

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (non-readOnly, non-destructive, non-idempotent, open-world). The description adds genuinely non-obvious behavior: a rejected validation preview is not an MCP error, so the agent must inspect ready/validation_errors in the result. It omits permission requirements and the duplicate-version risk implied by idempotentHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with no filler. The error-handling caveat is worth its space, though the line-broken formatting makes it slightly harder to scan than a single tight clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation tool with no output schema, the description discloses the result fields that matter (ready, validation_errors) but leaves out permission requirements, what a version conceptually is, and any note on side effects. It is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with per-parameter descriptions (name length, status/sharing values, confirm semantics, date format), so the schema carries the parameter burden. The description adds nothing parameter-specific; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Create a version for a project" names a specific verb and resource, and with only create_version/update_version/delete_version/list_versions in the sibling set, the create action is unambiguous. It stops short of differentiating itself from the sibling tools or saying what a version is in this system.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Nothing states when to use this versus update_version or how to obtain the required project/name values. The confirm/preview note hints at a workflow but is framed as error interpretation, not as when-to-use guidance or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_work_packageA
Destructive

Create a work package.

The tool validates the payload first. assignee: 'me' or numeric user id (e.g., 42). Call list_users to find ids. parent: internal id (e.g., 952) or display_id (e.g., "PROJ-51"), not UI display number to nest the new work package under a parent. estimated_time, remaining_time, duration accept ISO8601 duration strings (e.g., 'PT8H' for 8 hours, 'PT1H30M' for 1.5 hours, 'P1D' for 1 day, 'P2W' for 2 weeks). target_versions accepts a list of version names/ids to assign multiple target versions at once (OpenProject's multi-version feature); omit it, or pass [], to create with no target version assigned. target_versions and version write the same underlying data and cannot be used together in one call. due_date falling on a non-working day (e.g. a weekend) can be silently moved forward to the next working day by OpenProject; compare the request and the returned result.due_date if the exact calendar date matters. This server does not expose a way to opt out of that shift (OpenProject's own ignoreNonWorkingDays flag is not a write parameter here). A rejected validation preview is not a tool error; inspect ready and validation_errors in the result rather than the MCP error envelope. If you issue multiple create_work_package/create_subtask calls concurrently, OpenProject assigns IDs in server completion order, not call order; use bulk_create_work_packages instead when relative ID/creation order across a batch matters.

NameRequiredDescriptionDefault
typeYes
parentNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.
subjectYes
versionNo
assigneeNo
categoryNo
due_dateNo
durationNo
priorityNo
start_dateNo
descriptionNo
responsibleNo
custom_fieldsNo
project_phaseNo
estimated_timeNo
remaining_timeNo
target_versionsNo

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructive/openWorld/non-idempotent annotations, it discloses non-obvious behaviors: validation is previewed before applying, built-in due-date shifting on non-working days with no opt-out, non-tool-error validation rejections that surface in `ready`/`validation_errors`, and server-completion-order ID assignment. These are exactly the behavioral traits an agent could not 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then a dense sequence of parameter and behavior notes; nearly every sentence carries unique information (duration examples, due-date shift, concurrency ordering). Some sentences are long and wrapped awkwardly, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by telling the agent to inspect `ready`, `validation_errors`, and `result.due_date` in the result. For a 19-parameter mutation tool this is close to complete, with the main residual gap being coverage of structural fields (type, project, custom_fields) whose id/name resolution rules are unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 11% schema description coverage across 19 parameters, the description carries most of the burden and does well for the trickiest ones: parent id vs display_id, assignee 'me'/numeric with list_users lookup, ISO8601 duration syntax with examples, and the target_versions/version mutual exclusivity with an explicit empty-list semantic. Unexplained remain project, type, subject, priority, responsible, category, custom_fields, project_phase, and the preview/confirm workflow (though the schema documents confirm).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first line names the verb and resource directly ('Create a work package'), and later sentences distinguish it from create_subtask and bulk_create_work_packages in the concurrency/id-ordering context. It does not explain when to prefer create_subtask (child creation) over this tool, so differentiation from siblings is partial rather than complete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete routing advice: call list_users to resolve assignee ids, and use bulk_create_work_packages when relative ID creation order across a batch matters. There is still no explicit guidance on create_subtask vs this tool for nested creation beyond the parent-parameter note, and no prerequisites/permission guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_work_package_relationA
Destructive

Create a relation between work packages.

relation_type: relates, duplicates, duplicated, blocks, blocked, precedes, follows, includes, partof, requires, required. work_package_id becomes from_id and related_to_work_package_id becomes to_id, but OpenProject stores only one canonical type per pair and silently rewrites the other: creating with relation_type='precedes' (or 'blocked', 'duplicated', 'partof', 'required') is stored as the paired canonical type ('follows', 'blocks', 'duplicates', 'includes', 'requires' respectively) with from_id/to_id SWAPPED relative to work_package_id/related_to_work_package_id. The canonical types themselves ('follows', 'blocks', 'duplicates', 'includes', 'requires', and non-directional 'relates') are stored exactly as given, with from_id/to_id unswapped. This happens once at creation and does not depend on which work package's relations you later query; always read the actual type/from_id/to_id from the response rather than assuming they match what you requested.

NameRequiredDescriptionDefault
lagNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
descriptionNo
relation_typeYes
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.
related_to_work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A3.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses critical non-obvious behavior: OpenProject stores only one canonical relation type per pair, silently rewrites certain requested types, and may swap from_id/to_id relative to the input. It also instructs the agent to read the actual type and IDs from the response rather than assume they match the request. This is exactly the kind of behavioral context annotations cannot provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and then provides dense, relevant detail about relation_type behavior. It is appropriately sized for a mutation with surprising canonicalization semantics, though the long run-on sentence about rewriting and swapping could be structured more readably.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the most important behavioral risk: canonical type rewriting and ID swapping. The schema already documents the confirm preview behavior, but the description omits usage guidance and does not explain the lag parameter, leaving minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds substantial meaning beyond the schema by enumerating the accepted relation_type values and explaining how work_package_id and related_to_work_package_id map to from_id/to_id, including the swap behavior. It does not explain the lag or description parameters, so there is still a gap, but the most consequential parameter semantics are covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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: 'Create a relation between work packages.' That clearly identifies the operation. It does not explicitly differentiate itself from siblings such as update_relation, delete_relation, or get_work_package_relations, so it falls short of the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not state when to use this tool versus alternatives such as update_relation or delete_relation. It also does not mention prerequisites, when to avoid creating a relation, or the preview/confirmation workflow described in the schema. Usage must be inferred from the verb alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_work_package_reminderA

Create a reminder on a work package.

remind_at is an ISO 8601 date-time (e.g. 2026-12-01T09:00:00Z). Only one active reminder per work package is allowed; creating a second one fails. Requires OpenProject 16.1+.

NameRequiredDescriptionDefault
noteNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
remind_atYes
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavioral facts beyond that: the unique-active-reminder constraint with its failure mode, the ISO 8601 format with an example, and the OpenProject 16.1+ requirement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences with zero filler: format, constraint, and version prerequisite in that order. Every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with annotations and no output schema, the description covers the key failure mode, format, and version requirement. The confirm/preview mechanism is documented in the schema, but the unexplained 'note' parameter leaves a small gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%; work_package_id and confirm already have schema descriptions, and the description usefully documents remind_at's ISO 8601 format. The 'note' parameter remains unexplained in both schema and description, so compensation is only partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Create a reminder on a work package'), so the operation is unambiguous. It does not explicitly differentiate from siblings like update_reminder or list_reminders, but the name's verb conveys the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives the 'one active reminder per work package' constraint and a version prerequisite (16.1+), which helps avoid errors. However, it never says when to use this versus update_reminder or delete_reminder, leaving alternative routing implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_attachmentB
DestructiveIdempotent

Delete an attachment; this cannot be undone.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
attachment_idYesAttachment id, from list_work_package_attachments.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true, so the safety profile is structured. The description's 'cannot be undone' reinforces irreversibility but adds nothing about the mandatory preview/approval flow, permission requirements, or side effects on related work package data, which are the details that would genuinely help.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short clause, front-loaded with the action and consequence, with zero filler. Its brevity is intentional, though it borders on under-specification given the irreversible nature of the operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With rich annotations, a fully documented two-parameter schema, and no output schema, the essentials are present. What's missing is behavioral framing beyond 'cannot be undone' – notably that the call is a no-op unless confirm=true and that user approval of the preview is expected – which the agent must discover from the schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters carry meaningful descriptions, including the crucial confirm-preview semantics. The tool description adds no parameter-level information, so it sits at the baseline for a fully documented schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Delete') and resource ('attachment'), so the operation is unambiguous. It does not distinguish itself from other deletion siblings (delete_news, delete_reminder, delete_work_package) beyond the resource name, but the resource word is enough to disambiguate here.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus get_attachment, list_work_package_attachments, or any restoration path. The preview-then-confirm workflow lives only in the schema's 'confirm' description, not in the tool description, so the description itself gives no procedural context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_boardA
DestructiveIdempotent

Delete one saved work package query; this cannot be undone.

A board grid that shows it as a column keeps a column pointing to the deleted query; board grids themselves are deleted with delete_grid.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
board_idYesBoard (saved query) id, from list_boards.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=true, so the baseline is low, yet the description adds two non-obvious facts: the action is irreversible and dependent grid columns are left pointing at a deleted query. It does not describe what the preview (confirm=false) returns, which is the one remaining behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the irreversible verb and resource, followed by the sibling routing and the side-effect caveat. No restatement of the name or schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive two-parameter tool with no output schema, the description supplies the key facts: permanence, naming disambiguation, and the cross-entity consequence. Only the preview return behavior and any deletion-blocking conditions are omitted, and part of that lives in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are documented in-schema, including the confirm=false preview vs. confirm=true apply protocol and where board_id comes from. The description adds no parameter-level detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete one saved work package query') and disambiguates 'board' as a saved query, which is the main naming ambiguity. It also names delete_grid as the tool for the adjacent grid concept, so an agent can tell the siblings apart 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence routes the agent away from this tool when the target is actually a board grid ('board grids themselves are deleted with delete_grid'), giving an explicit alternative. It stops short of stating preconditions for deletion (e.g., ownership or use-in-grid restrictions).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_gridA
DestructiveIdempotent

Delete a board grid; My Page and project overview grids cannot be deleted.

17.0+: its column queries are deleted too, as far as you may delete them. This cannot be undone.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
grid_idYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint and idempotentHint, so the description adds real value by disclosing irreversibility and the cascading removal of column queries in 17.0+. It stops short of stating permission requirements or what happens when the grid is already gone, and the 'as far as you may delete them' clause is vague about partial cascade.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and the eligibility constraint, then the version note and the irreversibility warning. Two of the sentences are efficient; the 'as far as you may delete them' phrasing is ambiguous filler that costs clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive two-parameter tool with no output schema, the description covers the essentials: what is destroyed, what cascades, when it is blocked, and that it is irreversible. The remaining gap is procedural (how to obtain grid_id and the preview-then-confirm flow), which the schema partially covers.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: confirm is documented in the schema but grid_id has no description anywhere. The description never explains where grid_id comes from (e.g., list_grids) or that confirm=false yields a preview, so it does not compensate for the undocumented required parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete a board grid') and immediately scopes which grids are eligible, which separates it from delete_board and update_grid without ambiguity. An agent can identify the object being removed and the excluded grid types in one read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the when-not case ('My Page and project overview grids cannot be deleted'), which prevents a class of failing calls. It does not mention alternatives such as update_grid for non-destructive changes or delete_board, so guidance is clear but not complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_meetingA
DestructiveIdempotent

Delete a meeting with its agenda, outcomes, attachments and the time entries logged on it.

Requires OpenProject 17.4+. Deleting a one-time meeting cannot be undone. An occurrence of a series is only cancelled; init_recurring_meeting_occurrence restores it, reset to the series template. Invited participants get a cancellation email when the meeting's notifications are on. The template meeting of a recurring series is rejected, because deleting it would break the series. To delete the series with all its occurrences use delete_recurring_meeting.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
meeting_idYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructive/idempotent/openWorld, but the description adds genuine context beyond them: the OpenProject 17.4+ requirement, irreversibility of one-time meeting deletion, cancellation emails sent to participants when notifications are on, template rejection, and that occurrences are only cancelled and reset to the series template on restore. These are side effects and preconditions an agent cannot infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short sentences, each carrying distinct load: cascade scope, version gate, reversibility, series semantics, and the routing alternative. The destructive caveat is front-loaded and nothing is repeated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description covers what an agent needs to call this safely: side effects, irreversibility, permission/version precondition, the series edge cases, and which sibling to use instead. The preview-then-apply confirm contract is handled by the schema, leaving no meaningful gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: the confirm flag is well documented in the schema itself, while meeting_id has no description in either place. The text implies the identifier distinguishes a meeting, an occurrence, or a series template, but never says how to obtain a meeting_id (e.g., via list_meetings) or what a rejected template call returns.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource plus the full cascade footprint ('with its agenda, outcomes, attachments and the time entries logged on it'), so the blast radius is clear from the first sentence. It is cleanly distinguishable from delete_recurring_meeting, which it explicitly routes to.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-not conditions and named alternatives: the template meeting of a series is rejected, and deleting the whole series requires delete_recurring_meeting instead. It also explains that an occurrence is merely cancelled and that init_recurring_meeting_occurrence restores it, which tells the agent exactly what this call does and does not achieve for each meeting type.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_meeting_agenda_itemA
DestructiveIdempotent

Delete a meeting agenda item with its outcomes.

Requires OpenProject 17.6+. Rejected while the meeting is closed. This cannot be undone.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
agenda_item_idYes

TDQS

A3.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: annotations only say destructive=true, whereas the description discloses that outcomes are cascaded away, that the operation is irreversible, that closed meetings are rejected, and that a server version is required. These are the exact behavioral facts an agent needs before invoking a destructive call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and its cascade effect, followed by environment and state constraints. Zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive two-parameter tool with no output schema, this covers irreversibility, cascade scope, and state preconditions. The remaining gap is the required identifier and the preview/confirm flow, the latter being handled by the schema's own parameter description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: the confirm parameter is well documented in the schema, but the single required parameter agenda_item_id has no description anywhere, and the description adds no clarification about what an agenda item id is or where to obtain it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (delete a meeting agenda item) plus an important scope detail: outcomes are deleted with it, which distinguishes it from the sibling delete_meeting_outcome. It does not, however, name any alternative tool explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides preconditions (OpenProject 17.6+, rejected while the meeting is closed) which help the agent predict failure, but gives no guidance on when to choose this over update_meeting_agenda_item or delete_meeting_outcome, and no mention of the preview/confirm workflow referenced by the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_meeting_outcomeB
DestructiveIdempotent

Delete a meeting outcome; this cannot be undone.

Requires OpenProject 17.6+.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
outcome_idYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so 'this cannot be undone' largely restates structured data. The one piece of net-new context is the version requirement (17.6+), which the annotations cannot express. The preview-then-apply safety workflow implied by the confirm parameter is left to 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and the irreversibility warning. It is efficient, though borderline under-specified for a destructive operation with a two-step confirm flow.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Rich annotations plus a schema-documented confirm parameter cover most of what an agent needs, and no output schema is expected here. Still missing is an explicit statement of the preview/apply workflow and any note on entity identification for outcome_id, which matters for an irreversible delete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: confirm is well documented in the schema, but outcome_id has no description anywhere. The tool description says nothing about either parameter, so it does not compensate for the gap — it never clarifies that confirm=false is a no-op preview and true performs the irreversible delete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (delete) and resource (meeting outcome), so the agent knows exactly what entity is affected. It does not distinguish itself from the sibling tools create_meeting_outcome or update_meeting_outcome, though the delete verb does most of the disambiguating work.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only usage signal is the prerequisite 'Requires OpenProject 17.6+', which is genuinely useful but constrains feasibility rather than telling the agent when to choose this over update_meeting_outcome. There are no explicit exclusions or alternative-tool routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_meeting_sectionA
DestructiveIdempotent

Delete a meeting section with its agenda items and their outcomes (they are not moved).

Requires OpenProject 17.6+. Rejected while the meeting is closed, and for the backlog section. This cannot be undone.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
section_idYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description adds substance beyond them: children are deleted rather than moved, the action cannot be undone, and two specific server-side rejection states are called out. That is exactly the kind of context 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and its cascade, followed by prerequisites and irreversibility. No filler; only the version-requirement sentence could be considered secondary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-idempotent-looking mutation with no output schema, the description covers failure modes, reversibility, and side effects well. The remaining hole is identifying the target section, which is left entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: `confirm` is well documented in the schema as a preview-then-apply flag, but `section_id` has no description anywhere. The description never explains what a section id refers to or how to obtain one (list_meeting_sections), so it does not compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (delete) and resource (meeting section) and immediately discloses the cascade: agenda items and their outcomes are deleted, not re-parented. That cascade note is what distinguishes it from delete_meeting_agenda_item or delete_meeting_outcome for an agent scanning siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete preconditions and exclusions: requires OpenProject 17.6+, is rejected while the meeting is closed, and is rejected for the backlog section. It does not name an alternative tool for cases where deletion is blocked (e.g., deleting agenda items individually), so it stops short of full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_membershipA
DestructiveIdempotent

Delete a project membership; this cannot be undone.

Roles inherited from a group stay: if some roles come from a group, only the direct ones are removed; if all do, the call is rejected.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
membership_idYesMembership id, from list_project_memberships.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is partly covered. The description adds important behavioral detail beyond annotations: the action cannot be undone, inherited group roles remain, only direct roles are removed, and the call is rejected if all roles are inherited.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight sentences with the core purpose and irreversibility front-loaded, followed by the nuanced group-role behavior. There is no redundant or wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive membership mutation, the description provides the essential warning and the group-role edge case. The preview/approval flow is handled by the schema, and no output schema is present, so the definition is nearly complete, with only minor missing context about alternatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so membership_id and the preview/confirm workflow are already documented in the schema. The description does not add parameter syntax or format details beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: delete a project membership, and immediately clarifies irreversibility. It is easily distinguishable from siblings such as update_membership, create_membership, and list_project_memberships.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The deletion use case is clear, and the rejection condition when all roles are inherited is useful. However, it does not explicitly compare this tool against update_membership or other management alternatives, leaving the agent to infer the choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_newsA
DestructiveIdempotent

Delete a news entry with its comments and attachments; this cannot be undone.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
news_idYesNumeric news id, as returned by list_news.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered; the description adds real context beyond them by disclosing that comments and attachments are destroyed along with the entry and that the deletion is irreversible. It stops short of noting permission requirements or what confirmation the call returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence naming the action, its cascade effects, and its irreversibility. No filler and nothing important buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter destructive tool with full schema coverage, no output schema, and strong annotations, the description supplies the one thing structured data cannot: the cascade and irreversibility. Only minor gaps remain, such as permissions or how to locate a valid news_id.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the confirm parameter's description already spells out the preview-then-approve workflow, so the schema carries the parameter burden. The description adds nothing about news_id provenance (e.g. that it comes from list_news) or the confirm flag, making this a baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Delete a news entry") and adds scope detail about the cascade to comments and attachments. The resource name alone separates it from the many other delete_* siblings, though it doesn't explicitly contrast with them or with update_news/create_news.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit when-to-use guidance, no prerequisites, and no mention of alternatives such as update_news or list_news for locating the target. The only usage signal is the implicit caution from "cannot be undone," and the confirm-preview workflow lives entirely in the schema rather than the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_projectA
Destructive

Delete a project and its subprojects (admin operation).

OpenProject archives them at once and deletes them in a background job, with their work packages, memberships, versions, time entries, news, wiki, forums, meetings, documents and storage links; this cannot be undone. OpenProject also tries to delete storage project folders managed automatically, with their files. Unless the project is already archived, rejected while work packages of other projects use one of their versions.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral detail beyond the annotations: it explains that the project is archived immediately and deleted in a background job, lists the affected sub-entities (work packages, memberships, versions, etc.), states irreversibility, mentions automatic deletion of storage folders, and describes rejection conditions. This is rich transparency for a destructive operation and is consistent with the provided annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action but becomes wordy and includes a confusing final sentence: 'Unless the project is already archived, rejected while work packages of other projects use one of their versions.' This sentence is grammatically awkward and adds ambiguity. The overall structure could be tightened without losing important information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (destructive, asynchronous deletion, open-world), the absence of an output schema, and the annotations covering safety hints, the description provides all necessary context: what gets deleted, irreversibility, background job behavior, and rejection conditions. An agent has enough information to call the tool correctly, including the need to preview via the confirm parameter (documented in the schema).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (confirm, project) are fully documented in the schema. The description adds no additional meaning about the parameters—it does not explain the confirm preview behavior or the project matching rules. Baseline 3 is appropriate when the schema carries the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb and resource: 'Delete a project and its subprojects (admin operation).' This unambiguously distinguishes it from other delete tools (delete_news, delete_work_package, etc.) and from update_project. An agent can immediately understand the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: it is an admin operation that cannot be undone, and it lists conditions when deletion is rejected. It doesn't explicitly state when to use this instead of alternatives (there are no alternatives for deleting a project), but the context is sufficient for an agent to know this is the tool for removing a project. No misleading guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_recurring_meetingA
DestructiveIdempotent

Delete a recurring meeting series with all its occurrences, past and future.

Requires OpenProject 17.4+. Each occurrence goes with its agenda, outcomes, attachments and time entries; this cannot be undone. Invited participants get a cancellation email when notifications are on.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
recurring_meeting_idYesRecurring meeting series id, from list_recurring_meetings.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=true, but the description goes well beyond them by enumerating the cascade (agenda, outcomes, attachments, time entries), stating irreversibility, noting the OpenProject 17.4+ version floor, and disclosing the cancellation emails sent to participants. That is exactly the extra context that matters for a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with what is destroyed, then version requirement, then cascade and irreversibility, then side effects. No filler and no repetition of the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, annotation-covered, two-parameter tool with no output schema, the description covers everything an agent needs: scope, blast radius, irreversibility, version constraint, and notification side effects. Nothing material is left to guesswork.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 both recurring_meeting_id (sourced from list_recurring_meetings) and the confirm preview/apply flag in detail. The description adds nothing about either parameter, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete a recurring meeting series') and immediately scopes it with 'with all its occurrences, past and future', which cleanly separates it from delete_meeting and cancel_recurring_meeting_occurrence. An agent can pick the right tool 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'all its occurrences, past and future' clause implicitly routes the agent away from the per-occurrence cancel tool and the single-meeting delete tool. It never names those siblings explicitly, nor does it state any prerequisites such as required permissions, 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.

delete_relationA
DestructiveIdempotent

Delete a relation between work packages; this cannot be undone.

Removing a follows/precedes relation reschedules the former successor.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
relation_idYesRelation id, from list_relations or get_work_package_relations.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so irreversibility is partially covered; the description restates it but does add the non-obvious side effect that removing a follows/precedes relation reschedules the successor. That side effect is the strongest contribution. It says nothing about required permissions or what happens to the deleted relation's history.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, the irreversible consequence front-loaded and the rescheduling caveat second. Zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive two-parameter tool with full schema coverage, no output schema, and rich annotations, this is nearly sufficient: safety and side effects are covered. A mention of permission requirements or failure modes would complete it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the confirm parameter already documents the preview-then-approve flow thoroughly. The description adds nothing about relation_id sourcing (the schema points to list_relations/get_work_package_relations) or about the default confirm=false preview behavior. Baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (delete) and resource (relation between work packages), which distinguishes it from create_work_package_relation and update_relation by verb alone. It doesn't explicitly name those siblings, but the operation is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the destructive framing and the rescheduling note, which hints at when the consequence matters. However, nothing says when to prefer update_relation over delete, or what preconditions (permissions, relation state) apply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_reminderA
DestructiveIdempotent

Delete a pending reminder so it never fires; this cannot be undone.

Its unread notifications are marked read. Only its creator can; requires OpenProject 16.1+.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
reminder_idYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint and idempotentHint, yet the description adds real value beyond them: irreversibility, the non-obvious side effect that unread notifications are marked read, a creator-only authorization rule, and a minimum server version. That is exactly the kind of hidden behavior an agent needs before committing an irreversible write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and its irreversibility, then the secondary side effect and constraints. No filler; every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with no output schema, the description covers risk, side effects, permissions, and version compatibility, with annotations covering the safety profile. Only gap is how to source the reminder identifier and a nod to the preview-then-confirm workflow that the schema describes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: the confirm preview/approval parameter is well documented in the schema, but reminder_id has no schema description and the description adds nothing about it (e.g., obtain via list_reminders). Baseline 3 is appropriate since the trickier parameter is covered elsewhere, but the description does not compensate for the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (delete) plus resource (reminder) with a meaningful scope qualifier — 'pending' — and an explicit consequence ('so it never fires; this cannot be undone'). An agent can immediately distinguish this from update_reminder or create_work_package_reminder without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States two hard preconditions: only the creator may call it, and it requires OpenProject 16.1+, which lets an agent rule itself out. It doesn't explicitly say when to prefer this over update_reminder (e.g., to suppress rather than remove) or how to find a reminder_id, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_time_entryB
DestructiveIdempotent

Delete a time entry; this cannot be undone.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
time_entry_idYesTime entry id, from list_time_entries.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the 'cannot be undone' line mostly restates that. It adds no information about permissions, side effects on logged hours/reporting totals, or what the preview returns, which is where a destructive tool would benefit from extra context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler and the irreversibility warning up front. It is arguably too terse for a destructive operation, but nothing in it is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter destructive tool with complete annotations and full schema coverage, the essentials are covered by structured data. However, the description omits the critical operational point that confirm=false is the default and that a preview must be shown to the user before the destructive call, which is the main risk of misuse.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: time_entry_id's provenance (from list_time_entries) and the confirm preview/apply semantics are both fully documented in the schema. The description adds nothing 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (delete a time entry) so an agent can distinguish it from update_time_entry, get_time_entry, and list_time_entries. It doesn't explicitly name which sibling to prefer for non-destructive edits, but the action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus update_time_entry, and no mention of the two-step preview/confirm workflow that actually governs invocation. The schema documents the confirm parameter, but the description itself leaves usage entirely implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_versionA
DestructiveIdempotent

Delete a version; this cannot be undone.

Rejected while any work package, in any project, uses it (17.8+: also as its "found in" version).

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
version_idYesNumeric version id, as returned by list_versions.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known. The description adds valuable context beyond annotations by stating deletion cannot be undone and by documenting the dependency-based rejection behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no wasted text. The irreversible nature and the usage restriction are front-loaded, so an agent gets the critical information immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given rich annotations, full schema descriptions, and no output schema, the definition is nearly complete for a destructive tool. A minor gap is that it does not explicitly reinforce the preview-first confirm workflow, but the schema already documents that behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters are well documented in the schema, including the preview/confirm behavior. The description does not add parameter-level semantics beyond what the schema already provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Delete a version." It clearly distinguishes this from sibling operations such as create_version, update_version, and get_version without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit rejection condition: deletion is refused while any work package in any project uses the version, including as its "found in" version. That is useful when-not guidance, though it does not explicitly mention alternatives such as checking list_versions or get_version first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_work_packageA
DestructiveIdempotent

Delete a work package with its time and cost entries, relations, attachments and history.

This cannot be undone. Up to 17.6 all its descendants are deleted too; 17.7+ only those you may delete, the others lose their parent.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by enumerating exactly what is destroyed alongside the work package and by disclosing version-dependent behavior: pre-17.6 all descendants are deleted, while 17.7+ only deletable descendants go and the rest are re-parented. Combined with the explicit 'cannot be undone' warning, this is precisely the behavioral context an agent needs before a destructive call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the destructive scope first, then the irreversibility and version caveat. No filler, and the highest-stakes information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, no-output-schema tool, this covers cascade effects, irreversibility, and version-dependent descendant handling. It is slightly short on operational context such as required permissions or what the preview mode returns, but nothing essential to calling it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema itself is unusually rich (the confirm parameter explains preview-vs-apply and the approval step; work_package_id distinguishes numeric id from display id). The description adds nothing about parameters, so the baseline 3 is warranted — the schema, not the prose, does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Delete') plus resource ('work package') and immediately scopes the cascade (time and cost entries, relations, attachments, history). That makes it trivially distinguishable from siblings like delete_relation, delete_attachment, or 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implicitly frames usage by spelling out the consequences of deleting, but never says when to choose this over alternatives (e.g., detaching a relation via delete_relation, or closing instead of deleting). No explicit prerequisites, permission notes, or when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_queryA
Read-onlyIdempotent

Execute a saved OpenProject query by id and return its resolved work packages.

query_id: the query's own numeric id; obtain it from get_view/list_views's query_id field, or from list_boards/get_board (a board's id IS its underlying query id, since OpenProject Boards are Query resources).

Runs the query server-side (OpenProject resolves its stored filters/sort/ group_by and returns real work packages, not just the query's definition); no client-side filter translation happens here. Results are still filtered against this MCP's own OPENPROJECT_READ_PROJECTS allowlist before being returned, since the query itself executes with the API token's full server-side permissions.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
query_idYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as a read-only, idempotent, non-destructive operation. Beyond that, the description adds important behavior: the query is resolved server-side, no client-side filter translation occurs, and results are filtered against the MCP's OPENPROJECT_READ_PROJECTS allowlist even though the underlying API token has broader permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and then supplies only supporting details about sourcing query_id, server-side execution, and permission filtering. Every sentence contributes specific information without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries some burden for return behavior; it says resolved work packages are returned but does not describe the result shape. It does however explain the important filtering and permission behavior, which covers the tool's most consequential semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 67%, and query_id has no schema description. The description compensates well by explaining that query_id is the query's numeric id and can be sourced from get_view/list_views or from a board, where the board id is the underlying query id. Pagination parameters are already documented in the schema, so the added value is concentrated on the required parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: execute a saved OpenProject query by id and return resolved work packages. It also distinguishes itself from definition-returning siblings such as get_view/list_views by emphasizing that real work packages are returned server-side, not just the query definition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains how to obtain the required query_id from get_view/list_views or from boards, which gives strong usage context. It does not explicitly exclude alternatives like list_work_packages or search_work_packages, so it falls short of a full when-to-use/when-not-to-use comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_attachmentC
Read-onlyIdempotent

Get a single attachment by id.

NameRequiredDescriptionDefault
attachment_idYes

Output Schema

NameRequiredDescription
idYes
titleYes
authorYes
statusYes
file_nameYes
created_atYes
descriptionYes
container_idYes
content_typeYes
download_urlYes
container_typeYes
file_size_bytesYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered without the description. The description adds no behavioral context of its own — it does not clarify whether the result is metadata or binary content, which is the one ambiguity that matters here given the sibling get_attachment_content.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short, front-loaded sentence with zero waste. It is arguably under-specified rather than over-long, but as a sizing judgement the text is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

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, but the definition leaves the metadata-vs-content distinction with get_attachment_content entirely unresolved, which is the main invocation risk for this tool in this sibling set.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but there is only one parameter, an integer named attachment_id, whose meaning is self-evident. The description's 'by id' merely restates the schema and does not say where the id comes from (e.g., list_work_package_attachments), so it neither hurts nor compensates much.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope ('a single attachment by id'), so the agent knows it is a single-item retrieval rather than a list. However it does nothing to distinguish itself from the closely named sibling get_attachment_content, and an agent cannot tell from the text whether this returns metadata or the file itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus get_attachment_content or list_work_package_attachments, which are the obvious alternatives in the sibling set. The description offers no context, preconditions, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_attachment_contentA
Read-onlyIdempotent

Read an attachment's actual content, not just its metadata.

Returns a JSON block describing the outcome, followed by the content itself as a native block when it can be inlined:

  • PNG/JPEG/GIF/WebP come back as an image the model can see

  • text-like content (text/*, JSON, XML) comes back as text, cut at the byte limit if it is long (outcome "text", truncated=true)

  • an image over the byte limit is refused whole rather than returned partially (outcome "too_large")

  • anything else returns metadata only (outcome "not_inline_supported"); no bytes, since no MCP client could display them; content_type there is the attachment's stored type, which names the file where the served header only says "not inlineable"

max_bytes may only LOWER the server's configured limit (OPENPROJECT_ATTACHMENT_CONTENT_MAX_BYTES, 5 MB by default), never raise it.

size_bytes is the size of the returned content block, and is null if file_size_bytes is hidden by server configuration, rather than leaking it indirectly under another name.

Nothing is written to disk. Use get_attachment for metadata alone.

NameRequiredDescriptionDefault
max_bytesNo
attachment_idYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantive context beyond them: outcome values (text, too_large, not_inline_supported), the byte-limit refusal behavior, truncation flag, and the assurance that nothing is written to disk. This is a rich behavioral disclosure that a caller could not infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then well-organized bullets mapping each outcome. Most content earns its place, though the aside about content_type naming the file where the served header says 'not inlineable' is fairly deep detail that could be trimmed without losing caller-critical information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so explaining the return block shape, outcome enumerations, truncation, and refusal semantics is essential — and all are covered. A caller has everything needed to invoke it and interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: max_bytes is explained as a downward-only cap tied to the server-configured OPENPROJECT_ATTACHMENT_CONTENT_MAX_BYTES (5 MB default) with the rule that it never raises the limit. attachment_id is self-evident from the resource context. This meaningfully exceeds what the bare schema conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (read) and resource (attachment content) with the crucial qualifier 'not just its metadata,' which separates it from the sibling get_attachment at a glance. An agent can distinguish the two without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes metadata-only requests to get_attachment and explains the content-retrieval path in detail (inlined image vs text vs refused vs metadata-only). The alternatives and conditions are named, not implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_backlog_bucketB
Read-onlyIdempotent

Get a Backlogs backlog bucket by id. Requires OpenProject 17.6 or newer.

NameRequiredDescriptionDefault
backlog_bucket_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
created_atYes
updated_atYes
defining_workspaceYes
defining_workspace_idYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already fully declare the safe read-only, idempotent, non-destructive behavior. The description adds meaningful context by stating the OpenProject 17.6+ version requirement, which is not captured in annotations, but it does not describe error behavior or response characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the core action front-loaded and the version constraint clearly separated. Every sentence carries useful information, with no redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not explain return values, and the simple one-parameter read shape is adequately framed. The main remaining gap is not linking this tool to list_backlog_buckets or explaining where to source the id.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but 'by id' only restates the parameter name and does not explain format, range, or where to obtain a backlog bucket id. The schema supplies the integer type and required constraint but nothing further.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb-resource pair: get a Backlogs backlog bucket by id. This distinguishes it from list_backlog_buckets, which is a collection-level sibling, though it does not explicitly name or contrast with that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states no when-to-use guidance or alternatives. It only adds a version prerequisite, leaving the agent to infer that this is for retrieving a single bucket when its id is known rather than listing buckets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_boardC
Read-onlyIdempotent

Get a saved OpenProject board/query by id.

NameRequiredDescriptionDefault
board_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
hiddenYes
publicYes
columnsYes
filtersYes
projectYes
sort_byYes
starredYes
group_byYes
can_deleteYes
can_updateYes
created_atYes
project_idYes
timestampsYes
updated_atYes
show_hierarchiesYes
timeline_visibleYes
highlighting_modeYes
include_subprojectsYes
timeline_zoom_levelYes
highlighted_attributesYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds only that the object is 'saved' and looked up by id; it says nothing about not-found behavior, permission requirements, or whether the returned object includes work packages or query state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with no filler, and the retrieval key is front-loaded. It is efficient, though the brevity contributes to the missing sibling differentiation and parameter detail rather than reflecting a deliberate minimal specification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not required, and the annotations cover safety and world assumptions. However, with a schema that gives no parameter description and multiple overlapping siblings, the definition is only minimally sufficient to call the tool correctly and does not resolve the board vs. query vs. grid ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single required parameter board_id, so the description must carry the burden. It only says 'by id', without explaining the id format, where to obtain it (e.g., list_boards), or whether it accepts query or board identifiers. That is closer to restating the parameter name than adding meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('Get') and resource ('saved OpenProject board/query') plus the lookup key ('by id'), so an agent can tell this is a single-item fetch rather than a list. It does not distinguish the tool from near-siblings like get_grid, get_view, or execute_query, and 'board/query' blurs whether this returns a board or a query object.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus list_boards, list_grids, get_view, or execute_query, nor any prerequisite about where a board_id comes from. The phrase 'saved ... by id' implies a retrieval scenario but gives no explicit conditions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_categoryA
Read-onlyIdempotent

Get a single category by id.

project is optional: when given, it's cross-checked against the category's real project and a mismatch raises a not-found error, rather than being the sole source of authorization.

NameRequiredDescriptionDefault
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.
category_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
projectYes
project_idYes
default_assigneeNo
default_assignee_idNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral information: the optional project is validated against the category's real project and a mismatch yields a not-found error rather than acting as an authorization scope. That is non-obvious error semantics an agent cannot get from the 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action, followed by the one subtle parameter rule. No filler or repetition of schema/annotation content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present there is no need to describe return values, and annotations cover the read-only/idempotent profile. The description covers the one genuinely tricky element (project validation). Minor gap: it doesn't state what happens for a nonexistent category_id or a permission failure, but the essential call-shaping information is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% — project has a description, category_id does not. The description compensates by explaining the exact semantics of the under-documented project parameter: it is a cross-check, not an authorization source, and mismatches surface as not-found. This is meaning beyond the schema's 'id, or name' note.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get a single category by id.' The word 'single' implicitly distinguishes it from list_categories, but the sibling is never named, so the differentiation is inferential rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by 'single category by id' — an agent can infer this is a fetch-one-vs-list-many tool, but the description never says when to prefer it over list_categories or what happens when the id doesn't exist (aside from the project-mismatch case).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cost_entryB
Read-onlyIdempotent

Get a single cost entry by id.

Cost entries are entirely read-only in OpenProject's API (Community Edition) -- there is no create/update/delete endpoint for this resource.

NameRequiredDescriptionDefault
cost_entry_idYes

Output Schema

NameRequiredDescription
idYes
userYes
projectYes
spent_onYes
cost_typeYes
entity_idYes
created_atYes
updated_atYes
entity_nameYes
spent_unitsYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description's only addition is that the resource has no create/update/delete endpoint in Community Edition, which usefully stops an agent hunting for a write tool but is largely a restatement of the read-only hint. Nothing is said about error behavior for a missing id or about pagination/scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the core operation front-loaded, and no filler. The second sentence is mildly tangential to invocation but is short and adds context, so it earns most of its space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values needn't be described, and the annotations cover safety and idempotency. For a single-parameter lookup the description is close to sufficient; the only real gap is how to obtain a valid cost_entry_id and its relationship to list_work_package_cost_entries.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single required parameter, so the description must carry the burden; it only says "by id," which is a restatement of the parameter name cost_entry_id. It adds no format, range, or sourcing guidance (e.g., where to obtain a valid id).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Get a single cost entry by id" states a specific verb and resource, and the word "single" implicitly contrasts with the list variants among the siblings (list_work_package_cost_entries, get_work_package_costs_by_type). It never names an alternative explicitly, so sibling differentiation is implied rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the lookup use case (fetch one entry when you already have an id) but gives no explicit when-to-use guidance and does not tell the agent to prefer a list endpoint when the id is unknown. There are no stated prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cost_typeA
Read-onlyIdempotent

Get a cost type by id.

Cost types are entirely read-only in OpenProject's API (Community Edition) -- there is no create/update/delete endpoint, and no collection GET either (no list_cost_types tool exists because the endpoint does not exist upstream).

NameRequiredDescriptionDefault
cost_type_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
unitYes
is_defaultYes
unit_pluralYes

TDQS

A4.1/5.0
Behavior4/5

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 context: the entire cost-type resource is immutable in the upstream API, not just this call, and there is no collection endpoint. That scope information is not derivable from 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first sentence, and the second paragraph is short and purposeful, preempting a likely wrong instinct (searching for a list tool). The parenthetical "(no list_cost_types tool exists because the endpoint does not exist upstream)" is slightly redundant but earns its place as a guardrail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 no explanation, and annotations cover the safety profile; the description fills the remaining conceptual gap about the resource's immutability. Only the provenance of cost_type_id is unaddressed, a minor omission for a one-parameter lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for the single cost_type_id parameter, and the description adds only "by id" — no format, range, or where to source a valid ID. With one required parameter, the description should compensate more than a bare restatement of the name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Get a cost type by id") and goes further by explaining why apparent siblings are absent: cost types are read-only with no collection GET, so no list_cost_types exists. An agent can immediately tell this is a single-resource lookup, not a list or mutation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly rules out create/update/delete and list variants, preventing the agent from hunting for nonexistent endpoints or attempting writes. It stops short of saying where a valid cost_type_id comes from (e.g. via get_work_package_costs_by_type), which would complete the routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_current_userA
Read-onlyIdempotent

Return the currently authenticated user's profile.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idYes
nameYes
loginYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds that the subject is the *authenticated* user, implying an auth/session requirement. It does not cover rate limits or whether the profile shape varies by account type, so it adds modest value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource, with zero filler. Nothing is wasted and nothing important is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero parameters, a full output schema, and rich annotations, the description needs only to establish what the tool returns and about whom. It does that; only a note on the authentication prerequisite or behavior when unauthenticated would improve it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description correctly implies the target user is derived from the session rather than from a supplied identifier, which is the only parameter-relevant fact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: return the currently authenticated user's profile. This is unambiguous and distinct from the many project/work-package getters in the sibling list, though it does not explicitly name what separates it from adjacent 'my' tools like get_my_project_access.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance is given; the usage is only implied by the phrasing 'currently authenticated user'. An agent can infer this is the identity/self-profile call, but the description does not route it against alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_documentA
Read-onlyIdempotent

Get a single document by id.

The description is returned in full by default (single documents are not truncated). Pass text_limit to cap it at that many characters; when the text is cut, description_truncated is true and description_length reports the real length.

NameRequiredDescriptionDefault
text_limitNo
document_idYes

Output Schema

NameRequiredDescription
idYes
titleYes
projectYes
can_updateYes
created_atYes
project_idYes
descriptionYes
attachment_countYes
description_lengthNo
description_truncatedNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful behavioral detail: documents are returned in full by default, text_limit can truncate them, and truncation is signaled by description_truncated and description_length.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and then explains the only non-obvious option. The sentences are compact and each carries relevant information without padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with rich annotations and an output schema, the description is largely complete, especially around truncation behavior. The remaining gap is that it does not clarify document_id provenance or differentiate this tool from sibling retrieval tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains text_limit and its side effects well, but document_id is only implicitly defined as the id used to retrieve the document, with no format or source details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Get a single document by id." It is clear what the tool retrieves, but it does not distinguish itself from nearby retrieval tools such as list_documents or get_wiki_page.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The by-id retrieval scenario is implied clearly, but the description does not explicitly say when to use this instead of list_documents or other get_* siblings. No prerequisites or exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_github_pull_requestA
Read-onlyIdempotent

Get a single GitHub pull request by its own id.

GitHub pull requests are read-only mirror rows synced by OpenProject's own GitHub App integration -- never creatable via this API. An empty or 404 result can mean either the pull request doesn't exist, or the GitHub App integration isn't configured on this instance; OpenProject's API does not distinguish these cases.

Unlike work-package-scoped lookups in this domain, this global lookup relies on OpenProject's own visibility check (whether the linked work package is visible to the API token), not on this MCP's OPENPROJECT_READ_PROJECTS allowlist -- the pull request payload carries no project link for this MCP to check against.

NameRequiredDescriptionDefault
github_pull_request_idYes

Output Schema

NameRequiredDescription
idYes
bodyYes
draftYes
stateYes
titleYes
authorYes
labelsYes
mergedYes
numberYes
html_urlYes
merged_atYes
merged_byYes
created_atYes
repositoryYes
updated_atYes
body_lengthYes
body_truncatedYes
comments_countYes
additions_countYes
deletions_countYes
github_updated_atYes
changed_files_countYes
repository_html_urlYes
review_comments_countYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the bar is low, yet the description adds substantial context the annotations can't: mirror rows are synced read-only and never creatable, an empty or 404 result conflates 'not found' with 'GitHub App not configured', and visibility is governed by OpenProject's own check rather than the MCP OPENPROJECT_READ_PROJECTS allowlist. That last point is exactly the kind of behavioral surprise an agent must know to interpret empty results and access patterns correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then justification paragraphs that each add distinct value (read-only mirror, 404 ambiguity, visibility semantics). Dense but no filler sentence; slightly long for a one-parameter getter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need no explanation, and the description still covers the non-obvious failure modes and access model. For a single-param read tool, nothing an agent needs in order to call or interpret it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for the single required integer, so the description carries the burden. 'By its own id' hints that this is the mirror row's id rather than GitHub's PR number, which is genuinely useful, but it never states the type or definitively disambiguates OpenProject id vs. GitHub PR number, leaving the one parameter partially specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (get a single GitHub pull request) scoped by its own id, and implicitly separates itself from the sibling list_work_package_github_pull_requests by calling itself a 'global lookup' versus 'work-package-scoped lookups'. An agent can tell exactly what this returns 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly contrasts the global lookup against work-package-scoped lookups in the same domain, which routes the agent away from the list/related siblings when it lacks a work package context. It does not spell out a positive 'use this when you have an id' rule, but the contrast is clear enough to select correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_gridC
Read-onlyIdempotent

Get a single dashboard grid by id.

NameRequiredDescriptionDefault
grid_idYes

Output Schema

NameRequiredDescription
idYes
scopeYes
row_countYes
created_atYes
updated_atYes
column_countYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description adds no behavioral context beyond that—no return format, pagination, or dashboard/grid scoping details—so it contributes nothing extra.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single sentence is front-loaded with the verb and resource and contains no filler. It is appropriately terse, though its brevity is also the source of the definition's gaps.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 annotations cover safety. However, for a getter the description still says nothing about what a dashboard grid is, whether access is project-scoped, or where a valid grid_id comes from, leaving a modest gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single property is merely named grid_id. The phrase 'by id' slightly reinforces that grid_id is an identifier, but it gives no format, example, or indication of where to obtain a grid id, so it fails to compensate for the missing schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get') and resource ('dashboard grid') and scopes it to a single item ('single ... by id'), which implicitly distinguishes it from the sibling list_grids and from create/update/delete_grid. It stops short of naming the alternative explicitly, so it is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus list_grids or other grid tools, nor any prerequisite such as needing an id from list_grids first. The only hint is the phrase 'by id', which leaves the agent to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_instance_configurationA
Read-onlyIdempotent

Return instance-level OpenProject configuration and active feature flags.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
host_nameYes
hours_per_dayYes
days_per_monthYes
duration_formatYes
per_page_optionsYes
available_featuresYes
trialling_featuresYes
active_feature_flagsYes
maximum_api_v3_page_sizeYes
maximum_attachment_file_size_bytesYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint. The description adds that the response includes active feature flags, which is minor content disclosure; it says nothing about permissions needed, caching, or scope of exposure for an openWorld read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the resource and scope appear before the payload detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero parameters, an existing output schema, and annotations covering the safety profile, the description is sufficient to call the tool correctly. A note on what 'instance configuration' encompasses would make it fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and no schema gap to compensate for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Return instance-level OpenProject configuration") plus the payload (feature flags). The qualifier "instance-level" effectively separates it from the sibling get_project_configuration, though the sibling is never named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance; the contrast with project-scoped configuration must be inferred from the word "instance-level". Adequate for a zero-argument read, but nothing tells the agent when to prefer it over get_project_configuration or get_current_user.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_statusB
Read-onlyIdempotent

Get the current status of a background job such as project copy.

NameRequiredDescriptionDefault
job_status_idYes

Output Schema

NameRequiredDescription
idYes
typeYes
statusYes
messageYes
projectYes
project_idYes
created_resource_idYes
created_resource_nameYes
created_resource_typeYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile of checking status is covered. The description adds only the background-job framing; it does not disclose the status lifecycle (terminal vs. in-progress states), whether expired job ids error out, or any timeout/retention behavior — meaningful gaps for a polling tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with no filler and the resource front-loaded. It is appropriately sized, though the brevity comes at the cost of the missing polling and id-provenance guidance rather than because the tool is simple.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 read-only annotations cover safety. However, for an async-status tool the crucial missing piece is how the agent obtains job_status_id and how to interpret/poll for completion, leaving the definition incomplete for correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description says nothing about job_status_id — where it comes from (presumably returned by an async operation like copy_project), its format, or what happens with an invalid/expired id. The single required parameter is left entirely unexplained by both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the current status of a background job') and adds a concrete example ('such as project copy') that anchors the concept. It does not need to distinguish itself from siblings because none of them cover job status, though it also does not name which tools produce such jobs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to call this tool versus alternatives, how often to poll, or when to stop polling. The only implicit cue is the 'background job such as project copy' example, which hints it follows an async operation like copy_project but never states that relationship.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_meetingA
Read-onlyIdempotent

Get a single OpenProject meeting by id: schedule, state, participants and its lock_version.

Requires OpenProject 17.4+. Its agenda comes from list_meeting_sections and list_meeting_agenda_items.

NameRequiredDescriptionDefault
meeting_idYesMeeting id, from list_meetings.

Output Schema

NameRequiredDescription
idYes
stateYes
titleYes
authorYes
notifyYes
projectYes
sharingYes
durationYes
end_timeYes
locationYes
templateYes
created_atYes
project_idYes
start_timeYes
updated_atYes
lock_versionYes
participantsYes
recurring_meeting_idYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description focuses on adding constraints: a hard server-version requirement and the fact that agenda data is deliberately omitted from this response. It stops short of explaining why lock_version is surfaced (presumably for optimistic concurrency on updates).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs, zero filler, with the core behavior front-loaded and the prerequisite/related-tool notes placed after it. Every sentence conveys distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 no prose explanation, and the description correctly covers prerequisites and where related data lives. Minor gap: it doesn't clarify what lock_version is for or what an agent should expect when the meeting id is stale or missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single meeting_id parameter is documented as coming 'from list_meetings', so the schema already carries the semantics. The description adds only the implicit id-based lookup framing, nothing about format or invalid-id handling.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a single OpenProject meeting by id') and enumerates the returned aspects: schedule, state, participants, lock_version. The word 'single' plus the referenced siblings make it distinguishable from list_meetings 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes agenda retrieval elsewhere ('Its agenda comes from list_meeting_sections and list_meeting_agenda_items'), which is a real alternative-selection cue. It also states the version prerequisite (OpenProject 17.4+), though it does not spell out when-not-to-use or how it behaves for a nonexistent id.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_meeting_agenda_itemA
Read-onlyIdempotent

Get a single meeting agenda item by id.

Requires OpenProject 17.6+.

NameRequiredDescriptionDefault
agenda_item_idYesAgenda item id, from list_meeting_agenda_items.

Output Schema

NameRequiredDescription
idYes
notesYes
titleYes
authorYes
positionYes
item_typeYes
presenterYes
created_atYes
meeting_idYes
updated_atYes
outcome_idsYes
lock_versionYes
notes_lengthYes
notes_truncatedYes
work_package_idYes
meeting_section_idYes
duration_in_minutesYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds a genuine environmental prerequisite, OpenProject 17.6+, which an agent cannot learn from annotations or schema and which determines whether the call is even available.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler; the core action is front-loaded and the version caveat is a separate line where it belongs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations are rich, so return-value explanation is unnecessary; the version prerequisite is the one extra fact an agent needs. It could still note behavior when the id does not exist or belongs to another project, but nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter is already documented with its provenance (from list_meeting_agenda_items). The description adds no extra semantics about the id format or scope, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Get a single meeting agenda item by id"), so the agent knows exactly what it retrieves and that it is the singular counterpart to list_meeting_agenda_items. It stops short of naming that sibling explicitly, so differentiation is inferred from the name rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: retrieve one item when you have an id. The useful routing hint ("from list_meeting_agenda_items") lives in the schema parameter description, not the tool description. No when-not-to-use guidance or mention of alternatives is given in the description itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_meeting_outcomeB
Read-onlyIdempotent

Get a single meeting outcome by id.

Requires OpenProject 17.6+.

NameRequiredDescriptionDefault
outcome_idYes

Output Schema

NameRequiredDescription
idYes
kindYes
notesYes
authorYes
created_atYes
updated_atYes
notes_lengthYes
notes_truncatedYes
work_package_idYes
meeting_agenda_item_idYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world behavior, so the safety profile needs no restating. The description does add one piece of context beyond annotations — the OpenProject 17.6+ version requirement — but says nothing about permissions or error behavior for a missing id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and resource; the version constraint follows as a caveat. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 annotations cover the safety profile. For a one-parameter read tool the definition is nearly sufficient; only the source of the id and any permission/visibility caveats are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden for the single parameter. 'by id' only weakly identifies outcome_id, and it gives no hint about where to obtain the id (e.g., from list_meeting_outcomes) or its format. Minimal compensation for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('meeting outcome') scoped to a single record by id. The word 'single' implicitly contrasts with list_meeting_outcomes, but no sibling is named, so distinction relies on inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Only implicit guidance: use this when you have an id. No mention of when to prefer list_meeting_outcomes (e.g., when the id is unknown), no prerequisites beyond the version note.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_meeting_sectionA
Read-onlyIdempotent

Get a single meeting section by id: title, position and whether it is the backlog.

Requires OpenProject 17.6+. Its agenda items come from list_meeting_agenda_items.

NameRequiredDescriptionDefault
section_idYesMeeting section id, from list_meeting_sections.

Output Schema

NameRequiredDescription
idYes
titleYes
backlogYes
positionYes
created_atYes
meeting_idYes
updated_atYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context: the OpenProject 17.6+ version prerequisite and the downstream relationship to agenda items, 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and return fields, followed by the version prerequisite. No filler or redundant restatement of the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with an output schema, the description covers purpose, id provenance, version requirement and follow-up tool. Minor gap: no explicit contrast with the other meeting-level getters in the sibling list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter is documented as 'Meeting section id, from list_meeting_sections.' The description only echoes 'by id' and adds no format, source or constraint detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb and resource ('Get a single meeting section by id') plus the exact fields returned (title, position, backlog flag). The word 'single' implicitly distinguishes it from the sibling list_meeting_sections, though that sibling is not named directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear retrieval context: the id comes from list_meeting_sections, and the section's agenda items are fetched via list_meeting_agenda_items. This routes the agent through the right workflow, though it does not state when to prefer get_meeting_section over get_meeting or get_meeting_agenda_item.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_membershipA
Read-onlyIdempotent

Get one project membership by id: the user or group, the project and the role names.

To list a project's members use list_project_memberships.

NameRequiredDescriptionDefault
membership_idYesMembership id, from list_project_memberships.

Output Schema

NameRequiredDescription
idYes
role_idsYes
can_updateYes
created_atNo
project_idYes
role_namesYes
updated_atNo
principal_idYes
project_nameYes
principal_nameYes
can_update_immediatelyYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world behavior, so the safety profile is covered. The description adds little beyond the annotation layer: it mentions returned entities but does not discuss permissions, errors, or rate limits, and return detail is also largely covered 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action, and the second sentence is a useful routing hint rather than filler. No redundant restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-by-id tool with an output schema, complete annotations, and a fully documented single parameter, the description gives enough selection and invocation context. Missing error semantics are not critical here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the sole membership_id parameter is already documented as coming from list_project_memberships. The description does not add format, range, or lookup semantics beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (one project membership) by id, and enumerates the returned components (user/group, project, role names). It explicitly distinguishes itself from the sibling list_project_memberships, so an agent can choose between single-item retrieval and listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description names the alternative list_project_memberships and the condition that selects it (listing a project's members). It implies this tool is for fetching one known membership id, though it does not spell out when error or invalid-id cases should be handled.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_my_project_accessB
Read-onlyIdempotent

Return the current user's membership and inferred access hints for a project.

NameRequiredDescriptionDefault
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.

Output Schema

NameRequiredDescription
membershipYes
project_idYes
project_nameYes
current_user_idYes
inference_basisYes
current_user_nameYes
project_identifierYes
inferred_can_edit_projectYes
inferred_is_project_adminYes
inferred_can_manage_membershipsYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the full safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description adds one genuinely useful trait — that the result contains *inferred* access hints rather than raw membership rows — but says nothing about what that inference means or how reliable it is.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with no filler. It is arguably too lean for a tool with this many sibling alternatives, but nothing is padded or redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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. However, with 130+ siblings and a non-obvious "inferred" concept, one clause on when to prefer this over the membership and admin-context tools would make it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single `project` property already documents that id, name, or a unique name/identifier fragment all match. The description adds nothing about the parameter, which is acceptable given the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: returns the current user's membership plus inferred access hints for a project. The "my" scoping clearly separates it from get_project and get_project_admin_context, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance and no named alternatives in a sibling list that contains obvious candidates (get_membership, list_project_memberships, get_project_admin_context). The agent must infer that this is the self-scoped access check.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_newsA
Read-onlyIdempotent

Get a single news entry by id.

The description is returned in full by default (single news entries are not truncated). Pass text_limit to cap it at that many characters; when the text is cut, description_truncated is true and description_length reports the real length.

NameRequiredDescriptionDefault
news_idYes
text_limitNo

Output Schema

NameRequiredDescription
idYes
titleYes
authorYes
projectYes
summaryYes
can_deleteYes
can_updateYes
created_atYes
project_idYes
descriptionYes
description_lengthNo
description_truncatedNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as a safe, idempotent read operation. The description adds useful behavioral context about truncation: full text is returned by default, text_limit caps it, and the description_truncated and description_length fields indicate when and how much it was cut.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences, front-loads the core purpose, and then explains the only non-obvious parameter behavior. No sentence is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and read-only annotations already covering safety semantics, the description supplies exactly the missing context an agent needs: single-entry retrieval and truncation behavior. Nothing critical for correct invocation is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It clearly explains the meaning and effects of text_limit, including truncation behavior, while news_id is self-evident as an integer identifier and reasonably left implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get a single news entry by id.' The word 'single' clearly distinguishes it from list_news, create_news, update_news, and delete_news without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the tool name and the 'by id' phrasing, but the description does not explicitly say when to use this tool versus list_news or other retrieval routes. It also does not mention prerequisites, error behavior, or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_postA
Read-onlyIdempotent

Get a single forum post by id.

OpenProject's API exposes exactly one route for posts: GET /api/v3/posts/{id}. There is no collection/list endpoint for posts or forums at all in OpenProject's REST API -- a post's id must therefore come from elsewhere (e.g. a work package's activity/journal referencing a forum post, or a link copied from the OpenProject web UI). This MCP does not and cannot provide a list_posts or list_forums tool.

NameRequiredDescriptionDefault
post_idYes

Output Schema

NameRequiredDescription
idYes
projectYes
subjectYes
project_idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is known. The description adds genuinely non-structured context: there is exactly one route (GET /api/v3/posts/{id}) and no discovery mechanism, which shapes how an agent must plan around the tool. It stops short of describing response shape or error behavior for a missing id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action in the first sentence, then justification for why the id must be supplied externally. The API-route detail is slightly verbose but earns its place by explaining the absence of a list tool. No filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with annotations and an output schema, the description supplies the missing piece an agent would otherwise flounder on: id provenance and the absence of any discovery path. It doesn't mention permissions or what a post object contains, but those are lower priority given the existing structured data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the burden, and it does: it explains that post_id cannot be obtained from any listing endpoint and must be sourced from a work package journal, forum reference, or a copied UI link. That is the key semantic an agent needs. It does not clarify type/format detail (integer id) beyond the schema, hence not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a single forum post by id') and explicitly disambiguates from what agents would expect by noting there is no collection/list endpoint for posts or forums. An agent immediately knows this is a single-object fetch, not a listing tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Directly addresses the natural alternative ('list_posts or list_forums') and states it cannot exist, then tells the agent where ids come from: work package activity/journal references or a web UI link. Strong, but it doesn't spell out any usage exclusions or permission prerequisites for calling it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_priorityB
Read-onlyIdempotent

Get a single work package priority by id.

NameRequiredDescriptionDefault
priority_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
colorYes
positionYes
is_activeYes
is_defaultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and non-destructive, so the safety profile is fully covered. The description's only additional signal is that it returns one record rather than a collection; nothing on missing-id behavior or lookup scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence, front-loaded with the verb and resource, with no filler. Brevity is appropriate here, though it leaves room to add a routing clause without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 no explanation, and annotations cover safety. Still, for a lookup tool in a large sibling set, the definition omits the one thing an agent needs: how it relates to list_priorities and what a 'priority' is in this domain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but with a single required 'priority_id' integer the description's 'by id' at least confirms the parameter is the priority identifier and not a work package id. It doesn't clarify format or where the id comes from, so it doesn't fully compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a single work package priority'), clearly narrower than list_priorities in the sibling set. It doesn't name that sibling explicitly, so the differentiation is implied by 'single...by id' rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance: it never says to use this when you already have a priority id and to use list_priorities when you need to discover one. An agent must infer the retrieval-vs-enumeration split from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_projectA
Read-onlyIdempotent

Get a project by id, identifier or name, including its ancestor chain.

description/status_explanation are returned in full by default (single projects are not truncated). Pass text_limit to cap them at that many characters; when cut, description_truncated/status_explanation_truncated are true and description_length/status_explanation_length report the real length.

NameRequiredDescriptionDefault
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.
text_limitNo

Output Schema

NameRequiredDescription
idYes
nameYes
activeYes
publicNo
statusNo
ancestorsNo
favoritedNo
parent_idNo
can_deleteNo
can_updateNo
created_atNo
identifierYes
updated_atNo
descriptionYes
parent_nameNo
description_lengthNo
status_explanationNo
ancestors_truncatedNo
description_truncatedNo
status_explanation_lengthNo
status_explanation_truncatedNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (which already declare a safe, idempotent read), the description discloses return behavior precisely: description/status_explanation come back in full by default, text_limit truncates them, and it names the exact truncation/length flags emitted when cut. This is high-value behavioral context not present in 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then a second paragraph dedicated to truncation behavior. The second paragraph is dense but each sentence carries actionable information; only minor tightening would improve it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 needn't enumerate returns, and annotations already cover the safety profile. The description fills the remaining gaps (truncation defaults and flags) so an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: the `project` param is documented in-schema, but `text_limit` has no schema description. The description compensates by fully explaining text_limit's semantics (character cap, resulting truncation flags, real-length fields), adding meaning beyond the bare integer schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Get a project") and adds the qualifying scope "including its ancestor chain," which distinguishes it from list_projects and the various get_project_* context tools. An agent can tell what it retrieves 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by explaining accepted identifier forms (id, identifier, name) but never states when to prefer this over siblings like get_project_admin_context, get_project_configuration, or get_project_work_package_context. Usage is inferred rather than guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_admin_contextC
Read-onlyIdempotent

Return project admin metadata such as lifecycle statuses, parent options, and writable fields.

NameRequiredDescriptionDefault
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.

Output Schema

NameRequiredDescription
fieldsYes
projectYes
available_statusesYes
available_parent_projectsYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds that the return contains lifecycle statuses, parent options, and writable fields, which is useful context. It does not mention permission requirements or the scope of the metadata (project-wide vs user-specific), and the output schema carries the rest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. Slight imprecision from the open-ended "such as" hedge, but nothing wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations and an output schema present, the description need not explain return values. However, for a helper tool in a dense sibling set, it does not say how it relates to update_project or get_project_configuration, which is the main missing context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single `project` parameter is documented in the schema, including the partial-name-match behavior. The description adds nothing about how the project identifier interacts with the returned metadata, 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.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb-plus-resource ("Return project admin metadata") is present, and examples (lifecycle statuses, parent options, writable fields) narrow it down. But "admin metadata" is fuzzy, and the description never distinguishes the tool from close siblings like get_project, get_project_configuration, or get_project_work_package_context, which plausibly overlap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to choose this over get_project_configuration or update_project, no mention that it is typically called before a project update to discover writable fields, and no exclusions. The agent must infer the use case from the field examples alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_configurationA
Read-onlyIdempotent

Return a project's configuration: get_instance_configuration's fields plus enabled_internal_comments.

NameRequiredDescriptionDefault
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.

Output Schema

NameRequiredDescription
project_idYes
project_nameYes
hours_per_dayYes
days_per_monthYes
duration_formatYes
per_page_optionsYes
available_featuresYes
trialling_featuresYes
active_feature_flagsYes
maximum_api_v3_page_sizeYes
enabled_internal_commentsYes
maximum_attachment_file_size_bytesYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive behavior, and open-world access. The description adds only the return-field composition, without extra details on permissions, failure modes, or other behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one compact, front-loaded sentence with no wasted wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a full parameter schema, an output schema, and rich annotations, the description supplies the key relationship to get_instance_configuration. The remaining gap is the lack of explicit usage guidance versus nearby project metadata tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single project parameter is documented as accepting id, name, or partial match. The description adds no additional parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: returns a project's configuration. It also distinguishes the tool from get_instance_configuration by stating it includes those fields plus enabled_internal_comments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The relationship to get_instance_configuration implies when this tool is useful, but it does not explicitly say when to choose this over get_project, get_project_admin_context, or get_instance_configuration itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_phaseC
Read-onlyIdempotent

Get a single project lifecycle phase by id.

NameRequiredDescriptionDefault
phase_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
projectYes
created_atYes
project_idYes
start_dateYes
updated_atYes
finish_dateYes
phase_definitionYes
phase_definition_idYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is fully covered by structured data. The description adds nothing behavioral beyond that — no note on whether a missing phase errors or returns empty, nor anything about lookup scope. Given rich annotations, this is thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the resource and lookup key front-loaded and zero filler. It is efficient, though its brevity contributes to the missing guidance noted elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations cover the safety profile, so return values needn't be explained. However, for a lookup tool sitting among several similarly named phase siblings, the absence of disambiguation and ID-provenance detail leaves the definition only minimally adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden for phase_id, yet it only says "by id," which essentially restates the parameter name. It does not clarify the ID's origin (e.g., from a work package's phase reference or from list_project_phase_definitions).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ("Get a single project lifecycle phase") and makes the single-item scope explicit. It does not, however, distinguish this from the closely named sibling get_project_phase_definition, so an agent must infer the instance-vs-definition split 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.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus list_project_phase_definitions, get_project_phase_definition, or get_project. No prerequisites or exclusions are stated, so the agent gets no routing help beyond the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_phase_definitionB
Read-onlyIdempotent

Get a single project lifecycle phase definition by id.

NameRequiredDescriptionDefault
phase_definition_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
created_atYes
start_gateYes
updated_atYes
finish_gateYes

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive and open-world, yet the description restates nothing beyond 'get a single ... by id' — no note that the id must come from a listing call, no error behavior when the id is unknown. With annotations carrying the safety profile, the description still adds essentially no behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource, no filler. It is efficient but arguably too terse given the documentation gaps elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A simple getter with an output schema and thorough annotations, so the essentials are covered. The main missing piece is where the phase_definition_id comes from and what distinguishes a phase definition from a project phase.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the sole parameter, so the description is the only source of meaning; all it offers is 'by id', without saying what identifies a phase definition or that ids come from list_project_phase_definitions. That is thinner than the documentation burden requires.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a single project lifecycle phase definition') and the 'single ... by id' framing distinguishes it from the sibling list_project_phase_definitions. It does not, however, differentiate itself from get_project_phase, which an agent could easily confuse with it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by contrast with the 'list_' sibling; there is no explicit statement of when to prefer this over get_project_phase or how to obtain a valid id. No exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_storageB
Read-onlyIdempotent

Get a single project's link to a configured external file storage by id.

NameRequiredDescriptionDefault
project_storage_idYes

Output Schema

NameRequiredDescription
idYes
creatorYes
projectYes
created_atYes
creator_idYes
project_idYes
storage_idYes
updated_atYes
storage_nameYes
project_folder_modeYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds that the resource is a configured external file storage link, but says nothing about permissions, scoping, or lookup failure behavior beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. Slightly terse given it could carry more routing information at no real cost.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 it's a simple single-get tool. Still, it omits where the id comes from (list_project_storages) and what a project-scoped vs. instance-scoped storage means, which is the main ambiguity for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description ideally should compensate, but it only restates 'by id'. The parameter name project_storage_id is self-explanatory and the description confirms the id refers to a storage link, not a project, which prevents confusion with get_project.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: retrieves one project's file-storage link by id. It is distinguishable from the sibling list_project_storages (plural) by the word 'single', though it never names that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by 'by id' — the agent must infer that it needs an id, presumably from list_project_storages. No explicit when-to-use/when-not or alternative is stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_work_package_contextB
Read-onlyIdempotent

Return project metadata and, optionally, the writable work-package schema for a given type.

NameRequiredDescriptionDefault
typeNo
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.

Output Schema

NameRequiredDescription
fieldsYes
project_idYes
project_nameYes
custom_fieldsYes
available_typesYes
selected_type_idYes
available_statusesYes
available_versionsYes
project_identifierYes
selected_type_nameYes
available_categoriesYes
available_prioritiesYes
available_project_phasesYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already establish that this is a read-only, idempotent, non-destructive operation, and the description adds useful context by noting that the optional schema is 'writable'. It does not provide deeper behavioral details such as permission requirements or how project metadata is scoped.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no redundant or filler language. Every phrase contributes to explaining the tool's purpose and optional behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existing output schema and annotations, the description is nearly complete for a read-only context-fetch tool. However, the ambiguity around the optional 'type' parameter is a meaningful gap for an agent that needs to request the writable schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The required 'project' parameter is documented in the schema, but the optional 'type' parameter has no schema description. The description clarifies that 'type' is optional and relates to the writable work-package schema, but it does not explain what kind of value 'type' accepts (e.g., type id or name), leaving a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Return') and specific resources ('project metadata' and 'writable work-package schema'), which clearly identifies the tool's function. It does not explicitly contrast itself with overlapping siblings such as get_project or get_type, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The word 'optionally' implies that including a type returns the writable schema, but there is no explicit when-to-use guidance versus alternatives like get_project, get_type, or list_types. Usage is inferable from the purpose but not directly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recurring_meetingA
Read-onlyIdempotent

Get a single OpenProject recurring meeting series by id.

Requires OpenProject 17.4+.

NameRequiredDescriptionDefault
recurring_meeting_idYesRecurring meeting series id, from list_recurring_meetings.

Output Schema

NameRequiredDescription
idYes
titleYes
authorYes
notifyYes
projectYes
durationYes
end_dateYes
intervalYes
locationYes
end_afterYes
frequencyYes
time_zoneYes
created_atYes
iterationsYes
project_idYes
start_timeYes
updated_atYes
monthly_dayYes
monthly_ordinalYes
monthly_weekdayYes
template_meeting_idYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is fully covered. The description adds a genuine constraint beyond annotations — the OpenProject 17.4+ version requirement — but says nothing about error behavior for missing ids or what a 'series' returns versus an occurrence.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action, with the version requirement isolated where it is easy to scan. No filler, though the version note could be folded in more crisply.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations cover the safety profile, so the description need not explain return values or side effects. It supplies the one non-structured fact an agent needs — the version floor — making it essentially complete for a single-parameter read.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single required parameter, and the schema description already tells the agent the id comes from list_recurring_meetings. The description adds no format or sourcing detail 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a single OpenProject recurring meeting series by id'), which is clearly distinct from list_recurring_meetings and from the occurrence tools. It does not explicitly name siblings, but the resource scope (series, not occurrence) is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the tool fetches one entity by id, so an agent can infer it should call list_recurring_meetings first. There is no explicit when-to-use guidance, no mention of how it differs from list_recurring_meeting_occurrences, and no prerequisites beyond the version gate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sprintB
Read-onlyIdempotent

Get a Backlogs sprint by id. Requires OpenProject 17.3 or newer.

NameRequiredDescriptionDefault
sprint_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
statusYes
created_atYes
start_dateYes
updated_atYes
finish_dateYes
defining_workspaceYes
defining_workspace_idYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that with the server-version prerequisite, but says nothing about behavior when the id is unknown or the Backlogs module is disabled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and followed by the hard prerequisite. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 needn't be explained, and annotations cover the safety profile. Still, the origin of sprint_id and the error path for a missing sprint are unaddressed, leaving the definition only minimally viable for a lookup tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single parameter, so the description carries the burden, yet it only restates 'by id' without explaining that sprint_id is an integer identifier obtained from list_sprints or what happens with an invalid value. It adds essentially nothing beyond the parameter name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a Backlogs sprint by id'), which is enough to tell it apart from the sibling list_sprints. It doesn't explicitly name list_sprints as the collection-level alternative, but the singular 'by id' scoping does the disambiguating work.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: you call it when you already have a sprint id. The version prerequisite ('Requires OpenProject 17.3 or newer') is genuinely useful deployment guidance, but there is no explicit instruction on where to obtain the id or when to prefer list_sprints.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_statusC
Read-onlyIdempotent

Get a single work package status by id.

NameRequiredDescriptionDefault
status_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
colorYes
positionYes
is_closedYes
is_defaultYes
is_readonlyNo
default_done_ratioNo
excluded_from_totalsNo

TDQS

C2.9/5.0
Behavior2/5

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 structurally. The description adds essentially no behavioral context beyond restating that it retrieves a single status, and does not describe error behavior, permissions, or lookup scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that identifies the operation and the key input. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-record read tool with annotations and an output schema, the description is enough to identify the operation. However, it leaves gaps around parameter sourcing and how it relates to list_statuses, so it is only adequate rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the lack of parameter documentation. It only says 'by id', which minimally maps to status_id but does not explain the identifier format, where to obtain it, or whether invalid ids return errors.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: get a single work package status by id. This distinguishes it from list-style siblings such as list_statuses, but it does not explicitly name alternatives or clarify how it differs from related getters like get_work_package or get_job_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as list_statuses or the work package tools. The description implies retrieval by id, but provides no exclusions, prerequisites, or alternative-routing advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_time_entryA
Read-onlyIdempotent

Get a single time entry by id, including its full comment.

The comment is returned in full by default (single time entries are not truncated). Pass text_limit to cap it at that many characters; when the text is cut, comment_truncated is true and comment_length reports the real length.

NameRequiredDescriptionDefault
text_limitNo
time_entry_idYes

Output Schema

NameRequiredDescription
idYes
userYes
hoursYes
commentYes
ongoingYes
projectYes
user_idNo
activityYes
end_timeYes
spent_onYes
entity_idYes
created_atYes
start_timeYes
updated_atYes
entity_nameYes
entity_typeYes
comment_lengthNo
comment_truncatedNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral detail about comment truncation, text_limit, comment_truncated, and comment_length, though it does not discuss error or permission behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main action is front-loaded, and the second paragraph immediately explains the default comment behavior and text_limit. There is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, annotations cover safety, and the output schema handles return structure. The description fills the important gap around text_limit and truncation, leaving only minor details such as error behavior unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry parameter meaning. It thoroughly explains text_limit and the resulting truncation flags, while time_entry_id is only covered by the obvious 'by id' phrasing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: get a single time entry by id. It clearly distinguishes retrieval of one entry from list operations and notes the included full comment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'single time entry by id' phrasing makes the usage context clear and implies list_time_entries is for broader retrieval. It does not explicitly name alternatives or exclusions, so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_typeA
Read-onlyIdempotent

Get a single work package type by id.

NameRequiredDescriptionDefault
type_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
colorYes
positionYes
created_atNo
is_defaultYes
updated_atNo
is_milestoneYes

TDQS

A3.5/5.0
Behavior3/5

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 only the single-item scope and id-based lookup, without error or permission details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no redundant text. It is appropriately sized for a simple lookup tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with annotations and an output schema, the description is close to complete. The main remaining gap is that it does not help the agent understand where the type id comes from.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only says 'by id', which gives minimal meaning and does not clarify that type_id refers to a work package type identifier rather than another entity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get), resource (single work package type), and lookup key (by id). It is clearly distinguishable from the sibling list_types because it retrieves a single type by identifier.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when a type id is known, but provides no explicit when-to-use guidance, prerequisites, or alternative such as list_types for discovering ids.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_versionA
Read-onlyIdempotent

Get a version by id, including its full description.

The description is returned in full by default (single versions are not truncated). Pass text_limit to cap it at that many characters; when the text is cut, description_truncated is true and description_length reports the real length.

NameRequiredDescriptionDefault
text_limitNo
version_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
statusYes
sharingYes
end_dateYes
created_atNo
start_dateYes
updated_atNo
descriptionYes
defining_projectYes
description_lengthNo
description_truncatedNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so the safety profile is covered. The description goes beyond them by disclosing a real behavioral trait: text is returned whole by default, and truncation only occurs when text_limit is supplied, exposed via description_truncated and description_length.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The primary purpose is front-loaded in one sentence, and the second sentence is dedicated to the only non-obvious parameter. Backticked field names and a line break are slightly noisy but every clause carries meaning; nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter getter with an output schema, the description covers the non-obvious input and the truncation contract. Missing only edge-case behavior such as what happens for an unknown version_id, which is a modest gap rather than a blocker.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the load — and it fully explains text_limit's semantics (default null means full text, a value caps at N chars, and cut text flags description_truncated with the true length). version_id is left as an obvious integer identifier, which is a minor gap but low risk.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a version by id') plus scope ('including its full description'), so it is clearly a single-item fetch. It contrasts implicitly with list_versions through the 'single versions are not truncated' note, but never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: it is clear you need a version_id to call it, and the truncation note hints this is the detailed single-record read versus list_versions. There is no explicit statement of when to prefer this over list_versions or update_version, and no prerequisites or failure conditions are described.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_viewC
Read-onlyIdempotent

Get a single OpenProject view by id.

NameRequiredDescriptionDefault
view_idYes

Output Schema

NameRequiredDescription
idYes
nameYes
typeYes
linksYes
queryYes
publicYes
projectYes
starredYes
query_idYes
created_atYes
project_idYes
updated_atYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, and the output schema covers the return shape. The description adds no behavioral context beyond these — nothing about permissions, error behavior for a missing id, or what a 'view' contains relative to a grid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with no filler, front-loading the verb and resource. It is terse to the point of being underspecified, but nothing in it is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because annotations declare the safety profile and an output schema exists, the essentials for a correct call are present. What is missing is domain context an agent would need to choose this tool confidently — what a view is and how it relates to grids and views listings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single required parameter, and the description only supplies the phrase 'by id', which adds virtually nothing beyond the parameter name view_id. No format, validity, or lookup-failure semantics are given.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('a single OpenProject view by id'), so the operation is unambiguous. It does not distinguish the tool from the nearby list_views/get_grid siblings, but the singular-by-id scope is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus list_views or get_grid, and no prerequisites or exclusions are stated. The agent must infer from the name alone that this is the detail-fetch counterpart of the view listing tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_wiki_pageA
Read-onlyIdempotent

Get a single wiki page's metadata (id, title, project) by id.

OpenProject's REST API v3 does not expose a wiki page's body text at all -- GET /api/v3/wiki_pages/{id} returns only id/title/project, and there is no other route that returns the page content. This tool therefore cannot return wiki page text; use the OpenProject web UI to read a page's content.

NameRequiredDescriptionDefault
wiki_page_idYes

Output Schema

NameRequiredDescription
idYes
titleYes
projectYes
project_idYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent safety, and the description adds genuinely new context: the REST API's GET /api/v3/wiki_pages/{id} exposes no body text and no other route does either. That prevents an agent from assuming a surprising capability gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The capability statement is front-loaded in the first sentence, and the limitation explanation follows. The second paragraph is slightly repetitive (restating both that the API doesn't expose body text and that the tool cannot return text), costing some tightness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 usefully tells the agent exactly which fields come back and warns about the missing content, covering the only real ambiguity for a one-parameter read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but there is only one required parameter and the description's 'by id' aligns with wiki_page_id; the parameter's meaning is self-evident from its name. No additional format or lookup semantics are provided, so this is minimum viable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a single wiki page's metadata') and enumerates the returned fields (id, title, project), plus explicitly scopes out body text. An agent can distinguish this from list_work_package_wiki_links or list_documents 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when the tool applies (metadata retrieval by id) and when it does not (page content), routing the agent to the OpenProject web UI for that case. This is a rare, clearly stated alternative path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_work_packageA
Read-onlyIdempotent

Get a work package by id, including its full description.

The description is returned in full by default (single work packages are not truncated). Pass text_limit to cap it at that many characters; when the text is cut, description_truncated is true and description_length reports the real length. This same text_limit also caps any "text"-format custom field value in custom_fields (see list_work_packages's docstring for the full custom_fields/custom_comments shape and hide-matching rules) -- but a scalar string/link/date-format custom field value is capped independently at ~255 characters regardless of text_limit, including when text_limit=None (the default here): "single work packages are not truncated" applies to description and CF text-format values, not to that separate, always-on scalar cap.

select restricts the response to the given fields (e.g. ["id", "subject", "status"]); an invalid name returns the allowed set.

NameRequiredDescriptionDefault
selectNoFields to return; a requested unset field comes back as null. Allowed: ancestors, ancestors_truncated, assignee, author, category, children, children_truncated, created_at, custom_comments, custom_comments_truncated, custom_fields, custom_fields_truncated, derived_due_date, derived_estimated_time, derived_percentage_done, derived_remaining_time, derived_start_date, description, description_length, description_truncated, display_id, due_date, duration, estimated_time, has_project_attributes, id, ignore_non_working_days, lock_version, parent_display_id, parent_id, percentage_done, priority, project, project_phase, readonly, remaining_time, responsible, schedule_manually, spent_time, sprint, start_date, status, subject, target_versions, type, updated_at, version.
text_limitNo
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare it a safe, idempotent read, yet the description adds genuinely non-obvious behavior: description returned untruncated by default, text_limit capping, the description_truncated/description_length flags, and a separate always-on ~255-char cap on scalar string/link/date custom fields that applies even when text_limit is None. It also documents failure behavior (invalid select name returns the allowed set).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, and the truncation rules that follow are information-dense rather than padded. It loses a point for the tangled nested clause about the ~255-char scalar cap and the aside pointing at another tool's docstring.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so: it names the key fields (description, description_truncated, description_length, custom_fields), explains the select-projection contract, and warns about the scalar-field cap. Nothing needed 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

text_limit has no schema description at all, and the prose fully compensates by explaining exactly what it caps and where the cap does not apply. select is already well documented in the schema, but the description still adds the error-handling detail; work_package_id's id-vs-display-id semantics come from the schema, not the prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get a work package by id, including its full description.' The contrast 'single work packages are not truncated' implicitly distinguishes it from the list variants, but it never names search_work_packages or get_work_packages as the alternative for bulk/query retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the truncation contrast signals this is the single-record fetch, and it defers to list_work_packages's docstring for the custom_fields shape. There is no explicit 'use this when X, use sibling Y when Z', despite several closely related siblings (get_work_packages, search_work_packages, get_project_work_package_context).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_work_package_activitiesA
Read-onlyIdempotent

Get the activity log for a work package, most recent first.

Comments are returned in full by default (this is one work package's own history, not an open-ended multi-row list; same rationale as get_work_package). Pass text_limit to cap each comment at that many characters; when a comment is cut, comment_truncated is true and comment_length reports its real length.

When OPENPROJECT_READ_PROJECTS is not *, or a work package or custom field is hidden, change details are left out and details_omitted is true: OpenProject returns them as text in the API user's language with no structure to check against the read scope or the hidden fields, and the text can name parents, projects and versions of projects outside it and carry the values of hidden fields. Comments, user and time are unaffected.

NameRequiredDescriptionDefault
limitNoNumber of most recent activities, capped at OPENPROJECT_MAX_PAGE_SIZE. Not paged.
selectNoFields to return; a requested unset field comes back as null. Allowed: comment, comment_length, comment_truncated, created_at, details, details_omitted, details_truncated, id, type, user, version.
text_limitNo
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses truncation behavior: comments are full by default, text_limit caps them, and comment_truncated/comment_length signal cuts. It also explains privacy-driven omission of change details when OPENPROJECT_READ_PROJECTS is restricted or fields are hidden, including which fields are unaffected. This is substantial behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core operation and then explains truncation and privacy exceptions. It is appropriately sized for a tool with non-obvious privacy behavior, though the reference to 'same rationale as get_work_package' is slightly indirect.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does a good job explaining the key return behaviors around comments, truncation, and details_omitted. It does not fully enumerate every possible return field, but the schema's select parameter lists them and the description covers the non-obvious cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, and the description adds meaningful semantics for text_limit, which has no schema description, including its truncation flags. Other parameters like limit, select, and work_package_id are already documented in the schema, so the description appropriately complements rather than repeats them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get the activity log for a work package,' with the ordering 'most recent first.' It also distinguishes this from an open-ended multi-row list, making the scope clear against siblings like list_work_package_reactions or get_work_package.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clarifies that this is one work package's own history, not a general listing, and explains the text_limit use case. It does not explicitly name alternative tools or state when not to use it, but the contextual distinction is clear enough for routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_work_package_costs_by_typeA
Read-onlyIdempotent

Get a work package's costs aggregated by cost type.

count is the number of distinct cost types with recorded spend on this work package, not a monetary total. Each result's spent_units is a quantity in that cost type's own unit (see get_cost_type for the unit name) -- there is no currency conversion or grand total computed here or by OpenProject's own API.

NameRequiredDescriptionDefault
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a read-only, idempotent, non-destructive operation, and the description adds genuinely non-obvious semantics: count is a number of distinct cost types rather than a monetary total, spent_units are in each type's own unit, and no currency conversion or grand total exists anywhere in the API. This preempts the most likely misreading of the output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in one short sentence, followed by tightly scoped caveats about count and spent_units. Every clause earns its place, though the line-broken presentation is slightly less scannable than a single tight paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and a single fully-documented parameter, the description supplies the return-shape information the schema cannot: the meaning of count and spent_units. It stops short of stating the result's other fields or ordering, but nothing required 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the work_package_id description already explains the id vs display-id distinction, so the description's silence on parameters is acceptable. It adds no semantics beyond the schema, which is the baseline-3 case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('a work package's costs'), and the qualifier 'aggregated by cost type' distinguishes the shape of the result from a raw entry listing. It does not explicitly name list_work_package_cost_entries as the sibling that returns individual entries, so the differentiation is implied rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the aggregation scope, and the description points to get_cost_type for unit names, which is useful routing. But there is no explicit when-to-use/when-not guidance versus list_work_package_cost_entries or get_cost_entry, leaving the agent to infer which cost tool to pick.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_work_package_relationsA
Read-onlyIdempotent

Get the relations of one work package (blocks, relates to, duplicates, etc.).

type/from_id/to_id reflect how OpenProject actually stored the relation, which does not depend on which work package's relations you query, but can differ from how it was originally requested, since OpenProject canonicalizes some relation types at creation time (e.g. a relation requested as 'precedes' is stored as 'follows' with from_id/to_id swapped; see create_work_package_relation). Use from_id/to_id together with type, not the request you expect to have made, to determine the actual direction.

Each result additionally carries queried_perspective, a caller-relative reading of the same relation from work_package_id's own side; never a replacement for type/from_id/to_id, which stay unchanged. queried_perspective.direction is "from" or "to" (which raw id equals work_package_id); queried_perspective.effective_type is the type as read FROM work_package_id's side (e.g. a stored "blocks" relation reads as effective_type="blocked" when work_package_id is the to_id side, "blocks" when it's the from_id side). queried_perspective.predecessor_id/successor_id are populated only for the precedes/follows type pair (OpenProject's own scheduling-relevant relation types); both stay null for every other type, since no other type has an equivalent first/second concept.

total is only the count of allowed relations returned on THIS page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: description, description_length, description_truncated, from_id, from_subject, id, queried_perspective, to_id, to_subject, type.
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only and idempotent safety, and the description adds substantial behavioral context: OpenProject canonicalizes relation types at creation, from_id/to_id must be used with type for direction, queried_perspective is caller-relative, and total is only a page count with pagination until next_offset is null. This goes well beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear purpose sentence and then provides dense but relevant nuance about canonicalization and queried_perspective. It is longer than typical, but every sentence earns its place given the subtle relation-direction semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden of explaining return values, and it does so thoroughly: it describes type/from_id/to_id, queried_perspective fields, pagination limits, and next_offset behavior. An agent has enough information to interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents limit, offset, select, and work_package_id. The description adds useful pagination behavior (total is page-only; page until next_offset is null), but it does not add meaning to the individual input parameters beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence clearly states the specific verb and resource: retrieving relations for one work package, with examples of relation types. It does not explicitly differentiate this tool from the sibling list_relations, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to interpret returned direction and pagination, but it never states when to use this tool versus alternatives like list_relations or get_work_package. Usage is implied rather than explicitly guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_work_packagesA
Read-onlyIdempotent

Get several work packages by id in one batch call.

Fetches work packages in parallel and returns per-item results. Failed fetches are reported individually without stopping the batch. Maximum 100 IDs per batch.

ids: internal ids (e.g., 952) or display_ids (e.g., "PROJ-51"), not UI display numbers. Duplicate IDs are automatically deduplicated.

select restricts each result's work_package to the given fields (e.g. ["id", "subject", "status"]); an invalid name returns the allowed set. The id/success/error fields on each result are always included regardless of select, so you can still tell which items succeeded; listing success or error in select is accepted and changes nothing, while id doubles as a selectable work_package field.

For batches with many full-detail items, set text_limit and/or select proactively; an unbounded batch of large work packages can exceed the tool-result size limit and get redirected to a file.

Each item's work_package carries the same custom_fields/custom_comments shape and caps as get_work_package; see list_work_packages's docstring for the full details (raw-key values, per-field caps, and the OPENPROJECT_HIDE_CUSTOM_FIELDS key-only hide-matching asymmetry). With many items, an unbounded custom_fields/custom_comments per item adds to the same size-limit risk text_limit/select address above.

NameRequiredDescriptionDefault
idsYes
selectNoFields to return; a requested unset field comes back as null. Allowed: ancestors, ancestors_truncated, assignee, author, category, children, children_truncated, created_at, custom_comments, custom_comments_truncated, custom_fields, custom_fields_truncated, derived_due_date, derived_estimated_time, derived_percentage_done, derived_remaining_time, derived_start_date, description, description_length, description_truncated, display_id, due_date, duration, error, estimated_time, has_project_attributes, id, ignore_non_working_days, lock_version, parent_display_id, parent_id, percentage_done, priority, project, project_phase, readonly, remaining_time, responsible, schedule_manually, spent_time, sprint, start_date, status, subject, success, target_versions, type, updated_at, version.
text_limitNo

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/idempotent/destructive annotations: parallel fetching, per-item failure reporting without aborting the batch, deduplication, the 100-ID cap, the size-limit-to-file redirection, and the guarantee that id/success/error survive select. This is genuinely useful operational context an agent could not get from the 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose and batch limits, then layers select, text_limit, and custom_fields caveats in a logical order. It runs long and repeats the size-limit risk twice (once for text_limit/select, once for custom_fields), which is some redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the right thing by describing the per-item result shape (work_package plus id/success/error). It partly punts the custom_fields/custom_comments details to get_work_package's and list_work_packages's docstrings, which is a gap for an agent that only sees this definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33%, but the description compensates heavily: it explains that ids accepts internal ids or display_ids (explicitly not UI display numbers) and are deduplicated, and it details select's filtering behavior, always-included fields, and invalid-name fallback. text_limit's truncation semantics are only alluded to ('unbounded ... can exceed the size limit'), leaving that parameter underspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with distinguishing scope: 'Get several work packages by id in one batch call.' That clearly separates it from the singular get_work_package and the filter-based list_work_packages/search_work_packages, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete operating guidance: 100-ID maximum, proactive use of text_limit/select for large batches, and the dedup behavior for duplicate IDs, plus the warning that unbounded batches get redirected to a file. It does not explicitly say when to prefer get_work_package or list_work_packages instead, which keeps it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

init_recurring_meeting_occurrenceA
DestructiveIdempotent

Materialize a virtual recurring-meeting occurrence into a real, standalone Meeting.

Requires OpenProject 17.4+.

start_time: the occurrence's exact start time (ISO 8601, matching a start_time value from list_recurring_meeting_occurrences); occurrences have no numeric id, they are addressed by this timestamp. On success, result is a full Meeting (use its id with get_meeting/ update_meeting/delete_meeting), not an occurrence. A cancelled occurrence is restored and its content reset to the template. If the series template is still a draft, this first sets it to open, which stays even if the init fails; on 17.6 and later OpenProject creates further occurrences automatically only once the template is open. On OpenProject 17.4 and 17.5, initializing an occurrence that already exists fails with a server error instead of returning it; 17.6 and later return the existing occurrence.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
start_timeYes
recurring_meeting_idYesRecurring meeting series id, from list_recurring_meetings.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With destructiveHint=true and idempotentHint=true already present, the description still adds essential context: a cancelled occurrence is restored and its content reset to the template, a draft template is forced open and stays open even if init fails, and repeated init behaves differently on 17.4/17.5 (server error) vs 17.6+ (returns existing). This is exactly the side-effect disclosure an agent needs for a destructive, open-world mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in one sentence, followed by tightly scoped caveats on start_time, return value, and version behavior. The version-specific error nuance in the final paragraph is lengthy but earns its place because it prevents a misread of a server error as a failure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema and an open-world annotation, the description covers the return value ('result is a full Meeting'), downstream id usage, side effects on template state, and version-dependent failure modes. An agent has enough to call it correctly and interpret the outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and start_time has no schema description, but the description fully compensates: ISO 8601 format, must match a start_time from list_recurring_meeting_occurrences, and the key insight that occurrences have no numeric id and are addressed by timestamp. recurring_meeting_id and confirm are covered by the schema, so the remaining gap is small.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb ('Materialize') and resource ('virtual recurring-meeting occurrence into a real, standalone Meeting'), and the distinction between an occurrence and the resulting Meeting is made explicit. This clearly separates the tool from list_recurring_meeting_occurrences and cancel_recurring_meeting_occurrence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives strong operational context: OpenProject 17.4+ prerequisite, start_time must match a value from list_recurring_meeting_occurrences, and the output feeds get_meeting/update_meeting/delete_meeting. It does not explicitly say when-not to use it versus cancel_recurring_meeting_occurrence or update_recurring_meeting, so it falls short of full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_actionsA
Read-onlyIdempotent

List the action ids OpenProject's API defines, e.g. "work_packages/create".

This is the vocabulary only; which user or group may perform an action in which project comes from list_capabilities.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: id, url.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds meaningful semantics beyond that — that the payload is a static, non-user-specific vocabulary list — but says nothing about volume, ordering or that results are paginated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, with the core purpose front-loaded and the disambiguation second. The only waste is formatting; the content is tight and every clause carries signal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple paginated read-only list tool with full annotation coverage, fully described parameters and an example of the returned identifier shape, nothing an agent needs in order 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with limit, offset and select each documented in the schema (including the 1-based offset and allowed select fields). The description adds no parameter-level meaning, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List the action ids OpenProject's API defines") and gives a concrete example value, "work_packages/create". It explicitly distinguishes itself from the similarly-named list_capabilities, so an agent can route correctly 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly delineates the boundary: this tool is "the vocabulary only", while per-user/group/per-project permissions come from list_capabilities. That names the alternative and the condition that selects it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_backlog_bucketsA
Read-onlyIdempotent

List Backlogs backlog buckets, optionally filtered by name search.

Omit project to list every backlog bucket visible to the current token across all projects; pass it to list only backlog buckets for that project.

Requires the OpenProject Backlogs module and OpenProject 17.6 or newer; unavailable instances return a clear not-found message.

total is only the count of allowed backlog buckets returned on THIS page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
searchNo
selectNoFields to return; a requested unset field comes back as null. Allowed: created_at, defining_workspace, defining_workspace_id, id, name, updated_at.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a safe, idempotent read operation. The description adds meaningful behavior beyond those annotations: the OpenProject Backlogs module and version requirement, the not-found response for unavailable instances, and the pagination caveat that total is page-local and callers should page until next_offset is null.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, and the paragraphs separate scope, availability, and pagination concerns. It is somewhat long for a list tool but mostly earns its space by clarifying non-obvious pagination and availability behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter list tool with no output schema, the description covers the critical context: module/version availability, project scoping, search filtering, and pagination behavior including the page-local total caveat. It does not fully describe the returned item structure, but the select schema lists available fields and the key return semantics are explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high at 80%, so the baseline is 3, but the description adds useful semantics: search is by name, project omission means all visible projects while passing it narrows to one project, and offset should follow next_offset during pagination. The remaining parameters are largely covered by the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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 Backlogs backlog buckets', and adds that it can be filtered by name search. It clearly implies listing versus getting a single bucket, though it does not explicitly name the sibling get_backlog_bucket as the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the key scoping choice: omitting project lists across all projects, while passing project restricts to one project. However, it does not explicitly say when to use this tool versus get_backlog_bucket or other listing tools, so usage guidance is implied rather than fully resolved.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_boardsA
Read-onlyIdempotent

List saved OpenProject boards/queries, optionally scoped to a project.

With project, search, or a restrictive OPENPROJECT_READ_PROJECTS, total is only the count of allowed boards returned on THIS page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
searchNo
selectNoFields to return; a requested unset field comes back as null. Allowed: can_delete, can_update, filter_count, hidden, id, include_subprojects, name, project, project_id, public, show_hierarchies, starred, timeline_visible.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds genuinely non-obvious behavior beyond the readOnly/idempotent/openWorld annotations: the total field is a page-local count when project, search, or OPENPROJECT_READ_PROJECTS restricts results, because search stops early. This is exactly the kind of subtle return-value behavior an agent would otherwise misinterpret.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose sentence is front-loaded, followed by a dense but useful caveat and a paging instruction. The middle sentence is slightly convoluted ('total is only the count of allowed boards returned on THIS page, not a full count of all matches') but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of explaining the return shape, and it does cover the key field (total) and the pagination sentinel (next_offset). It omits other return fields such as filter_count/starred that appear in select, but nothing blocking correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so the schema already documents limit, offset, select, and project. The description explains the downstream effect of project/search on the total count, which is meaning beyond the schema, but it adds nothing about the select or limit semantics themselves. Baseline 3 fits.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list saved OpenProject boards/queries) and a clear scope modifier (optionally scoped to a project). The agent can distinguish it from get_board/create_board/update_board among 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete operational instructions: when a project/search/read restriction applies, the total is page-scoped, and the caller should page until next_offset is null. It does not explicitly name alternatives such as get_board for a single board, so it falls short of the 5 bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_capabilitiesA
Read-onlyIdempotent

List API capabilities exposed by OpenProject.

At least one of project or capability_id is required; there is no unfiltered global listing, since one would bypass the project read allowlist.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: action_id, context, id, principal_id, principal_name, url.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.
capability_idNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered. The description adds non-obvious policy behavior the annotations do not: a required scoping filter and the reason (bypassing the project read allowlist). That is real added context, though it says nothing about result size or pagination behavior beyond what the schema provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, the scoping rule front-loaded, and the rationale for the restriction tucked behind it. Efficient, though the trailing motivation clause is slightly explanatory for what is essentially one constraint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description never explains what a 'capability' record contains (the select enum hints at action_id, principal_id, context) or what the list is typically used for. The access-control constraint is covered, but an agent gets little sense of the returned data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80% and project/limit/offset/select are well documented there, but the schema declares zero required parameters while the description imposes a conditional requirement tying project and capability_id together — a semantic rule that exists nowhere in the schema. capability_id itself remains undocumented, which caps it below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List API capabilities exposed by OpenProject"), which is clearly distinct from the many list_* siblings such as list_actions or list_roles. It doesn't explicitly differentiate from any named sibling, keeping it just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a firm usage constraint — at least one of project or capability_id must be supplied, and no global unfiltered listing exists — which is genuinely useful. However, it never says when to reach for this tool versus alternatives (e.g. list_actions for global action lists), so the guidance is only partially complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_categoriesA
Read-onlyIdempotent

List work-package categories configured for a project.

NameRequiredDescriptionDefault
selectNoFields to return; a requested unset field comes back as null. Allowed: default_assignee, default_assignee_id, id, name, project, project_id.
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds only the project scoping constraint and says nothing about result shape, ordering or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with zero filler and the scope qualifier up front.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, read-only two-parameter list tool with full schema coverage and complete annotations, the description is sufficient. Only return-shape detail is absent, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%; the project matching semantics (id/name/partial match) and the select field list are already fully documented in the schema. The description adds no parameter detail beyond that, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (work-package categories) with scope ('configured for a project'), which clearly separates it from the singular sibling get_category.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'configured for a project' scope implies when to use it, but it never names get_category or any alternative, nor states exclusions. Usage is inferable rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_documentsA
Read-onlyIdempotent

List documents, optionally filtered to a single project or by title search.

total is only the count of allowed documents returned on THIS page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

text_limit caps each document's description at that many characters (default: the server's configured OPENPROJECT_TEXT_LIMIT, NOT unlimited -- unlike get_document's single-item default). When text is cut, description_truncated is true and description_length reports the real length.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
searchNo
selectNoFields to return; a requested unset field comes back as null. Allowed: attachment_count, can_update, created_at, description, description_length, description_truncated, id, project, project_id, title.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.
text_limitNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, but the description adds real value: it discloses that 'total' is only this page's allowed-document count because search short-circuits, and that truncation sets description_truncated with a true description_length. These are non-obvious behaviors an agent would otherwise misread.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose and then layers the non-obvious caveats (page-scoped total, text_limit truncation) efficiently. The text_limit paragraph is slightly dense but each sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and six parameters, the description fills key gaps: pagination termination via next_offset, the meaning of total, and the description_truncated/description_length pairing. Field-level return detail is left to the 'select' schema, which is reasonable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, so several parameters are already documented. The description adds meaningful semantics for text_limit (server-configured default, not unlimited, unlike get_document) and clarifies the page-scoped nature of total, but it says little about search syntax or select beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List documents') plus the two filtering modes (project, title search). It references get_document when contrasting the text_limit default, so a sibling relationship is implicit, though it never explicitly routes the agent to which tool to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete operational guidance: page until next_offset is null, and the total is page-scoped rather than a full match count. It also flags that text_limit here differs from get_document's single-item default, which helps the agent choose between them, though no explicit when-not condition is stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_gridsA
Read-onlyIdempotent

List dashboard grids, optionally filtered by scope (page path).

total is only the count of allowed grids returned on THIS page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
scopeNo
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: column_count, created_at, id, row_count, scope, updated_at.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important non-obvious behavior beyond the annotations: total reflects only this page because the search stops early, and an exact total would require a full walk. It also gives explicit pagination guidance via next_offset, which is valuable context for a read-only list operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, and the remaining text is a focused caveat about total counts and pagination. Every sentence contributes to correct invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of an output schema, the description does well by explaining the important total-count caveat and next_offset paging. It could go slightly further in describing the returned grid shape, but the select parameter already enumerates returnable fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents limit, offset, and select, covering most parameters. The description adds useful meaning for the otherwise undocumented scope parameter by calling it a page path, and reinforces offset usage through the next_offset paging instruction.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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 dashboard grids.' The optional scope filter is clear, but it does not explicitly distinguish itself from the singular get_grid sibling beyond the obvious verb/plural difference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly describes the optional scope filtering and instructs the agent to page until next_offset is null. It does not name alternatives or when-not-to-use conditions, so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_meeting_agenda_itemsA
Read-onlyIdempotent

List the agenda items of one meeting.

Requires OpenProject 17.4+.

This list is unpaginated server-side (OpenProject returns every agenda item of the meeting in one response); offset/limit are applied client-side by this MCP.

text_limit caps each item's notes at that many characters (default: the server's configured OPENPROJECT_TEXT_LIMIT, NOT unlimited). When text is cut, notes_truncated is true and notes_length reports the real length.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: author, created_at, duration_in_minutes, id, item_type, lock_version, meeting_id, meeting_section_id, notes, notes_length, notes_truncated, outcome_ids, position, presenter, title, updated_at, work_package_id.
meeting_idYes
text_limitNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/idempotent annotations: it discloses the server-version requirement, that the endpoint is unpaginated server-side and offset/limit are applied client-side, and that text is truncated with notes_truncated/notes_length flags. These are non-obvious behaviors an agent could otherwise get wrong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and prerequisite, then pagination, then truncation semantics in a logical order. Slightly verbose across multiple short paragraphs, but every line carries substantive information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still explains the truncation-related return fields and the client-side pagination model, plus the version gate. An agent has everything needed to call it and interpret the response correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60% and the biggest gap, text_limit (no schema description), is fully explained including its default being the server-configured limit rather than unlimited. It also clarifies that offset/limit are client-side, adding meaning beyond the schema's pagination hints; select and meeting_id rely on the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the agenda items of one meeting') and scopes it to a single meeting via meeting_id. It does not, however, distinguish itself from the close sibling list_work_package_meeting_agenda_items, which an agent could easily confuse with it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the name and the 'of one meeting' scoping; there is no explicit statement of when to choose this over list_work_package_meeting_agenda_items or get_meeting_agenda_item. The version prerequisite (OpenProject 17.4+) is a useful precondition but not a when-to-use rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_meeting_outcomesA
Read-onlyIdempotent

List outcomes of a meeting agenda item.

Requires OpenProject 17.6+; the meeting_outcomes endpoint does not exist on 17.4/17.5.

This list is unpaginated server-side; offset/limit are applied client-side by this MCP.

text_limit caps each outcome's notes at that many characters (default: the server's configured OPENPROJECT_TEXT_LIMIT, NOT unlimited). When text is cut, notes_truncated is true and notes_length reports the real length.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: author, created_at, id, kind, meeting_agenda_item_id, notes, notes_length, notes_truncated, updated_at, work_package_id.
text_limitNo
agenda_item_idYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/non-destructive, and the description layers on non-obvious behavior: the endpoint is unpaginated server-side so offset/limit are applied client-side by this MCP, plus the version gate. The text_limit truncation contract (notes_truncated flag, notes_length real-length reporting, default from server config rather than unlimited) is exactly the kind of silent-surprise behavior worth disclosing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, then prerequisite, then pagination caveat, then text_limit semantics — a sensible priority order with no filler. Slightly fragmented by hard line breaks and a dangling closing quote, but every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema available, the description still explains the relevant returned fields (notes_truncated, notes_length) and the pagination model an agent needs to page correctly. Nothing essential for a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 60%; text_limit has no schema description at all, and the description supplies its default source and truncation side effects. It also corrects a potentially misleading schema note by clarifying that limit/offset are enforced client-side because the upstream endpoint is unpaginated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List outcomes of a meeting agenda item'), which cleanly separates it from the singular get_meeting_outcome. It does not explicitly name or contrast with siblings, but the agenda-item scoping makes the target unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The version prerequisite (17.6+, endpoint absent on 17.4/17.5) is a genuine usage condition. However, there is no guidance on when to prefer this over get_meeting_outcome or list_meeting_agenda_items, so the when-to-use versus-what is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_meetingsA
Read-onlyIdempotent

List OpenProject meetings, optionally scoped to a project.

Requires OpenProject 17.4+; the meetings module's agenda/section/ participant shape used here does not exist on 16.6, which only exposes an incompatible legacy "meeting contents" representation.

Omit project to list across all readable projects.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered; the description adds real value beyond that by disclosing a version compatibility boundary and the cross-project readability scope. It does not describe response shape or pagination behavior, which keeps it out of 5 territory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first line, followed by prerequisite and scoping details. The version-compatibility sentence is longer than strictly necessary but earns its place by preventing an incompatible-version call.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with full schema coverage, the definition covers purpose, prerequisite, and scoping scope. The remaining gap is that with no output schema, nothing tells the agent what a meeting record contains, but the pagination fields in the schema carry most of the operational load.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so limit/offset/project are already documented; the description adds semantics the schema lacks by explaining what omitting project actually means (all readable projects). That is a genuine increment over the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List OpenProject meetings') and adds a scope qualifier ('optionally scoped to a project'). It does not explicitly distinguish itself from adjacent siblings such as list_recurring_meetings or list_meeting_agenda_items, so it stays at 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives two concrete usage conditions: a hard prerequisite (OpenProject 17.4+, with 16.6 explicitly ruled out) and a scoping rule ('Omit project to list across all readable projects'). It stops short of naming alternative tools for single-meeting or recurring-meeting retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_meeting_sectionsA
Read-onlyIdempotent

List sections of an OpenProject meeting.

Requires OpenProject 17.4+.

This list is unpaginated server-side; offset/limit are applied client-side by this MCP.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
meeting_idYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds two non-obvious behavioral facts beyond that: a server version floor (17.4+) and that pagination is applied client-side because the endpoint is unpaginated server-side — which materially changes cost and offset expectations 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short lines: purpose first, then the version prerequisite, then the pagination caveat. No filler, and the most consequential caveat is placed where it will be read before the call.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, three-parameter list tool with no output schema and annotations covering the safety profile, this covers everything needed to invoke correctly: what it returns (a list of sections), the version requirement, and pagination behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and already documents limit (capped at OPENPROJECT_MAX_PAGE_SIZE) and offset (1-based page, use next_offset). The description's client-side-pagination note adds real meaning beyond the schema, clarifying that offset/limit do not map to server-side paging. meeting_id remains undocumented but is self-evident.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'List sections of an OpenProject meeting.' An agent can immediately tell this is the collection-level read for meeting sections, distinct from get_meeting_section and list_meeting_agenda_items by name and scope. It stops short of explicitly naming those siblings as alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Requires OpenProject 17.4+' line is a genuinely useful prerequisite that tells the agent when the call will fail, but there is no explicit guidance on when to pick this over get_meeting_section or how meeting sections relate to agenda items. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_my_open_work_packagesA
Read-onlyIdempotent

List the current user's open assigned work packages.

This query has no project scope of its own, so total is the real matching count only when OPENPROJECT_READ_PROJECTS is unrestricted ("*"); under a restricted scope, total always falls back to this page's item count, and next_offset/truncated are based on whether this page came back full rather than the server's own total, so nothing here ever reveals how many matches exist in projects you can't see. Page until next_offset is null either way.

Each result row also carries custom_fields/custom_comments, selectable or hideable only as a whole field like every other field, with the same shape, caps, and OPENPROJECT_HIDE_CUSTOM_FIELDS key-only hide-matching as list_work_packages -- see that tool's docstring for the full details.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: assignee, author, category, created_at, custom_comments, custom_comments_truncated, custom_fields, custom_fields_truncated, derived_due_date, derived_estimated_time, derived_percentage_done, derived_remaining_time, derived_start_date, description, description_length, description_truncated, display_id, due_date, duration, estimated_time, has_description, has_project_attributes, id, ignore_non_working_days, parent_display_id, parent_id, percentage_done, priority, project, project_phase, readonly, remaining_time, responsible, schedule_manually, spent_time, sprint, start_date, status, subject, target_versions, type, updated_at, version.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only safety, yet the description still adds substantive behavior: the total field silently degrades to page-count under restricted scope, truncated/next_offset are page-fullness based rather than server-truth, and no cross-project counts leak. That is exactly the kind of non-obvious behavior 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in one line and every following sentence carries information about pagination or field selection. The middle paragraph is long and awkwardly line-wrapped mid-sentence, which slightly hurts readability but not substance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-optional-parameter read-only list tool with full schema coverage and no output schema, the description covers scope, pagination termination, total-count caveats, and custom-field selection caveats. 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.

Parameters4/5

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 the non-obvious rule that custom_fields/custom_comments are selectable or hideable only as whole fields and points to list_work_packages for the full hide-matching semantics. The limit/offset semantics are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List), resource (work packages), and three scoping qualifiers (current user, open, assigned) that cleanly separate it from list_work_packages and search_work_packages. An agent can identify the tool's niche from the first sentence alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit operational guidance — 'Page until next_offset is null either way' — and explains when total is meaningful versus a page-count fallback. It does not explicitly name an alternative sibling for broader queries, but the implicit scoping is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_newsA
Read-onlyIdempotent

List news entries, optionally filtered by project or title/summary search.

total is only the count of allowed news entries returned on THIS page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

text_limit caps each entry's summary/description at that many characters (default: the server's configured OPENPROJECT_TEXT_LIMIT, NOT unlimited -- unlike get_news's single-item default). When text is cut, description_truncated is true and description_length reports the real length.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
searchNo
selectNoFields to return; a requested unset field comes back as null. Allowed: author, can_delete, can_update, created_at, description, description_length, description_truncated, id, project, project_id, summary, title.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.
text_limitNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), and the description goes well beyond them: total is only a page-local count because the search short-circuits, exact totals require a full walk, and text_limit defaults to the server's OPENPROJECT_TEXT_LIMIT rather than unlimited. It also names the side-effect signals (description_truncated, description_length) an agent must check when text is cut.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then pagination caveat, then truncation behavior — a sensible order with no filler. The explanation of why total is inexact ('would need an extra full walk') is useful but slightly indulgent for a definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With six optional params and no output schema, the description carries the return-shape burden and does it: it tells the agent to drive pagination off next_offset and to detect truncation via description_truncated/description_length. Nothing an agent needs to call and iterate correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, and the description fills the two biggest gaps: text_limit (no schema description at all) and search (scope limited to title/summary, not the whole entry). offset/limit semantics are left to the schema, which already documents them well, so this is a meaningful but not exhaustive lift.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List news entries') plus the two filter dimensions (project, title/summary search), so an agent immediately knows what it returns. It references get_news only to contrast the text_limit default, not to draw a use-this-vs-that boundary, so sibling differentiation is partial.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit pagination procedure ('Page until next_offset is null') and warns that total is page-local, which directly shapes how an agent should iterate. It does not say when to prefer get_news over list_news (or vice versa beyond the truncation default), so exclusions are missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_prioritiesB
Read-onlyIdempotent

List all available work package priorities.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=true, idempotent=true, destructive=false, openWorld=true, so the safety profile is fully covered without the description. The description adds no behavioral context of its own — not the shape of the results, not that the set is instance-configured (relevant to openWorldHint), not whether the list can be empty.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, no restatement of the title, and no redundant preamble. Nothing could be cut without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter reference-list tool with no output schema, the description is minimally viable but does not tell the agent what a priority record contains or how the values are used downstream. It is adequate to select the tool, not to use its results confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema coverage is 100%, so there is nothing for the description to disambiguate. Baseline 4 applies for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb ('List') plus specific resource ('work package priorities') with an explicit scope of 'all available'. It does not, however, distinguish itself from the sibling get_priority (single fetch) or from other enumeration tools like list_statuses and list_types, so an agent must infer the list-vs-get pattern.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the pattern of the tool family: call this to discover valid priority values before filtering or creating work packages. The description never states when to use it versus get_priority, nor that the returned IDs are the intended input for priority filters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_project_membershipsB
Read-onlyIdempotent

List memberships for a project, including principal and role names.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: can_update, can_update_immediately, created_at, id, principal_id, principal_name, project_id, project_name, role_ids, role_names, updated_at.
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds a useful return-content hint (principal and role names are included, which matters since there is no output schema) but says nothing about pagination behavior beyond what the schema's limit/offset fields already document.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the purpose and the returned content are both delivered immediately. It is arguably slightly thin for a list tool with pagination and field selection, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with full schema coverage and annotations, the essentials are present. The remaining gaps – how it differs from get_membership, and any note on paging through large membership sets – are the main things an agent would still want.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% – project identifier matching, select fields, and 1-based offset are all documented in the schema. The description adds no additional meaning about the project argument or how select filtering interacts with the listed principal/role names, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List memberships for a project") and adds that results carry principal and role names, which tells an agent what it gets back. It does not differentiate from the closely related get_membership or get_project_admin_context siblings, so an agent must infer the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the description scopes the call to one project, so an agent can infer this is for enumerating a project's members. It names no alternatives (get_membership for a single record, list_roles for role lookups) and states no when-not conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_project_phase_definitionsA
Read-onlyIdempotent

List available project lifecycle phase definitions exposed by OpenProject.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds only the hint that these are instance-level definitions 'exposed by OpenProject' rather than project-scoped ones; it says nothing about ordering, volume, or whether the set is configurable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. Every word (available, lifecycle, definitions, exposed by OpenProject) carries scoping information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-argument list tool with no output schema, the description is close to sufficient: it identifies the resource and that it is an enumeration of available definitions. It could note what a phase definition comprises (name, id) since no output schema documents the return shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters and 100% schema coverage, so the baseline is 4. There is nothing about arguments for the description to clarify or omit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (project lifecycle phase definitions) with the scope 'exposed by OpenProject'. It is reasonably distinguishable from the singular get_project_phase_definition and from get_project_phase, though it never explicitly says how they differ.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when this tool should be used instead of get_project_phase_definition or get_project_phase. The agent must infer the list-vs-get distinction purely from the naming pattern in the sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsA
Read-onlyIdempotent

List visible projects with optional name or identifier search.

Under a restrictive OPENPROJECT_READ_PROJECTS, total reflects only the allowed projects already scanned to fill this page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
searchNo
selectNoFields to return; a requested unset field comes back as null. Allowed: active, can_delete, can_update, created_at, description, description_length, description_truncated, favorited, id, identifier, name, parent_id, parent_name, public, status, status_explanation, status_explanation_length, status_explanation_truncated, updated_at.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behavior, so the safety bar is low. The description adds genuinely non-obvious context: under a restrictive OPENPROJECT_READ_PROJECTS the reported total reflects only scanned allowed projects, not a full count. That is real behavioral disclosure beyond 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and search behavior are front-loaded in one sentence, with the permission caveat and paging instruction after. The middle clause is dense and slightly convoluted, but every part carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With four optional parameters, no output schema, and annotations covering safety, the description supplies the two things the schema cannot: pagination termination and total-count semantics under restrictive permissions. What a project object contains is handled by the select field list in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75% and limit, offset and select are already documented in-schema. The description compensates for the one undocumented parameter by explaining that search matches name or identifier, adding semantics the schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List visible projects') plus an optional search on name or identifier, so the agent knows exactly what it returns. It does not differentiate itself from the sibling get_project or list_my_project_access, leaving the single-vs-bulk choice implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The closing sentence 'Page until next_offset is null' is a concrete usage instruction and the search parameter is framed as optional. However, there is no explicit when-to-use guidance against the many sibling list/get tools (get_project, get_my_project_access, list_project_memberships), so the choice 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_project_storagesA
Read-onlyIdempotent

List a project's links to configured external file storages, optionally filtered to one project.

Read-only in OpenProject's API -- no create/update/delete endpoint exists for this resource; manage the underlying connection with the storages tools instead.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: created_at, id, project, project_folder_mode, project_id, storage_id, storage_name, updated_at.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description's extra disclosure is the domain fact that the API exposes no mutation endpoint at all for this resource. That is useful context beyond the annotations, though nothing is said about pagination behavior or result shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and scope. The parenthetical qualifier about filtering to one project is slightly redundant with the tool name but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter read-only list tool with no output schema and rich annotations, the description supplies the essential scoping and safety context. Return shape and pagination are covered by the schema's limit/offset semantics and the select field, so no significant gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All four parameters carry full schema descriptions (100% coverage), so the schema does the heavy lifting for limit, offset, select, and project. The description adds only the notion of an optional project filter and no syntax or matching details beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and a precise resource (a project's links to configured external file storages), and clarifies the optional project filter. It doesn't explicitly name the singular sibling get_project_storage, so sibling differentiation rests on the list/get convention rather than on the text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tells the agent explicitly that there is no create/update/delete endpoint for this resource and that connection management belongs to the storages tools, which is a genuine when-not cue. The alternative is named only as a generic tool family, not a specific tool, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recurring_meeting_occurrencesA
Read-onlyIdempotent

List virtual occurrences of a recurring meeting.

Requires OpenProject 17.4+.

filter: one of "upcoming", "past", "cancelled", "open". Occurrences are virtual (synthesized from the recurrence rule) except where a real Meeting has already been materialized via init_recurring_meeting_occurrence; this list has no offset/pagination, unlike list_meetings/list_recurring_meetings.

NameRequiredDescriptionDefault
limitNoNumber of occurrences, only for filter="upcoming" (OpenProject default: 20); the other filters return their full set. Not paged.
filterNoupcoming
recurring_meeting_idYesRecurring meeting series id, from list_recurring_meetings.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, but the description still adds real behavioral context: occurrences are synthesized from the recurrence rule except where a real Meeting was materialized, and the result set is unpaged with no offset. It doesn't describe return shape or ordering, but the virtualization caveat is the non-obvious part.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then prerequisite, then the filter vocabulary, then the virtualization/pagination caveat. Every line conveys information not present in annotations or schema; nothing is repeated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description covers prerequisites, filter semantics, virtualization, and pagination behavior. It could go one step further and say what an occurrence object minimally contains (id, start/end, cancelled flag) or how a materialized occurrence is signaled, which matters when chaining to get_meeting or init_recurring_meeting_occurrence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the 'filter' property has no description or enum in the schema, so the description carries the enumeration ('upcoming', 'past', 'cancelled', 'open'), which is essential. It also documents in prose that limit applies only to filter=upcoming and that other filters return the full set, matching the schema's limit description and reinforcing it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List virtual occurrences of a recurring meeting') and immediately differentiates the scope from the sibling list tools: this returns occurrences of one series, not meetings or series themselves. An agent can pick this over list_meetings/list_recurring_meetings 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete usage context: the OpenProject 17.4+ requirement, the four valid filter values, and the note that this list has no offset/pagination unlike list_meetings/list_recurring_meetings. What's missing is an explicit 'use this when you need future/past occurrences of an existing series' framing and any guidance on when to materialize via init_recurring_meeting_occurrence instead of just listing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recurring_meetingsA
Read-onlyIdempotent

List OpenProject recurring meeting series, optionally scoped to a project.

Requires OpenProject 17.4+.

Omit project to list across all readable projects.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds two things the annotations don't: a minimum server version (OpenProject 17.4+) and the implicit permission scoping ('readable projects') that governs what the result set contains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action, then the version gate, then the scoping rule. No filler and nothing buried mid-paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paginated read-only list tool with 100% schema coverage and full annotations, the description covers purpose, version gate, and scoping. The only gap is the result shape (fields returned per series), which is not documented anywhere since there is no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so limit and offset are self-documenting and the baseline would be 3. The description earns an extra point by explaining the semantic effect of passing null for 'project' — a cross-project listing — which the schema's 'Project identifier, id, or name' line does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List OpenProject recurring meeting series') with the scope modifier 'optionally scoped to a project'. It is distinguishable from get_recurring_meeting, but it never explicitly differentiates itself from list_recurring_meeting_occurrences or list_meetings, which an agent must infer from names alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Omit project to list across all readable projects' gives a clear decision rule for the main branching choice in how to call it, and the 17.4+ requirement signals a precondition. It stops short of naming alternatives (e.g. list_recurring_meeting_occurrences) or stating when this is the wrong tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_relationsA
Read-onlyIdempotent

List all relations across the instance, optionally filtered by type (e.g. 'blocks', 'follows').

type/from_id/to_id reflect how OpenProject actually stored the relation (it does not change depending on which work package's relations you're viewing), which can differ from how it was originally requested; OpenProject canonicalizes some relation types at creation time (e.g. a relation requested as 'precedes' is stored as 'follows' with from_id/to_id swapped; see create_work_package_relation). Filtering by relation_type matches the stored (canonical) type, not necessarily the type a caller originally requested when creating it.

Each result's queried_perspective field is always null here; a caller-relative reading needs one anchor work package to read the relation FROM, and this instance-wide listing has none. Use get_work_package_relations instead when you need queried_perspective populated.

total is only the count of allowed relations returned on THIS page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: description, description_length, description_truncated, from_id, from_subject, id, queried_perspective, to_id, to_subject, type.
relation_typeNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read/idempotent/non-destructive, yet the description still adds substantial non-obvious behavior: OpenProject canonicalizes relation types at creation, so relation_type filters on the stored type; queried_perspective is always null here; and 'total' counts only this page because the search short-circuits. These are exactly the traits an agent needs before trusting results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the sibling alternative are front-loaded, then the nuances follow in order of consequence (canonicalization, perspective, total semantics). Dense but every paragraph carries a distinct, load-bearing caveat; only slight trimming would improve it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by explaining return-value semantics: queried_perspective is always null, total is page-scoped, and pagination terminates on next_offset null. Nothing an agent needs in order to call it or interpret results is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 75% schema coverage, limit/offset/select are documented in the schema, but relation_type has no schema description and the description rescues it by explaining that filtering matches the stored canonical type, not the originally requested type. That is meaningful added semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope ('List all relations across the instance, optionally filtered by type') and immediately distinguishes itself from the sibling get_work_package_relations. An agent can tell what this does and what it isn't 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'Use get_work_package_relations instead when you need queried_perspective populated.' It also gives the pagination rule ('Page until next_offset is null'), which tells the agent how to consume the tool correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_remindersA
Read-onlyIdempotent

List the current user's active reminders across all work packages. Requires OpenProject 16.1+.

NameRequiredDescriptionDefault
selectNoFields to return; a requested unset field comes back as null. Allowed: creator, id, note, remind_at, work_package_id.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful behavioral context with the active-reminder filter and OpenProject 16.1+ requirement, but it does not cover ordering, pagination, or return behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the core purpose and followed by a necessary version prerequisite. No wasted wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple zero-required-parameter list tool with annotations covering safety, the description supplies the main scope and version requirement. The allowed return fields are documented in the schema, though return ordering or pagination is not described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single optional select parameter is fully documented in the schema. The description adds no parameter-specific semantics, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: listing the current user's active reminders, scoped across all work packages. The scope and filter are clear enough to distinguish it from create/update/delete reminder siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the usage context by saying it lists the current user's active reminders across all work packages, but it does not explicitly state when to use this tool versus related reminder mutation tools or other work-package listing tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_rolesB
Read-onlyIdempotent

List OpenProject roles visible to the current user.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: id, name.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds only the permission-scoping note; it says nothing about pagination behavior, result ordering, or what a role record contains, leaving gaps that don't matter much for a trivial read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short, front-loaded sentence with zero waste. It is efficient, though minimal enough that it borders on under-specified rather than maximally informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list with fully documented pagination params and no output schema, the description is minimally sufficient, but it never hints at the shape of returned roles or whether pagination continuation is needed, which an agent must discover from the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — limit, offset, and select are all documented inline, including the 1-based offset and allowed select fields. The description adds nothing beyond that, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list roles) and adds the scoping qualifier 'visible to the current user'. It is distinguishable from nearby lookup siblings like list_capabilities or list_actions, though it doesn't explicitly name what separates it from those.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'visible to the current user' phrasing implies the access scope but gives no explicit when-to-use, prerequisites, or alternative tool. An agent must infer that this is the lookup to call before assigning or filtering by role.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sprintsA
Read-onlyIdempotent

List Backlogs sprints, optionally filtered by name search.

Omit project to list every sprint visible to the current token across all projects; pass it to list only sprints for that project.

Requires the OpenProject Backlogs module and OpenProject 17.3 or newer; unavailable instances return a clear not-found message.

total is only the count of allowed sprints returned on THIS page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
searchNo
selectNoFields to return; a requested unset field comes back as null. Allowed: created_at, defining_workspace, defining_workspace_id, finish_date, id, name, start_date, status, updated_at.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnly/idempotent annotations already covering the safety profile, the description adds real context beyond them: Backlogs module and OpenProject 17.3 prerequisites, the behavior on unsupported instances (clear not-found), and the caveat that total reflects only the current page because the search short-circuits. That is exactly the kind of non-obvious behavior 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action in the first line, then prerequisites, then pagination semantics. Efficient overall, though the explanation of why total is inexact is slightly wordy for the value it adds.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, so spelling out total and next_offset semantics is necessary and done well, and select's allowed fields cover the return shape. Environment prerequisites are covered; only per-field return detail is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so limit/offset/select are already documented. The description still adds meaning for project (omitted = cross-project listing) and for search (name matching) — the two parameters the schema leaves bare — plus the next_offset paging contract.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: "List Backlogs sprints, optionally filtered by name search." Scope is clear and it is distinguishable from get_sprint (single) and list_backlog_buckets (different resource), though those siblings are never named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the when-to-use rule for the project parameter: omit it to list every sprint visible to the token across all projects, pass it to scope to one project. It also gives pagination guidance ("Page until next_offset is null") but doesn't point to an alternative tool for single-sprint lookups or other listing facets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_statusesA
Read-onlyIdempotent

List all available work package statuses.

Read-only: statuses cannot be created or modified via the OpenProject API (Community Edition); configure them in the web admin UI.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that by explaining *why* it is read-only: statuses are not creatable or modifiable through the API in Community Edition and must be configured in the admin UI, which prevents an agent from hunting for a create_status tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste: the operation first, then the read-only constraint. Front-loaded and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter enumeration tool this is essentially complete, and the read-only constraint closes the obvious gap. A brief note on what a status record contains (identifier, name, color) would make it fully self-sufficient, but with no output schema and trivial complexity the omission is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so parameter semantics are a non-issue and the baseline is 4. Nothing in the description conflicts with the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (work package statuses) with the scope 'all available'. It is clearly distinct from mutating siblings, though it doesn't explicitly differentiate itself from the singular get_status sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (enumerating statuses for filtering/selection) and redirects the write case to the web admin UI, which is genuine guidance. However it never states when to use this versus get_status or why an agent would pick one over the other.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_time_entriesA
Read-onlyIdempotent

List time entries with optional project, work package, user, and date filters.

total is only the count of allowed time entries returned on THIS page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

include_total_hours=true sums hours (as an ISO 8601 duration) across every matching entry, independent of limit/offset; this runs its own full walk of the filtered collection (bounded; see total_hours_truncated), since OpenProject has no server-side sum for time entries (unlike list_work_packages's include_sums). Leave false unless the total is actually needed: it costs extra requests on top of the page this call already returns.

NameRequiredDescriptionDefault
userNo
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: activity, comment, comment_length, comment_truncated, created_at, end_time, entity_id, entity_name, entity_type, hours, id, ongoing, project, spent_on, start_time, updated_at, user, user_id.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.
spent_on_toNo
spent_on_fromNo
work_package_idNoWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.
include_total_hoursNo

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/idempotent annotations: it explains that total is page-scoped because the search short-circuits, that include_total_hours performs an independent bounded full walk, that results can be truncated (total_hours_truncated), and that OpenProject has no server-side sum. This is exactly the cost/behavior context an agent needs before toggling the flag.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, then the caveats follow in a logical order. The prose is slightly dense (multi-line wrapping, a parenthetical aside about OpenProject's lack of server-side sums) but each sentence carries real information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 9 optional params, no output schema, and only partial schema coverage, the description does the heavy lifting on paging, totals, and cost trade-offs. The main remaining gap is return-shape guidance for fields outside the select enum and the filter-value formats for user and spent_on dates.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 56%, and the description closes the biggest gap by fully specifying include_total_hours semantics and the offset/next_offset paging contract. It does not clarify the user parameter (id vs login vs name) or the accepted date format for spent_on_from/spent_on_to, which the schema also leaves bare.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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 filter dimensions (project, work package, user, date). It implicitly distinguishes itself from list_work_packages by contrasting include_total_hours with that tool's include_sums, though it never explicitly says when to pick it over get_time_entry or execute_query.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete operating guidance: page until next_offset is null, and leave include_total_hours false unless a true total is actually needed because it triggers an extra full walk. Missing only routing advice versus sibling read tools for time entries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_time_entry_activitiesB
Read-onlyIdempotent

List available time entry activities.

NameRequiredDescriptionDefault

No parameters

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered elsewhere. The description adds essentially nothing beyond them: no note on whether the list is global vs project-scoped, whether it can change between calls, or how many items to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler or redundancy. It is efficient, though arguably it errs toward under-specification rather than being genuinely complete.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description should say what an 'activity' object contains and how it is used (e.g., as the activity id when creating a time entry). That critical linkage to create_time_entry/update_time_entry is entirely absent, leaving the agent to guess the return shape and purpose of the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema is fully described, so there is nothing for the description to compensate for. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('List ... time entry activities'), so an agent knows it enumerates reference/lookup values rather than returning time entries. It does not, however, contrast itself with nearby siblings like list_time_entries or list_types, which could also look like 'lists of things to pick from'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus list_time_entries, get_time_entry, or create_time_entry — the obvious use case (fetching valid activity values before creating/updating a time entry) is left to inference. Only the word 'available' hints at a lookup role.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_typesA
Read-onlyIdempotent

List all available work package types, optionally filtered by project.

Read-only: types cannot be created or modified via the OpenProject API (Community Edition); configure them in the web admin UI.

NameRequiredDescriptionDefault
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, but the description adds genuinely new context: types cannot be created or modified via the API in Community Edition and must be configured in the web admin UI. That prevents a whole class of wrong calls. Return format/pagination is not covered, keeping it below 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Effectively two sentences with no filler: the action and scope come first, then the read-only caveat that prevents misuse. Every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A one-optional-parameter lookup with no output schema and rich annotations needs no more than this; purpose, filtering semantics, and the immutability constraint are all present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one optional parameter, and the schema fully documents it (id, identifier, name, or unique partial match). The description's 'optionally filtered by project' adds nothing beyond that, so the baseline 3 for full schema coverage applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('List all available work package types') with an explicit optional scope ('optionally filtered by project'). It does not explicitly contrast with the sibling get_type, but the list-vs-get distinction is clear from the verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tells the agent when the project argument matters (narrowing to one project) and adds a decisive constraint: types are read-only via the API, so do not attempt to create/modify them. No explicit exclusions or named alternatives, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_versionsA
Read-onlyIdempotent

List versions globally or for a specific project, optionally filtered by a case-insensitive name substring.

Without project, total is only the count of allowed versions returned on THIS page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
searchNo
selectNoFields to return; a requested unset field comes back as null. Allowed: created_at, defining_project, description, description_length, description_truncated, end_date, id, name, sharing, start_date, status, updated_at.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent), and the description adds genuinely non-obvious behavior: without a project the returned total is only page-local because the search short-circuits once it has enough results. That is exactly the kind of trait 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose in the first sentence, then a second paragraph dedicated to the pagination/total caveat. Every sentence carries information, though the caveat paragraph is dense and could be split for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description helpfully discloses the shape of results (a 'total' plus 'next_offset' pagination handle), which is the key return-value fact an agent needs. Fields of a version are enumerated in the select parameter, so remaining gaps are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so the baseline is 3, but the description adds meaning the schema lacks: the 'search' parameter is a case-insensitive name substring, and 'project' accepts id, identifier, or a unique name fragment (the schema also says this). It does not elaborate on limit/select, hence not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List versions') plus two scoping modes (global vs. per-project) and the optional filter. An agent can immediately distinguish this from the singular get_version or the mutating create_version/update_version siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage context: pass project to scope, search for a case-insensitive substring, and 'Page until next_offset is null' tells the caller how to iterate. It stops short of explicitly contrasting with get_version or other listing tools, but the operating instructions are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_viewsA
Read-onlyIdempotent

List saved OpenProject views, optionally filtered by project, view subtype, or name search.

total is only the count of allowed views returned on THIS page, not a full count of all matches; the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null.

NameRequiredDescriptionDefault
typeNo
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
searchNo
selectNoFields to return; a requested unset field comes back as null. Allowed: created_at, id, name, project, project_id, public, query, query_id, starred, type, updated_at.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the readOnly/idempotent/openWorld annotations by disclosing a real behavioral gotcha: 'total' is only the count of allowed views on the current page because the search short-circuits, and callers must loop on next_offset. It doesn't discuss visibility/permission scoping beyond the passing word 'allowed'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and the caveat follows. The explanation of why total is approximate is slightly wordy ('would need an extra full walk') but that detail earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only paginated list tool with no output schema, it covers the two things an agent most needs: how to terminate pagination and why the total field is misleading. The only gap is the undefined value space of the 'type' filter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Coverage is 67%, and the description only re-characterizes 'project' and 'type' in prose ('project', 'view subtype', 'name search') without stating semantics the schema lacks — notably what values 'type' accepts, since there is no enum. Schema already documents limit, offset, and select, so the baseline 3 holds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('List saved OpenProject views') plus the available filter axes. It is clearly distinguishable from get_view (singular fetch) but never explicitly routes the agent between them or against list_grids.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Filtering options and the pagination directive ('Page until next_offset is null') imply how to use it, but there is no explicit when-to-use/when-not or named alternative such as get_view when the id is already known.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_work_package_attachmentsA
Read-onlyIdempotent

List attachments on a work package.

include_total_size=true sums file_size_bytes across every attachment (independent of limit/offset); OpenProject's attachments endpoint always returns the full list in one response, so this costs no extra request in the common case. Null if file_size_bytes is hidden by server configuration, rather than leaking it indirectly through a sum.

include_images=true also reads the listed PNG/JPEG/GIF/WebP attachments and returns them as images the model can see, appended after the list. One shared byte budget covers the whole call (OPENPROJECT_ATTACHMENT_CONTENT_MAX_BYTES, 5 MB by default), taken in listing order; every attachment that was not inlined is reported in images with its reason. Use get_attachment_content for one specific attachment, or for text content.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: author, container_id, container_type, content_type, created_at, description, download_url, file_name, file_size_bytes, id, status, title.
include_imagesNo
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.
include_total_sizeNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, yet the description adds substantial context: the endpoint returns the full list so summing costs no extra request, the sum is null rather than leaking a hidden file size, and image inlining draws from a shared 5 MB budget in listing order with each skipped attachment reported with a reason. These are genuine behavioral traits an agent could not infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in one sentence, and each subsequent paragraph maps to a capability an agent might invoke. The include_images paragraph is dense but every clause (budget, default, order, skipped-attachment reporting) carries operational weight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still explains the notable return behaviors (the images array, per-attachment skip reasons, null total size). It does not describe the base list item shape, but the select parameter enumerates those fields in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The two flags with no schema description (include_images, include_total_size) get full semantics including defaults, budget, ordering, and null behavior. That meaningfully exceeds the 67% schema coverage where those parameters are bare booleans.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('List attachments on a work package') that is unmistakably distinct from the content-fetching siblings, and later names get_attachment_content as the single-attachment path. An agent knows exactly what this returns 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to get_attachment_content 'for one specific attachment, or for text content', which is the key alternative. It also conditions the two optional flags on what the caller wants (total size, inlined images). It stops short of stating outright exclusions, but the alternative selection is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_work_package_cost_entriesA
Read-onlyIdempotent

List all cost entries recorded against a work package.

Returns every cost entry for the work package in one call -- this endpoint is unpaginated on OpenProject's side (no offset/limit parameters exist).

NameRequiredDescriptionDefault
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds a genuinely useful behavioral fact beyond them: the endpoint is unpaginated server-side, warning the agent that the response may be large and that paging parameters do not exist. It stops short of describing response size limits or rate behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and followed by the one non-obvious caveat. Nothing is redundant with the schema or the annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with full annotation coverage, the description tells the agent what it gets (every cost entry for one work package, in one unpaginated call) and what to pass. The remaining gap is that no output schema exists and the shape of a cost entry (amount, cost type, dates) is never described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 100% and only one parameter, the schema already explains that work_package_id accepts an integer id or a display id like "PROJ-51" and not the bare number. The description adds nothing on top of that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource — list all cost entries recorded against a work package — so an agent can tell this is a per-work-package cost listing. It does not, however, distinguish itself from close siblings such as get_work_package_costs_by_type (aggregated by type) or get_cost_entry (single record), which an agent could easily confuse.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance and no named alternative. The only usage-relevant signal is the note that the endpoint is unpaginated, which implies 'do not bother with offset/limit' but does not tell the agent when to choose this over the costs-by-type or single-entry siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_work_package_github_pull_requestsA
Read-onlyIdempotent

List all GitHub pull requests linked to a work package.

Returns every linked pull request in one call -- this endpoint is unpaginated on OpenProject's side (no offset/limit parameters exist). An empty result can mean either no pull requests are linked, or the GitHub App integration isn't configured on this instance; OpenProject's API does not distinguish these cases.

NameRequiredDescriptionDefault
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantive behavior the annotations cannot convey: the endpoint is unpaginated (no offset/limit), returns everything in one call, and an empty result conflates 'nothing linked' with 'GitHub App integration not configured'. This is exactly the kind of trap an agent needs disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose in the first sentence, then supplies only the two non-obvious facts (unpaginated, empty-result ambiguity). Every sentence earns its place with no restatement of the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still communicates return cardinality and the empty-case meaning, which is the highest-risk unknown. It does not describe the fields of a returned pull request, but that is a minor residual gap for a simple read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the work_package_id description already covers both integer ID and display-ID forms, so the description correctly defers to the schema. It adds no parameter meaning of its own, which is the baseline case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: list GitHub pull requests linked to a work package, with the scope ('all linked') made explicit. It is distinguishable from get_github_pull_request and the GitLab siblings by resource name, but no sibling is named directly as an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the phrasing — call this to enumerate PRs attached to a given work package — but it never states when to prefer it over get_github_pull_request or how to proceed when the result is empty beyond noting the ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_work_package_gitlab_issuesA
Read-onlyIdempotent

List all GitLab issues linked to a work package.

Returns every linked issue in one call -- this endpoint is unpaginated on OpenProject's side (no offset/limit parameters exist). An empty result can mean either no issues are linked, or the GitLab integration isn't configured on this instance; OpenProject's API does not distinguish these cases. No single-item get_gitlab_issue tool exists because no such endpoint exists upstream -- only this work-package-scoped list.

NameRequiredDescriptionDefault
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantive behavior beyond annotations: results are complete in one call with no pagination, and an empty list is ambiguous because an unconfigured GitLab integration and a genuinely unlinked work package are indistinguishable in OpenProject's API. That is exactly the kind of caveat an agent needs and that readOnlyHint/idempotentHint 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the core action, and each subsequent sentence carries a distinct non-obvious fact (no pagination, empty-result ambiguity, no single-item endpoint). Zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with full annotation coverage, the description covers invocation and interpretation caveats well. Its only gap is that no return shape is described and there is no output schema, so the agent doesn't know what fields each linked issue carries.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema description coverage is 100%, so the schema already documents the integer-or-display-id ('PROJ-51') distinction. The description adds nothing further about the parameter, which is acceptable at this coverage level but earns only the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all GitLab issues linked to a work package') and explicitly rules out sibling shapes by noting no single-item get_gitlab_issue endpoint exists upstream. An agent can tell this apart from the nearest siblings (list_work_package_gitlab_merge_requests, list_work_package_github_pull_requests) on the resource alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational context: the call is unpaginated, so no offset/limit should be attempted, and it explains that the tool is the only available shape for this resource. It does not explicitly address when to prefer the merge-request/GitHub-PR siblings, so it stops just short of naming alternatives the way a 5 would.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_work_package_gitlab_merge_requestsA
Read-onlyIdempotent

List all GitLab merge requests linked to a work package.

Returns every linked merge request in one call -- this endpoint is unpaginated on OpenProject's side (no offset/limit parameters exist). An empty result can mean either no merge requests are linked, or the GitLab integration isn't configured on this instance; OpenProject's API does not distinguish these cases. No single-item get_gitlab_merge_request tool exists because no such endpoint exists upstream -- only this work-package-scoped list.

NameRequiredDescriptionDefault
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses important behavior: the endpoint is unpaginated, an empty result can mean either no links or missing GitLab integration, and there is no single-item alternative upstream. These details materially affect how an agent interprets results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then adds only high-value caveats. Each sentence earns its place by clarifying pagination, empty-result ambiguity, or upstream limitations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

It covers the operational context needed to call the tool, including pagination and ambiguous empty results. However, with no output schema, it does not describe the shape of the returned merge request objects, leaving a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the work_package_id parameter is already well documented in the schema, including the display-id format. The description adds no additional parameter semantics 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb, resource, and scope: list GitLab merge requests linked to a work package. It clearly distinguishes itself from sibling tools such as list_work_package_github_pull_requests and list_work_package_gitlab_issues by provider and resource type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It establishes that this is a work-package-scoped list and explains that no single-item GitLab merge request tool exists because no upstream endpoint exists. It does not explicitly state when not to use it or name sibling alternatives, but the usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_work_package_meeting_agenda_itemsA
Read-onlyIdempotent

List the agenda items, across all meetings, that link a work package.

Requires OpenProject 17.7+.

Items of meetings in projects outside OPENPROJECT_READ_PROJECTS are left out.

This list is unpaginated server-side; offset/limit are applied client-side by this MCP.

text_limit caps each item's notes at that many characters (default: the server's configured OPENPROJECT_TEXT_LIMIT, NOT unlimited). When text is cut, notes_truncated is true and notes_length reports the real length.

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: author, created_at, duration_in_minutes, id, item_type, lock_version, meeting_id, meeting_section_id, notes, notes_length, notes_truncated, outcome_ids, position, presenter, title, updated_at, work_package_id.
text_limitNo
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds non-obvious behavior on top: the list is unpaginated server-side with offset/limit applied client-side by the MCP, and text is truncated by default at the server's OPENPROJECT_TEXT_LIMIT with notes_truncated/notes_length signaling real length. These are exactly the traits an agent could otherwise misread from the schema's 'page number' wording.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with scope and version requirement, then constraints, then the truncation caveat — good ordering with little waste. Slight deduction for awkward mid-sentence line breaks that split clauses ('offset/limit are applied / client-side') and a trailing blank line that add noise without content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must carry the return-value burden, and it does: truncation flags, the text_limit default, and the fact that paging is client-side are all disclosed, while the select enum enumerates available fields. Version and permission gating round out what an agent needs to call it correctly and interpret empty results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 80% schema coverage the baseline is 3, and the description earns more by fully explaining text_limit, the one parameter the schema leaves undocumented, including its non-obvious default (server-configured limit, NOT unlimited) and the truncation signaling fields. It also clarifies that offset/limit are client-side, which reinterprets the schema's 'Page size' and '1-based page number' language.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (agenda items) with an explicit scope qualifier: 'across all meetings, that link a work package.' That scope phrase is exactly what separates it from the sibling list_meeting_agenda_items, which is meeting-scoped, so an agent can pick the right one 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives useful preconditions ('Requires OpenProject 17.7+') and a visibility exclusion (items in projects outside OPENPROJECT_READ_PROJECTS are omitted), which help an agent decide whether results are trustworthy. However, it never names an alternative (e.g. list_meeting_agenda_items for a single meeting) or states when-not-to-use, so routing is inferred rather than instructed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_work_package_reactionsA
Read-onlyIdempotent

List emoji reactions across a work package's comment activities.

One row per comment and reaction, without the activity id, so a reaction can repeat.

NameRequiredDescriptionDefault
selectNoFields to return; a requested unset field comes back as null. Allowed: count, emoji, reaction, users.
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, so safety is covered. The description adds real value beyond them by explaining the row shape ('one row per comment and reaction, without the activity id, so a reaction can repeat'), warning the agent not to treat repeated rows as duplicates. It does not mention ordering or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and followed by the one non-obvious output detail. No filler or repetition of the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with full annotations and full schema descriptions, the description covers the main ambiguity an agent would hit (duplicate-looking rows). Minor gaps remain on ordering and whether reactions span non-comment activities, but nothing blocks correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already explains work_package_id formats and the allowed select fields. The description adds nothing parameter-specific, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: listing emoji reactions scoped to a work package's comment activities. An agent can tell it apart from mutation siblings like toggle_activity_emoji_reaction by the 'List' verb, though the description never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the read-only framing; there is no statement of when to call this versus toggle_activity_emoji_reaction or get_work_package_activities. An agent must infer that this is the read path for reaction data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_work_packagesA
Read-onlyIdempotent

List work packages with structured filters and no free-text query requirement.

project accepts a numeric ID, exact identifier/slug, or project name; the parameter is named project, not project_id. There is no generic filters=[...] parameter; each filter is its own named argument (version, status, assignee, the date filters, etc.), listed below.

version_status filters by the status of a work package's assigned version: one of 'open', 'closed', or 'locked'. It requires OpenProject 16.4 or newer. A work package with several target versions matches version and version_status when any one of them matches.

assignee filters by any user (username, id, or "me"). assignee_me takes precedence.

status/priority filter by exact OpenProject status/priority name or numeric ID (case-insensitive), not meta-values like 'open'/'closed'; set open_only=true to restrict results to not-closed work packages instead.

Date filters accept YYYY-MM-DD format:

  • created_on/updated_on/due_on: exact date match

  • created_between/updated_between/due_between: inclusive date range [start, end] Cannot specify both _on and _between for the same field.

overdue_only=true restricts results to work packages with due_date before today that are not closed (OpenProject's own overdue? predicate; there is no dedicated overdue API filter, this composes a relative date filter with the open-status meta-filter). due_within_days=N restricts to due_date in [today, today+N days]. Neither can be combined with each other or with due_on/due_between (all four constrain the same field).

sort_by and group_by are checked against OpenProject's real sortable and groupable work-package columns (the parameters list them with the release each newer column needs); an unknown field raises a ValueError listing the valid set instead of only failing once OpenProject itself rejects the request. A column the instance's release lacks is rejected by OpenProject and the error names the release it needs. Dates, hours, subject, id and the other columns without a value per group sort fine but cannot be grouped by.

select restricts each result row to the given fields (e.g. ["id", "subject", "status"]); an invalid name returns the allowed set. Common fields: id, display_id, subject, type, status, priority, assignee, project, version, parent_id, parent_display_id, start_date, due_date, estimated_time, spent_time, created_at, updated_at, author, category, description, schedule_manually, derived_start_date, derived_due_date, percentage_done, derived_percentage_done, readonly, has_project_attributes, ignore_non_working_days, custom_fields, custom_fields_truncated, custom_comments, custom_comments_truncated. custom_fields/custom_comments are selectable/hideable only as a whole field, not by individual custom-field key (per-key filtering is OPENPROJECT_HIDE_CUSTOM_FIELDS' concern, not select's). parent_display_id is only populated on OpenProject 17.5+ (semantic mode); it stays null on older/classic instances even when parent_id is set.

total is the real matching count only when the query is provably restricted to OPENPROJECT_READ_PROJECTS server-side: scope is unrestricted, an explicit project was given, or (no project, restricted scope) a server-side filter for the resolved allowed project IDs was sent. Otherwise total falls back to this page's item count, and next_offset/truncated are based on whether this page came back full rather than the server's own total, so nothing here ever reveals how many matches exist in projects you can't see. Because of this, total can read 0 while next_offset is still non-null (a restrictive scope filtered out every match on this page, but the raw server page was full); that is not an inconsistency, keep paging via next_offset rather than stopping on a low/zero total. Page until next_offset is null either way.

include_sums=true adds server-computed aggregates instead of requiring client-side pagination and summation: groups (one entry per group_by value, with count and a sums dict of OpenProject's fixed summable fields: estimated_time, story_points, percentage_done, remaining_time, overall_costs, labor_costs, material_costs, plus any custom fields, as raw server-formatted values, e.g. ISO 8601 durations and currency strings) and total_sums (the same shape, across all matches). groups is only populated when group_by is also set; total_sums is populated either way (a sum over the whole filtered result set even without grouping). Same scope-safety rule as total above: groups/total_sums come back null whenever the query cannot be proven restricted to OPENPROJECT_READ_PROJECTS server-side. A group named after a version, sprint or backlog bucket defined in a project that OPENPROJECT_READ_PROJECTS does not cover keeps its count and sums under the label [outside read scope].

Version rollup recipe: group_by="status", version="", include_sums=true returns per-status progress/time sums for one version's work packages, replacing manual pagination + client-side summation.

custom_fields is a dict keyed by the RAW OpenProject key (e.g. "customField12") -- never a friendly name -- with values normalized by shape: plain scalars pass through; link-typed values (list/user/version format) become title-only strings (or a list of titles for a multi-value field), matching every other link field in this response; multi- paragraph "text"-format values are capped like description (this call's effective text_limit); a scalar string/link/date-format value is independently capped at ~255 characters. custom_fields_truncated is true when the dict was capped at 50 entries and/or any individual entry's value was itself capped. custom_comments (keyed the same way, holding a field's freeform comment text) and custom_comments_truncated follow the identical shape and caps, independently -- in practice custom_comments is always empty/null for work packages on OpenProject's stock CE behavior: only Projects opt into per-custom-field comments, work packages do not, so this field is present for forward compatibility only. Combined worst case is roughly 250 KB for custom_fields per work package, always finite regardless of how many custom fields exist or how large their values are. get_work_packages (batch) and list_my_open_work_packages return the same custom_fields/custom_comments shape and caps, since they reuse this same normalization. OPENPROJECT_HIDE_CUSTOM_FIELDS hides individual custom_fields entries by matching ONLY the raw key/wildcard (e.g. "customField12", "customField*") -- unlike the write path, which also accepts the custom field's friendly name, a read-side hide pattern written as a friendly name has no effect.

custom_field_filters filters results by custom field value(s) -- a dict keyed by "cf_" or "customField" (both forms accepted transparently and always normalized to "cf_" on the wire; "cf_" is CustomField#column_name, the actual OpenProject filter key, distinct from "customField" which is the JSON/PATCH key used by custom_fields above -- do not confuse the two). Each entry's value is {"operator": "", "values": [...]}, e.g. {"cf_12": {"operator": "=", "values": ["42"]}}. Learn a field's cf_ id from any prior get_work_package call's custom_fields dict keys (strip the "customField" prefix). Only raw cf_/customField keys are accepted -- friendly-name resolution is not supported (a list/search call has no single project+type context to resolve a name against safely; a friendly name is only meaningful for the write path's per-call project+type schema probe). At most 20 custom-field filters per call, at most 100 values per filter, each value at most 1000 characters.

Legal operators depend on the field's format on this instance -- see docs/filters.md's "Custom-Field Filters" section for the full format-to-operator matrix, verified against OpenProject CE source. This tool validates the key shape and the operator symbol locally (a recognized custom-field operator, not necessarily legal for this specific field's format) and rejects hidden fields (OPENPROJECT_HIDE_CUSTOM_FIELDS) before any network call; an operator/value that is syntactically valid but illegal for the field's actual format is rejected by OpenProject itself with a clear error (surfaced as a ValueError here, not a raw HTTP passthrough) rather than validated client-side against a live schema -- this keeps list/search calls at their existing single-request cost (no per-call schema probe). user/version-format custom-field filters additionally require project to be set (OpenProject only considers project-scoped custom fields of these two formats filterable at all; this is not checked locally -- a global, no-project user/version CF filter fails server-side with an unhelpful "filter not available" error, see docs/filters.md's "Global (no-project) filtering constraint" section).

NameRequiredDescriptionDefault
typeNo
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
due_onNo
offsetNo1-based page number; pass the previous result's next_offset.
selectNoFields to return; a requested unset field comes back as null. Allowed: assignee, author, category, created_at, custom_comments, custom_comments_truncated, custom_fields, custom_fields_truncated, derived_due_date, derived_estimated_time, derived_percentage_done, derived_remaining_time, derived_start_date, description, description_length, description_truncated, display_id, due_date, duration, estimated_time, has_description, has_project_attributes, id, ignore_non_working_days, parent_display_id, parent_id, percentage_done, priority, project, project_phase, readonly, remaining_time, responsible, schedule_manually, spent_time, sprint, start_date, status, subject, target_versions, type, updated_at, version.
statusNo
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.
sort_byNoSort criteria as "field:direction" or "field-direction" (e.g. ["status:desc", "priority-asc"]); the direction defaults to asc. Fields: assigned_to, assignee, author, backlog_bucket, category, created_at, done_ratio, due_date, duration, estimated_hours, estimated_time, id, observed_in_versions, percentage_done, position, priority, project, project_phase, remaining_hours, remaining_time, responsible, sprint, start_date, status, story_points, subject, target_versions, type, updated_at, version, or a custom field's cf_<id>. Newer columns need an OpenProject release: project_phase 16.1+, sprint 17.4+, backlog_bucket 17.6+, target_versions 17.8+, observed_in_versions 17.9+; target_versions is version under its newer name. sprint and backlog_bucket also need the Backlogs module in a project where you may view sprints.
versionNo
assigneeNo
group_byNoOne field to group the results by: assigned_to, assignee, author, backlog_bucket, category, done_ratio, observed_in_versions, percentage_done, priority, project, project_phase, responsible, sprint, status, target_versions, type, version, or a custom field's cf_<id>. Newer columns need an OpenProject release: project_phase 16.1+, sprint 17.4+, backlog_bucket 17.6+, target_versions 17.8+, observed_in_versions 17.9+; target_versions is version under its newer name. sprint and backlog_bucket also need the Backlogs module in a project where you may view sprints.
priorityNo
open_onlyNo
created_onNo
updated_onNo
assignee_meNo
due_betweenNo
include_sumsNo
overdue_onlyNo
version_statusNo
created_betweenNo
due_within_daysNo
updated_betweenNo
custom_field_filtersNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only/idempotent, so the bar is behavioral detail beyond that — and the description supplies a great deal: total/next_offset fallback semantics under OPENPROJECT_READ_PROJECTS scoping (including the counterintuitive total=0 with non-null next_offset case), include_sums shape and null conditions, custom_fields normalization and 50-entry/255-char caps, ~250 KB worst case, local ValueError validation, per-call query limits, and version-gated columns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with purpose and the project parameter caveat, but the body sprawls across many dense paragraphs and repeats material already present in the schema (the sort_by/group_by field lists and release requirements). It also defers key rules to an external 'docs/filters.md' the agent may not have access to, which weakens structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 24-parameter, no-output-schema, high-complexity list tool, the description covers nearly everything an agent needs — filtering semantics, pagination, aggregation, custom-field handling, and failure modes. The main shortfall is reliance on external documentation references for the custom-field operator matrix and the global-filtering constraint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 25% across 24 parameters, so the description must compensate, and it does: it clarifies project accepts name/id/slug (not project_id), status/priority accept exact names or IDs but not meta-values, date format and inclusivity, overdue_only's composed predicate, sort_by/group_by validity checking against real columns, select field behavior, and the full custom_field_filters key/operator/limit contract.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List work packages') and immediately delimits scope with 'structured filters and no free-text query requirement', which distinguishes it from the search_work_packages sibling. An agent can identify the tool's role 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'no free-text query requirement' phrasing implies the alternative is a text-search tool and gives clear context for structured filtering, and conflict rules (due_on vs due_between vs overdue_only, assignee_me precedence) tell the agent how to compose a call. However, it never names search_work_packages or list_my_open_work_packages as alternatives with explicit when-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_work_package_watchersC
Read-onlyIdempotent

List watchers of a work package.

NameRequiredDescriptionDefault
selectNoFields to return; a requested unset field comes back as null. Allowed: id, login, name.
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered elsewhere. The description adds nothing beyond that — no mention of pagination, ordering, or what happens when a work package has no watchers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with zero filler and the key noun phrase front-loaded. It is efficient, though the terseness borders on under-specification rather than optimal conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with full schema coverage and rich annotations, little more is strictly required, and there is no output schema to explain. Still, the description leaves an agent without any sense of result shape or scale (watcher count, ordering), which a slightly richer sentence could have supplied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema itself explains the id-vs-display-id distinction and the allowed select fields. The description contributes no additional parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('List watchers of a work package'), which is unambiguous on its own. It does not differentiate from the related sibling set_work_package_watcher, which an agent might reasonably confuse with it when deciding between reading and mutating watcher state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this rather than set_work_package_watcher, nor any prerequisite or context about permissions needed to view watchers. The usage is only inferable from the tool name, not from the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_work_packagesA
Read-onlyIdempotent

Search work packages by free text, optionally scoped to a project.

search matches only the work package subject and numeric ID (OpenProject's native subject_or_id full-text filter); it does NOT match version, category, description, or other linked-resource fields. To filter by version, use list_work_packages(version=..., project=...) instead.

In parallel with that text/id search, a search shaped like a work package reference (a numeric id or a display id like "PROJ-42", but not a date such as 2026-10-15) is also resolved directly the same way get_work_package does; other text is never looked up as an id. When that resolves to a work package that also satisfies every other filter given here (project/status/assignee/dates/ custom fields/etc.), it's returned separately as exact_match; never folded into results, and never counted toward total/count/pagination, since a single extra item can't be paginated consistently. Absent (not present in the response at all) when nothing resolves, when the resolved item fails a filter, or when it's already present in results via the text match. select applies to exact_match the same way it applies to each results row.

Without project, the search runs globally across every project readable under OPENPROJECT_READ_PROJECTS, not just one project; pass project explicitly to scope results to it.

Set status to restrict results to an exact OpenProject status name or numeric ID, not a meta-value like 'open'/'closed'. Set open_only=true to return only open (not-closed) work packages. Set assignee_me=true to return only work packages assigned to the current user.

assignee filters by any user (username, id, or "me"). assignee_me takes precedence.

priority filters by priority name or numeric ID (case-insensitive).

Date filters, overdue_only/due_within_days, select, pagination (offset/limit/total), include_sums, and each result's custom_fields/custom_comments (raw-key custom-field values/comments, capped and hide-matched exactly as documented) all work exactly as documented on list_work_packages; see that tool's docstring for the full field lists and semantics. sort_by and group_by take the same fields and are described by their own parameters. One difference: total is the real matching count only when scope is unrestricted or an explicit project was given (list_work_packages's server-side allowed-project filter for the no-project+restricted-scope case does not apply here); otherwise total/groups/total_sums fall back to this page's data, same safety guarantee either way.

custom_field_filters filters by custom field value(s); see list_work_packages's docstring for the full parameter documentation (identical shape and semantics on both tools).

NameRequiredDescriptionDefault
limitNoPage size, capped at OPENPROJECT_MAX_PAGE_SIZE.
due_onNo
offsetNo1-based page number; pass the previous result's next_offset.
searchYes
selectNoFields to return; a requested unset field comes back as null. Allowed: assignee, author, category, created_at, custom_comments, custom_comments_truncated, custom_fields, custom_fields_truncated, derived_due_date, derived_estimated_time, derived_percentage_done, derived_remaining_time, derived_start_date, description, description_length, description_truncated, display_id, due_date, duration, estimated_time, has_description, has_project_attributes, id, ignore_non_working_days, parent_display_id, parent_id, percentage_done, priority, project, project_phase, readonly, remaining_time, responsible, schedule_manually, spent_time, sprint, start_date, status, subject, target_versions, type, updated_at, version.
statusNo
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.
sort_byNoSort criteria as "field:direction" or "field-direction" (e.g. ["status:desc", "priority-asc"]); the direction defaults to asc. Fields: assigned_to, assignee, author, backlog_bucket, category, created_at, done_ratio, due_date, duration, estimated_hours, estimated_time, id, observed_in_versions, percentage_done, position, priority, project, project_phase, remaining_hours, remaining_time, responsible, sprint, start_date, status, story_points, subject, target_versions, type, updated_at, version, or a custom field's cf_<id>. Newer columns need an OpenProject release: project_phase 16.1+, sprint 17.4+, backlog_bucket 17.6+, target_versions 17.8+, observed_in_versions 17.9+; target_versions is version under its newer name. sprint and backlog_bucket also need the Backlogs module in a project where you may view sprints.
assigneeNo
group_byNoOne field to group the results by: assigned_to, assignee, author, backlog_bucket, category, done_ratio, observed_in_versions, percentage_done, priority, project, project_phase, responsible, sprint, status, target_versions, type, version, or a custom field's cf_<id>. Newer columns need an OpenProject release: project_phase 16.1+, sprint 17.4+, backlog_bucket 17.6+, target_versions 17.8+, observed_in_versions 17.9+; target_versions is version under its newer name. sprint and backlog_bucket also need the Backlogs module in a project where you may view sprints.
priorityNo
open_onlyNo
created_onNo
updated_onNo
assignee_meNo
due_betweenNo
include_sumsNo
overdue_onlyNo
created_betweenNo
due_within_daysNo
updated_betweenNo
custom_field_filtersNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish this as a safe read-only, idempotent operation, and the description adds substantial behavior beyond that: it explains exact_match handling, exclusion from pagination/total counts, and the fallback behavior for total/groups/total_sums. It also discloses the important limitation that search does not match version, category, description, or other linked fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loads the core search behavior and limitations before explaining exact_match and filter details. Every section adds relevant context for a 22-parameter search tool, though some shared semantics are deferred to list_work_packages rather than fully restated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex search tool with no output schema and many filters, the description covers the essential search behavior, exact_match return contract, pagination caveats, and filter semantics. It relies on list_work_packages for full shared parameter and result documentation, which is reasonable but means the definition is not entirely standalone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 27% across 22 parameters, so the description carries most of the semantic burden. It explains key filters such as search, project scope, status exactness, open_only, assignee/assignee_me precedence, priority matching, and delegates date/pagination/custom-field semantics to list_work_packages; however, not every date parameter format is specified here, so it is not fully self-contained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource, 'search work packages by free text,' and immediately defines the search scope: subject and numeric ID only. It also distinguishes this tool from list_work_packages for version filtering, so an agent can choose correctly 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly names the alternative for version filtering, explains global vs project-scoped searching, clarifies status must be an exact name or ID rather than a meta-value, and covers assignee/assignee_me precedence. These are concrete when-to-use and when-not-to-use instructions rather than implied guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_project_favoriteA
DestructiveIdempotent

Mark or unmark a project as a favorite. Requires OpenProject 17.0 or later.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.
favoriteYestrue adds the project to favorites, false removes it.

Output Schema

NameRequiredDescription
readyYes
stateYes
actionYes
messageYes
projectYes
project_idYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is carried by structured data. The description adds a meaningful version gate, but it omits the two-phase preview-then-apply workflow, which is the single most important behavioral trait for a mutation tool flagged destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, purpose front-loaded, prerequisite second. Nothing superfluous and nothing buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 version gate is covered. But for a mutation tool annotated as destructive and idempotent, the description should surface the preview/approval requirement rather than leaving it entirely to the schema's confirm field.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%; all three parameters—including the confirm preview semantics and the flexible project identifier matching—are fully documented in the schema. The description adds nothing beyond that, which is acceptable at the baseline, but there is no extra semantic value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair and resource ('mark or unmark a project as a favorite'), so the agent knows exactly what the tool changes. No sibling tool covers favorites, so the absence of explicit sibling differentiation is not harmful, but it also isn't addressed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The version prerequisite ('Requires OpenProject 17.0 or later') is a genuine usage condition and a useful one. However, the description gives no guidance on when to prefer this over project update flows, and—most importantly—it never mentions the preview/confirm step that the schema's confirm parameter enforces.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_work_package_watcherA
DestructiveIdempotent

Add/remove a watcher on a work package.

watching=true adds the watcher; watching=false removes it. The two previews are NOT symmetric: watching=true's preview looks up and returns the user's summary (result is populated; whether the user already watches is not checked); watching=false's preview makes no extra lookup and always returns result=null.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
user_idYes
watchingYes
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

Output Schema

NameRequiredDescription
readyYes
stateYes
actionYes
resultYes
messageYes
watcher_user_idYes
work_package_idYes
validation_errorsYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive=true, idempotent=true, openWorld=true, and readOnly=false. The description adds useful behavior beyond those annotations by documenting the asymmetric preview results and that the add-preview does not check whether the user already watches.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded, with the core operation stated first and the preview asymmetry explained in the following sentences. Every sentence carries relevant behavioral information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 annotations cover the safety profile. The description is nearly complete for invocation, but it omits the meaning of `user_id` and does not repeat the confirmation/approval requirement that appears in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%; `confirm` and `work_package_id` are described in the schema, while `watching` gets clear semantic detail from the description. The required `user_id` parameter remains undocumented in both the schema and the description, so the description only partially compensates for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: add/remove a watcher on a work package. It is clearly distinguishable from the list_work_package_watchers sibling, though it does not explicitly name that or any other sibling as an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains how the `watching` flag works (true adds, false removes) and warns about asymmetric preview behavior. However, it gives no explicit guidance on when to use this tool versus viewing watchers or other alternatives, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

toggle_activity_emoji_reactionA
Destructive

Toggle an emoji reaction on a work package comment activity.

Adds the reaction if absent, removes it if already present. reaction is one of: thumbs_up, thumbs_down, grinning_face_with_smiling_eyes, confused_face, heart, party_popper, rocket, eyes.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
reactionYes
activity_idYes

Output Schema

NameRequiredDescription
readyYes
stateYes
actionYes
resultYes
messageYes
reactionYes
activity_idYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description explains the conditional mutation: it adds the reaction if absent and removes it if present. This usefully clarifies why destructiveHint is true and idempotentHint is false, though it does not mention permission requirements or the preview behavior that is covered by the confirm parameter schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the exact action, followed by a concise explanation of toggle behavior and the allowed reaction values. Every sentence and the value list add useful information without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is largely complete for a three-parameter mutation tool: it covers purpose, toggle behavior, and reaction values, while annotations cover safety and the schema covers confirm preview behavior. The main remaining gap is that activity_id is not explained in either the description or the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description compensates for the missing enum on reaction by listing all accepted emoji values. However, activity_id remains undocumented, and confirm is only described in the schema; with 33% schema description coverage, this is adequate but incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Toggle an emoji reaction on a work package comment activity.' This clearly identifies the action and target, though it does not explicitly distinguish itself from the read-only sibling list_work_package_reactions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The toggle semantics imply when the tool is useful, but the description provides no explicit when-to-use guidance, prerequisites, or comparison to sibling tools such as list_work_package_reactions. The important confirm/preview workflow is only documented in the schema, not in the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_boardB
Destructive

Update a saved OpenProject board/query.

Omitted fields stay unchanged; a given list replaces the stored one.

NameRequiredDescriptionDefault
nameNoBoard name, at most 255 characters.
hiddenNoIgnored by OpenProject; the value is not stored.
publicNoVisible to other users; false keeps it to its creator.
columnsNoColumn attribute ids (e.g. "id", "subject") or /api/v3/queries/columns/ hrefs.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
filtersNoOpenProject query filter objects, sent unchanged, e.g. {"_links": {"filter": {"href": "/api/v3/queries/filters/status"}, "operator": {"href": "/api/v3/queries/operators/o"}, "values": []}}.
projectNoProject identifier, id, or name; a unique part of a name or identifier also matches.
sort_byNoSort criteria, each "field:direction" or "field-direction" (e.g. "id:asc"), a bare field (ascending), or a /api/v3/queries/sort_bys/ href; the direction is case-insensitive.
starredNoMark as a favorite query.
board_idYesBoard (saved query) id, from list_boards.
group_byNoGroup-by attribute id (e.g. "status") or its /api/v3/queries/group_bys/ href.
show_hierarchiesNoShow parent/child tree; cannot combine with group_by, so it defaults to false there.
timeline_visibleNoShow the Gantt timeline.
include_subprojectsNoAlso show work packages of subprojects.
highlighted_attributesNoColumn ids or hrefs whose values are highlighted.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true; the description adds one genuinely useful behavioral trait beyond them — that list fields are replaced wholesale rather than merged. However, it never mentions the preview/confirm approval gate defined in the schema, which is important for a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with what the tool does and immediately followed by the most consequential semantic. Nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 15 parameters and a destructive mutation profile, the description is thin: it covers the merge/replace rule but says nothing about the confirm-preview workflow, permission/auth expectations, or irreversibility. The rich schema compensates for parameter details, but the safety-critical context is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 goes beyond it by explaining how null/omitted parameters are treated (left unchanged) and how list parameters behave (replaced, not merged) — semantics the schema's `default: null` does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Update a saved OpenProject board/query"), which is distinct from create_board/delete_board/get_board siblings. It doesn't explicitly name those alternatives, but the operation is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use or when-not-to-use guidance relative to create_board, update_grid, or execute_query. The only clause present (omitted fields unchanged) is a mutation semantic, not usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_documentB
DestructiveIdempotent

Update a document. Omitted fields stay unchanged.

NameRequiredDescriptionDefault
titleNoAt most 255 characters.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
descriptionNoDocument text; "" clears it.
document_idYesNumeric document id, as returned by list_documents.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is carried structurally. The description adds genuine value with the partial-update semantics (omitted fields unchanged), but says nothing about reversibility, permissions, or the destructive nature the annotations flag.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the core action and the key partial-update constraint front-loaded. Slightly thin rather than bloated, but structurally sound.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with no output schema, the description relies almost entirely on the schema for the confirm/preview workflow and parameter details. It is adequate but omits anything about side effects, concurrency, or what a successful update returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: the schema documents title length limits, the "" clears-text rule, the confirm preview/approval workflow, and the document_id source. The description adds only the general null-skip rule, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Update a document") and adds the partial-update rule ("Omitted fields stay unchanged"), which is clear enough to distinguish it from get_document/list_documents. It does not explicitly name a sibling alternative, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or when-not-to-use guidance, no mention of alternatives, and no prerequisites. The only directional hint is that unspecified fields are untouched, which is a behavioral rule rather than usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_gridA
DestructiveIdempotent

Rename or resize a dashboard grid; omitted fields stay unchanged.

The widgets stay as they are; a size that would leave a widget outside the grid is rejected.

NameRequiredDescriptionDefault
nameNoNew display name, at most 255 characters.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
grid_idYesGrid id, from list_grids.
row_countNoNew number of rows, a positive integer.
column_countNoNew number of columns, a positive integer.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive=true, idempotent=true, readOnly=false, but the description adds genuinely new behavioral context: partial-update semantics (omitted fields unchanged), that widgets are preserved, and that out-of-bounds sizes are rejected. It stops short of noting the destructive implication of shrinking a grid that holds widgets, or the preview/confirm safety flow that lives only 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action, and the second sentence earns its place by adding constraint and preservation semantics. No filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter mutation tool with no output schema, the description covers the operation, partial-update behavior, and validation rejection. The one meaningful omission is that changes are gated behind a confirm/preview step, which is documented in the schema but not in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so 3 is the baseline, but the description adds real meaning: 'omitted fields stay unchanged' explains the null defaults on name/row_count/column_count, and 'rename or resize' maps the verbs to those parameters. It does not, however, surface the confirm/preview parameter behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb pair and resource: 'Rename or resize a dashboard grid'. The mutating scope is unambiguous and distinct from read-side siblings like get_grid and list_grids, though no sibling is explicitly named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Omitted fields stay unchanged' implies partial-update usage, but there is no explicit guidance on when to use this instead of create_grid/delete_grid, and no mention of prerequisites. Usage must be inferred from the name and the mutation semantics.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_meetingA
Destructive

Update one meeting's details; omitted fields stay unchanged.

Requires OpenProject 17.4+. The meeting's agenda is changed with the agenda item and section tools, and a recurring series' schedule with update_recurring_meeting; for an occurrence of a series this changes only that occurrence. With notifications on, a change of title, time, duration or location emails the invited participants (not for a closed or cancelled meeting). From 17.8, an update that takes a one-time meeting out of draft or turns notifications on also sends the invitations; 17.4 to 17.7 send no invitations on update. Changing participants is not supported: participant_user_refs is rejected.

NameRequiredDescriptionDefault
stateNoMeeting state as get_meeting reports it, e.g. "open", "in_progress" or "closed".
titleNoMeeting title, at most 255 characters.
notifyNotrue lets OpenProject email the invited participants about this meeting; for an occurrence of a series the series' setting applies.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
sharingNoOnly for meeting templates: "none", "descendants" or "system"; leave it out for a meeting.
durationNoISO 8601 duration in hours and minutes, e.g. "PT1H30M".
locationNoFree-text location or meeting link, at most 255 characters.
meeting_idYesMeeting id, from list_meetings.
start_timeNoISO 8601 date-time with offset, e.g. 2026-12-01T09:00:00Z.
lock_versionNoThe lock_version from get_meeting; the update is rejected if the meeting changed since. Omit it to skip this check.
participant_user_refsNoRejected: OpenProject 17.4 and 17.5 would add a user a second time and cannot remove anyone, and only administrators can read the server version that tells the releases apart. Change the participants in OpenProject.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag it as destructive/non-idempotent/open-world; the description adds substantial side-effect detail the annotations cannot convey — which field changes trigger participant emails, that closed/cancelled meetings are exempt, version-dependent invitation behavior (17.8 vs 17.4–17.7), and the OpenProject 17.4+ minimum. This is exactly the kind of consequence disclosure a write tool needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core partial-update contract is front-loaded, followed by related-resource routing, then side-effect/version caveats. Every clause carries information, but the version-conditioned paragraph (17.4–17.7 vs 17.8) is dense and would read better as a tighter conditional.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers mutation scope, alternatives, notification side effects, version requirements, and an unsupported parameter — thorough for an 11-parameter write tool with no output schema. What is missing is any statement about the response, notably the preview result the schema's confirm parameter implies, which the description never mentions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 explaining cross-field semantics the schema does not — the title/time/duration/location fields as the email-triggering set, notify inheriting the series setting for occurrences, and participant_user_refs being rejected with the version reason. It does not add format detail for state/sharing/lock_version, but those are already documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ("Update one meeting's details") plus the partial-update contract ("omitted fields stay unchanged"). It then explicitly separates concerns from siblings: agenda via agenda item/section tools, series schedule via update_recurring_meeting, single-occurrence edits for series. An agent can distinguish this from update_recurring_meeting and update_meeting_agenda_item without reading any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing rules for alternatives (agenda item/section tools, update_recurring_meeting) and states a hard exclusion: participant changes are not supported and participant_user_refs is rejected. The occurrence-vs-series scoping rule tells the agent exactly which meeting object to target.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_meeting_agenda_itemA
Destructive

Update one agenda item of a meeting; omitted fields stay unchanged.

Requires OpenProject 17.6+. Rejected while the meeting is closed. Each confirmed update also updates the meeting's own timestamp. Outcomes of the item are changed with update_meeting_outcome.

NameRequiredDescriptionDefault
notesNoNotes in Markdown, at most 50,000 characters. "" clears them.
titleNoItem title, at most 255 characters.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
item_typeNo"simple" (a titled item) or "work_package" (an item for the work package given in work_package_id, which it then requires).
agenda_item_idYesAgenda item id, from list_meeting_agenda_items.
work_package_idNoWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.
meeting_section_idNoSection to move the item into, from list_meeting_sections: one of the same meeting, or of another meeting in the same series.
duration_in_minutesNoPlanned duration in minutes, 0 to 1440.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With destructiveHint=true and idempotentHint=false already declared, the description adds real behavioral facts the annotations cannot: a version gate, rejection on closed meetings, and the side effect that each confirmed update touches the meeting's own timestamp. It stops short of saying what permissions are needed or what the response contains, but the meaningful surprises are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the operation and its partial-update rule, then constraints, then the sibling pointer. Nothing is repeated from the schema and no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter destructive mutation with no output schema, the definition covers versioning, closed-meeting rejection, partial-update semantics, and a side effect, with preview/confirm behavior carried by the confirm parameter. Only permission requirements and what a successful call returns are left unmentioned, which is a minor residual gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the per-field rules (50k Markdown limit, "" clears notes, work_package_id display-id format, section moves within a series) already live in the schema. The description still earns above baseline by stating the null/omitted convention up front, which is the one cross-parameter semantic an agent could misread as "clear this field".

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Update one agenda item of a meeting") and immediately scopes it with "omitted fields stay unchanged", which is a partial-update semantic an agent must know. It also names the sibling tool that handles a nearby but different concern (update_meeting_outcome), so it is distinguishable from the other meeting_* mutators 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a hard precondition ("Requires OpenProject 17.6+"), an exclusion ("Rejected while the meeting is closed"), and routes outcome edits to update_meeting_outcome. It does not say when to create a new item versus update an existing one, but the use/avoid signals present are concrete and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_meeting_outcomeB
DestructiveIdempotent

Update a meeting outcome.

Requires OpenProject 17.6+.

kind, if given, must be one of "information", "decision", "work_package" (OpenProject's real enum values, not e.g. "info" or "action", which OpenProject rejects with an internal server error rather than a clean validation error).

NameRequiredDescriptionDefault
kindNo
notesNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
outcome_idYes
work_package_idNoWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true. The description adds useful context about the OpenProject version requirement and the internal server error caused by invalid kind values, but it does not explain what an update overwrites or what gets destroyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loads the core action, followed by version and kind constraints. The enum note is useful but slightly verbose; overall it is efficiently structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with no output schema, the description covers the version prerequisite and kind validation, but omits what fields are actually updateable and how partial updates behave. The schema does provide confirm and work_package_id descriptions, which reduces the burden, but notes and outcome_id remain undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40%, and the description compensates for just one parameter by documenting the allowed kind values and their rejection behavior. It does not add meaning for notes or outcome_id, and the required outcome_id has no description in either the schema or the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: "Update a meeting outcome." It is distinguishable from siblings such as delete_meeting_outcome and create_meeting_outcome by the verb, though it does not explicitly contrast them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a version prerequisite (OpenProject 17.6+) but gives no guidance on when to use this tool versus create_meeting_outcome, delete_meeting_outcome, or other update tools. The kind enum constraint is usage-relevant but does not explain when to choose this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_meeting_sectionA
DestructiveIdempotent

Rename or move a meeting section; omitted fields stay unchanged.

Requires OpenProject 17.6+. Rejected while the meeting is closed, and for the backlog section. Its agenda items stay in it. backlog cannot be changed after creation; this tool does not accept it.

NameRequiredDescriptionDefault
titleNoNew section title; it cannot be emptied.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
positionNoNew place among the meeting's sections, 1 = first; the others shift.
section_idYesMeeting section id, from list_meeting_sections.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds real context beyond that: partial-update semantics, a version prerequisite, the closed-meeting rejection, and that agenda items move with the section. It does not describe the preview/apply response shape, though the confirm parameter carries that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The verb+resource and the partial-update rule are front-loaded and earn their place. The trailing sentences are choppy and slightly redundant ("for the backlog section" then "backlog cannot be changed"), costing a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter mutation tool with full annotation coverage and no output schema, the description covers preconditions, failure modes, partial-update behavior and what the operation does not touch. 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.

Parameters4/5

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 nevertheless adds meaning: "omitted fields stay unchanged" explains the optionality of title/position, and "backlog cannot be changed after creation; this tool does not accept it" preempts an agent inventing a backlog parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair and resource: "Rename or move a meeting section" plus the partial-update rule "omitted fields stay unchanged." This distinguishes it cleanly from create_meeting_section, delete_meeting_section and get_meeting_section without needing the schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-not conditions: requires OpenProject 17.6+, is rejected while the meeting is closed, and is rejected for the backlog section. It does not name a sibling alternative (e.g. update_meeting_agenda_item) for cases where the agent actually wants to move agenda items rather than the section itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_membershipA
Destructive

Update a project membership's roles.

The preview is validated by OpenProject; problems come back in validation_errors.

NameRequiredDescriptionDefault
rolesYesReplaces all current roles; role ids or exact role names (case-insensitive), from list_roles.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
membership_idYesMembership id, from list_project_memberships.
notification_messageNoMarkdown text for OpenProject's membership notification.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive=true, idempotent=false and openWorld=true, so the safety profile is covered. The description adds genuinely new context beyond the annotations: mutations run through an OpenProject-side validation pass and failures surface in a validation_errors field, which warns the agent that a preview can fail without applying anything.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the effect stated first and the validation behavior second; nothing is padded. It is arguably too terse for a destructive mutation, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 4-parameter mutation, the combination of explicit annotations, 100% schema coverage including the preview/confirm protocol, and the description's note about validation_errors covers what an agent needs to call it safely. Remaining gaps (permission requirements, notification behavior) are minor and partly addressed by the schema's notification_message field.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each parameter is well documented, including that roles replaces all current roles and where role ids come from. The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Update a project membership's roles") and narrows scope to roles only, which distinguishes it from create_membership/delete_membership. It does not explicitly name those siblings, so differentiation is inferred from the verb rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description hints at a preview-then-apply workflow ("The preview is validated by OpenProject"), which implies how to use the confirm flag, but that detail lives mostly in the schema. There is no explicit statement of when to use this versus create_membership or delete_membership, nor prerequisites such as required permissions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_newsA
DestructiveIdempotent

Update a news entry. Omitted fields stay unchanged.

NameRequiredDescriptionDefault
titleNoAt most 255 characters.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
news_idYesNumeric news id, as returned by list_news.
summaryNoShort plain text, at most 500 characters; "" clears it.
descriptionNoFull text in Markdown; "" clears it.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only, destructive, idempotent mutation, so the safety profile is largely covered. The description adds the useful partial-update rule that omitted fields remain unchanged, but it does not explain what destructive changes occur, permissions required, or the preview-then-confirm behavior that the schema handles separately.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler, and the key partial-update rule is front-loaded immediately after the purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema and annotations together cover the parameters, limits, and destructive nature, but the description remains thin for a destructive update tool. It does not mention the approval/preview flow or permission considerations, leaving the agent to rely entirely on schema and annotation hints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description contributes only the omission semantics (omitted fields stay unchanged), while all specific parameter details such as character limits, clearing with empty strings, and confirm behavior are already documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource (update a news entry), which clearly separates it from create_news, delete_news, list_news, and get_news. It does not explicitly name a sibling, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when modifying an existing news entry and clarifies partial-update behavior. However, it gives no explicit when-to-use versus when-not-to-use guidance, no mention of the preview/confirm workflow, and no alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_projectA
Destructive

Update a project.

Omitted fields stay unchanged. A rejected validation preview is not a tool error; inspect ready and validation_errors in the result rather than the MCP error envelope.

NameRequiredDescriptionDefault
nameNoDisplay name, at most 255 characters.
activeNofalse means archived.
parentNoParent project identifier, id, or name; 'none' makes the project top-level.
publicNoWhether the project is public.
statusNoStatus title, any case, as listed in get_project_admin_context's available_statuses.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
projectYesProject identifier, id, or name; a unique part of a name or identifier also matches.
identifierNoURL identifier such as "my-proj": letters, digits, ".", "_" and "-".
descriptionNoMarkdown text; "" clears it.
status_explanationNoMarkdown text explaining the status; "" clears it.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already disclose destructiveHint=true, openWorldHint=true, and idempotentHint=false, so the safety profile is covered. The description adds valuable behavioral context by warning that a rejected validation preview is not a tool error and by directing the agent to inspect `ready` and `validation_errors` in the result. It does not cover permissions or fuller mutation side effects, but it adds meaningful transparency beyond 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the core action, followed by two behaviorally important notes. Every sentence earns its place, and there is no redundant restatement of the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter destructive mutation with no output schema, the description supplies key missing context: omitted fields remain unchanged, preview validation failures are normal results, and `ready`/`validation_errors` should be inspected. The schema already documents `confirm` and all field-level details, so the description is largely complete, though it could say more about permissions or side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already defines all 10 parameters, including `confirm` and the updateable fields. The description adds a useful general semantic constraint that omitted fields stay unchanged, which clarifies partial-update behavior beyond the schema defaults. It does not add per-parameter detail beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Update a project." This distinguishes it from create_project, delete_project, and copy_project, though it does not explicitly contrast with update_work_package or other update siblings. The purpose is clear but sibling differentiation is limited.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explain when to use update_project versus alternatives such as update_work_package or bulk_update_work_packages. It offers only the implied partial-update semantics of "Omitted fields stay unchanged" and no explicit when-to-use or when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_recurring_meetingA
Destructive

Update an OpenProject recurring meeting series.

Requires OpenProject 17.4+.

Already created future occurrences move and are renamed with the series. A schedule change other than the time of day can delete cancelled occurrences; on 17.4 to 17.8 a time-of-day change also rewrites the slot times of past occurrences. When the schedule changes, invited participants get an update email if notifications are on.

NameRequiredDescriptionDefault
titleNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
end_dateNo
intervalNo
end_afterNo
frequencyNo
iterationsNo
start_timeNo
recurring_meeting_idYesRecurring meeting series id, from list_recurring_meetings.

TDQS

A3.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructiveHint/non-idempotent annotations: it discloses that future occurrences move and get renamed, that non-time-of-day schedule changes can delete cancelled occurrences, that 17.4–17.8 time-of-day changes rewrite past slot times, and that participants receive update emails. This is exactly the side-effect detail an agent needs before a destructive, non-idempotent mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and version requirement, then side effects. The 17.4–17.8 quirk sentence is long but carries real operational value; nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-idempotent mutation with no output schema, the side-effect disclosure is strong, but the sparse parameter documentation (8 optional scheduling fields at 22% coverage) leaves an agent unsure how to express a schedule change correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 22%, so the description must compensate, but it names no parameter and does not explain frequency values, interval semantics, or the end_date vs end_after vs iterations options. It only alludes vaguely to 'schedule change' and 'time of day', leaving the bulk of the 9 parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update an OpenProject recurring meeting series'), which is clearly distinct from update_meeting, create_recurring_meeting, and delete_recurring_meeting. It does not explicitly contrast with the occurrence-level siblings (cancel_recurring_meeting_occurrence, init_recurring_meeting_occurrence), so the differentiation is clear but not maximized.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance versus alternatives such as cancel_recurring_meeting_occurrence or delete_recurring_meeting; usage is only implied by 'update a series'. The confirm-preview workflow lives in the schema rather than the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_relationA
Destructive

Update the type or description of a relation.

relation_type is subject to the same write-time canonicalization as create_work_package_relation: setting it to a "reverse" pair member (precedes, blocked, duplicated, partof, required) rewrites the stored relation to the paired canonical type (follows, blocks, duplicates, includes, requires) with from_id/to_id swapped relative to the relation's existing from/to. Read the actual type/from_id/to_id back afterward rather than assuming they match what was requested.

NameRequiredDescriptionDefault
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
descriptionNo
relation_idYes
relation_typeNo

TDQS

A3.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral detail beyond annotations: relation_type is canonicalized at write time, reverse pair members are rewritten to canonical types with from_id/to_id swapped, and the agent should read back the actual type and IDs rather than assume requested values persisted. This directly warns about surprising mutation side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence front-loads the purpose, followed by focused canonicalization detail. The explanation is dense but each sentence earns its place; minor formatting improvements could make the reverse-pair list easier to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with no output schema, the description covers the critical behavioral risk of relation_type rewriting and advises verifying the result. Annotations already declare the destructive/write profile, and the confirm preview workflow is documented in the schema, so the remaining gaps are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 25% (only confirm is documented), so the description must clarify parameters. It provides deep semantics for relation_type, the most ambiguous parameter, explaining the canonicalization and swapping behavior. It does not explain relation_id or description, but those are comparatively self-evident.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: update the type or description of a relation. It is clear and unambiguous, though it does not explicitly contrast with sibling tools like create_work_package_relation or delete_relation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives. It references create_work_package_relation only to explain canonicalization behavior, not to route the agent between tools. The implied use case (updating an existing relation) is obvious from the name, but no exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_reminderA
DestructiveIdempotent

Update a reminder's time or note; at least one is required, an omitted one stays unchanged.

Requires OpenProject 16.1+.

NameRequiredDescriptionDefault
noteNoNew note, at most 2000 characters; "" clears it.
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
remind_atNoNew ISO 8601 date-time with offset, e.g. 2026-12-01T09:00:00Z.
reminder_idYesReminder id, from list_reminders.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description still adds real value by disclosing partial-update semantics (omitted fields are preserved) and a version prerequisite (OpenProject 16.1+), which the structured fields do not carry. It does not restate the preview/confirm gate, but the schema parameter already documents that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, with the core behavior front-loaded and the version requirement placed last as a prerequisite. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the tool is a simple mutation whose parameters are fully documented and whose confirm-preview flow is spelled out in the schema. A brief note on what the update returns or on permission requirements would close the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the per-parameter docs are already complete, so the baseline is 3. The description earns an extra point by adding a cross-parameter rule the schema cannot express: at least one of remind_at/note must be supplied, otherwise the call is meaningless.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update a reminder') plus the exact mutable fields ('time or note'), which cleanly separates it from create_work_package_reminder and delete_reminder. An agent knows immediately which operation this is.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys a constraint ('at least one is required, an omitted one stays unchanged') that implies an update-with-partial-fields use case, but it never states when to prefer this over siblings such as delete_reminder or create_work_package_reminder. Usage is inferable rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_time_entryA
DestructiveIdempotent

Update a time entry.

hours accepts an ISO8601 duration string (e.g., 'PT8H' for 8 hours, 'P1D' for 1 day). start_time is an ISO 8601 date-time. No end_time parameter -- OpenProject derives it read-only from start_time + hours. Use update_time_entry_until to specify an end time instead of hours directly.

NameRequiredDescriptionDefault
userNo
hoursNo
commentNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
ongoingNo
activityNo
spent_onNo
start_timeNo
time_entry_idYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuine non-schema behavior — end_time is derived read-only from start_time + hours — but never mentions the destructive nature, that changes are irreversible, or how the confirm-preview flow gates the mutation (only the schema's own field description covers that).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose in one line, then spends the rest on format semantics that the schema lacks — no filler sentences. The line breaks mid-sentence are slightly awkward but the ordering is logical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 9-parameter mutation with 11% schema coverage and no output schema, the description should do more: it should say whether this is a partial update, what happens to fields not supplied, and what the confirm=false response looks like. It covers only the hours/start_time arithmetic.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 11% across 9 parameters, so the description must compensate — and it does for the two most error-prone fields: hours is an ISO8601 duration ('PT8H', 'P1D') and start_time is an ISO8601 date-time. However, seven other parameters (user, comment, ongoing, activity, spent_on, time_entry_id) get no treatment, and it doesn't say whether omitted fields are left unchanged or cleared.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update a time entry') and explicitly distinguishes itself from the sibling update_time_entry_until by explaining that end_time cannot be passed here. An agent can select between the two update tools 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names a concrete alternative and the condition selecting it: use update_time_entry_until when you have an end time instead of hours. That is real routing guidance. It stops short of stating prerequisites (e.g., whether the entry must be owned by or visible to the caller).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_time_entry_untilA
DestructiveIdempotent

Update a time entry by start/end time instead of a duration.

Computes hours = end_time - start_time locally; only hours and start_time are sent to OpenProject (end_time itself is never accepted by the server, see update_time_entry's docstring). end_time must be strictly after start_time. Always sets ongoing=False, since a completed time span with a known end time cannot still be running.

NameRequiredDescriptionDefault
userNo
commentNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
activityNo
end_timeYes
spent_onNo
start_timeYes
time_entry_idYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing non-obvious mechanics: hours are computed locally as end_time - start_time, only hours and start_time are transmitted, end_time is never sent to the server, end_time must be strictly after start_time, and ongoing is always forced to false. For a destructive mutation this is exactly the operational detail 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the distinguishing behavior, then two short sentences on the computation and the validation constraint. No repetition of the schema and no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the distinctive mechanics well and the confirm preview semantics live in the schema. What is missing is the effect on fields not mentioned (does the existing duration get cleared, does ongoing=False overwrite an in-progress entry), which matters for a destructive, open-world mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 13% (just the confirm parameter), so the description has to compensate. It adds real meaning for start_time and end_time (validation rule, local computation, server never receives end_time) but says nothing about time_entry_id, user, comment, activity, or spent_on.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb (Update) and resource (time entry) plus the key differentiator: it takes start/end time instead of a duration. That implicitly separates it from update_time_entry and create_time_entry_until, though neither sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Instead of a duration" clearly tells the agent when to pick this over update_time_entry, and the reference to update_time_entry's docstring points at the alternative for duration-based edits. There is no explicit when-not guidance, but the selection context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_versionA
DestructiveIdempotent

Update a version.

Omitted fields stay unchanged. A rejected validation preview is not a tool error; inspect ready and validation_errors in the result rather than the MCP error envelope.

NameRequiredDescriptionDefault
nameNoDisplay name, at most 60 characters.
statusNoOne of "open", "locked", "closed".
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
sharingNoOne of "none", "descendants", "hierarchy", "tree".
end_dateNoISO 8601 date (YYYY-MM-DD).
start_dateNoISO 8601 date (YYYY-MM-DD).
version_idYesNumeric version id, as returned by list_versions.
descriptionNoPlain text, not Markdown; "" clears it.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds two genuinely non-obvious behaviors: that omitted fields are preserved, and that a rejected validation preview surfaces as a normal result with `ready`/`validation_errors` rather than an MCP error — this prevents the agent from misreading the outcome. It does not say what a destructive update actually destroys (e.g. effects of moving status to 'closed' or changing sharing scope).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, then the partial-update rule, then the error-handling caveat. No filler and every sentence carries operational meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully names the result fields `ready` and `validation_errors` and explains the two-phase confirm flow. What's missing is the success-path result shape and any note on permissions or the consequences of the destructive flag — meaningful gaps for a destructive mutation tool, but not blocking.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all eight parameters documented (enum-ish value lists, ISO date format, 60-char name limit, `""` clearing description). The description adds only the blanket 'omitted fields stay unchanged' rule and nothing per-parameter, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update a version'), which contrasts cleanly with siblings create_version, delete_version, get_version and list_versions. It stops short of naming which attributes are mutable, but nothing about the purpose is ambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Omitted fields stay unchanged' implies partial-update semantics, and the preview/validation sentence steers the agent toward a confirm-then-apply flow. However, there is no explicit when-to-use guidance, no exclusions, and no pointer to the sibling alternative for creating versus modifying a version.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_work_packageA
DestructiveIdempotent

Update a work package.

The tool validates the patch first. assignee: 'me' or numeric user id (e.g., 42). Call list_users to find ids. parent re-parents the work package (numeric id or a PROJ-123 reference); pass 'none' to remove the parent and make it top-level. version accepts a version name/id, or 'none' to unassign the version. sprint accepts a Backlogs sprint name/id (requires the Backlogs module and OpenProject 17.3+), or 'none' to unassign it. Pass 'none' to assignee, responsible, category or project_phase to unassign that field. Omitted fields stay unchanged. target_versions accepts a list of version names/ids to assign multiple target versions at once (OpenProject's multi-version feature); pass [] to clear all. target_versions and version write the same underlying data and cannot be used together in one call. If this work package already has more than one target version, version alone is rejected; use target_versions instead. A change of version, target_versions, sprint or a version custom field is refused while the work package holds such an assignment in a project OPENPROJECT_READ_PROJECTS does not cover, because the change would remove it. estimated_time, remaining_time, duration accept ISO8601 duration strings (e.g., 'PT8H' for 8 hours, 'PT1H30M' for 1.5 hours, 'P1D' for 1 day); omit to leave unchanged, or pass 'none' to clear the field. percentage_done is an integer 0-100. Setting status to a closed status auto-fills percentage_done=100 and remaining_time=PT0H when you don't supply them explicitly and OpenProject's schema reports those fields as writable (on instances using status-based progress calculation, OpenProject already derives them itself and this is skipped). On such an instance, explicitly passing percentage_done together with a closing status is rejected with a hard validation error (percentageDone is not writable there) rather than silently ignored; omit percentage_done and let OpenProject derive it instead. due_date's non-working-day shift and the confirm/preview contract work exactly as documented on create_work_package.

NameRequiredDescriptionDefault
typeNo
parentNo
sprintNo
statusNo
confirmNofalse: preview only, nothing changes. true: applies it; get the user's approval of the preview first.
subjectNo
versionNo
assigneeNo
categoryNo
due_dateNo
durationNo
priorityNo
start_dateNo
descriptionNo
responsibleNo
custom_fieldsNo
project_phaseNo
estimated_timeNo
remaining_timeNo
percentage_doneNo
target_versionsNo
work_package_idYesWork package id (e.g. 952) or display id (e.g. "PROJ-51"), not the bare number 51.

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far beyond what the annotations convey: the description discloses that the patch is validated first, that omitted fields stay unchanged, that 'none' is a sentinel for clearing, that version/target_versions are mutually exclusive, that certain changes are refused when the package holds an assignment in a project not covered by OPENPROJECT_READ_PROJECTS, and that a closing status auto-fills percentage_done/remaining_time with a hard-error edge case. This is exactly the context an agent needs to avoid a failed or destructive call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

After a one-line purpose statement the text becomes an undifferentiated block of field notes with no headings or grouping, and the percentage_done/closed-status caveat is spread over four sentences that restate the same derive-versus-explicit rule. Each fact is useful, but the lack of structure and the repetition cost the reader.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 22-parameter mutation tool with no output schema, no enum hints and heavy instance-dependent behavior, the description covers the dangerous and non-obvious parts well. It falls short on describing what the call returns (preview payload vs. applied result) and leaves custom_fields entirely unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 9% schema description coverage across 22 parameters, the description carries almost the entire burden and largely does: assignee, parent, version, target_versions, sprint, estimated_time, remaining_time, duration, percentage_done and the 'none' unassign sentinel for assignee/responsible/category/project_phase are all explained with formats and examples. Gaps remain for custom_fields, type, priority and start_date, which are undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource ('Update a work package'), so the operation is unambiguous. It does not, however, distinguish itself from the sibling bulk_update_work_packages or explain the boundary with create_work_package, which it only references as a documentation surrogate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied by the field-by-field semantics rather than stated, and there is a helpful prerequisite ('Call list_users to find ids') plus a pointer to create_work_package for the confirm/preview contract. But nothing tells the agent when to prefer this over bulk_update_work_packages, and no explicit when-not guidance is given.

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.

  1. 136 tool updatesv0.4.4
    • Addedadd_work_package_comment
    • Addedbulk_create_work_packages
    • Addedbulk_update_work_packages
    • Addedcancel_recurring_meeting_occurrence
    • Addedcopy_project
    • Addedcreate_board
    • Addedcreate_grid
    • Addedcreate_meeting
    • Addedcreate_meeting_agenda_item
    • Addedcreate_meeting_outcome
    • Addedcreate_meeting_section
    • Addedcreate_membership
    • Addedcreate_news
    • Addedcreate_project
    • Addedcreate_recurring_meeting
    • Addedcreate_subtask
    • Addedcreate_time_entry
    • Addedcreate_time_entry_until
    • Addedcreate_version
    • Addedcreate_work_package
    • Addedcreate_work_package_relation
    • Addedcreate_work_package_reminder
    • Addedcreate_work_package_wiki_link
    • Addeddelete_attachment
    • Addeddelete_board
    • Addeddelete_file_link
    • Addeddelete_grid
    • Addeddelete_meeting
    • Addeddelete_meeting_agenda_item
    • Addeddelete_meeting_outcome
    • Addeddelete_meeting_section
    • Addeddelete_membership
    • Addeddelete_news
    • Addeddelete_project
    • Addeddelete_recurring_meeting
    • Addeddelete_relation
    • Addeddelete_reminder
    • Addeddelete_time_entry
    • Addeddelete_version
    • Addeddelete_work_package
    • Addeddelete_work_package_wiki_link
    • Addedexecute_query
    • Addedget_attachment
    • Addedget_attachment_content
    • Addedget_backlog_bucket
    • Addedget_board
    • Addedget_category
    • Addedget_cost_entry
    • Addedget_document
    • Addedget_grid
    • Addedget_job_status
    • Addedget_meeting
    • Addedget_meeting_agenda_item
    • Addedget_meeting_outcome
    • Addedget_meeting_section
    • Addedget_membership
    • Addedget_my_project_access
    • Addedget_news
    • Addedget_post
    • Addedget_project
    • Addedget_project_admin_context
    • Addedget_project_configuration
    • Addedget_project_phase
    • Addedget_project_storage
    • Addedget_project_work_package_context
    • Addedget_recurring_meeting
    • Addedget_sprint
    • Addedget_time_entry
    • Addedget_version
    • Addedget_view
    • Addedget_wiki_page
    • Addedget_work_package
    • Addedget_work_package_activities
    • Addedget_work_package_costs_by_type
    • Addedget_work_package_relations
    • Addedget_work_packages
    • Addedinit_recurring_meeting_occurrence
    • Changedlist_actions3 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Page size, capped at OPENPROJECT_MAX_PAGE_SIZE."
      • addedInput schema / properties / offset / description
        Added value: +"1-based page number; pass the previous result's next_offset."
      • addedInput schema / properties / select / description
        Added value: +"Fields to return; a requested unset field comes back as null. Allowed: id, url."
    • Addedlist_backlog_buckets
    • Addedlist_boards
    • Addedlist_capabilities
    • Addedlist_categories
    • Addedlist_documents
    • Addedlist_grids
    • Addedlist_meeting_agenda_items
    • Addedlist_meeting_outcomes
    • Addedlist_meeting_sections
    • Addedlist_meetings
    • Addedlist_my_open_work_packages
    • Addedlist_news
    • Addedlist_project_memberships
    • Addedlist_project_storages
    • Addedlist_projects
    • Addedlist_recurring_meeting_occurrences
    • Addedlist_recurring_meetings
    • Addedlist_relations
    • Addedlist_reminders
    • Changedlist_roles3 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Page size, capped at OPENPROJECT_MAX_PAGE_SIZE."
      • addedInput schema / properties / offset / description
        Added value: +"1-based page number; pass the previous result's next_offset."
      • addedInput schema / properties / select / description
        Added value: +"Fields to return; a requested unset field comes back as null. Allowed: id, name."
    • Addedlist_sprints
    • Addedlist_time_entries
    • Addedlist_time_entry_activities
    • Changedlist_types2 fields changed
      • changedInput schema / properties / project / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / project / description
        Added value: +"Project identifier, id, or name; a unique part of a name or identifier also matches."
    • Addedlist_versions
    • Addedlist_views
    • Addedlist_work_package_attachments
    • Addedlist_work_package_cost_entries
    • Addedlist_work_package_file_links
    • Addedlist_work_package_github_pull_requests
    • Addedlist_work_package_gitlab_issues
    • Addedlist_work_package_gitlab_merge_requests
    • Addedlist_work_package_meeting_agenda_items
    • Addedlist_work_package_reactions
    • Addedlist_work_package_watchers
    • Addedlist_work_package_wiki_links
    • Addedlist_work_packages
    • Addedsearch_work_packages
    • Addedset_project_favorite
    • Addedset_work_package_watcher
    • Addedtoggle_activity_emoji_reaction
    • Addedupdate_board
    • Addedupdate_document
    • Addedupdate_grid
    • Addedupdate_meeting
    • Addedupdate_meeting_agenda_item
    • Addedupdate_meeting_outcome
    • Addedupdate_meeting_section
    • Addedupdate_membership
    • Addedupdate_news
    • Addedupdate_project
    • Addedupdate_recurring_meeting
    • Addedupdate_relation
    • Addedupdate_reminder
    • Addedupdate_time_entry
    • Addedupdate_time_entry_until
    • Addedupdate_version
    • Addedupdate_work_package
  2. 51 tool updatesv0.4.0
    • Removedget_attachment
    • Removedget_board
    • Removedget_category
    • Addedget_cost_type
    • Removedget_document
    • Addedget_github_pull_request
    • Removedget_grid
    • Changedget_instance_configuration3 fields changed
      • removedOutput schema / properties / maximum_attachment_file_size
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "integer"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Maximum Attachment File Size"
        -}
      • addedOutput schema / properties / maximum_attachment_file_size_bytes
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Maximum Attachment File Size Bytes"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "host_name",
        -  "maximum_attachment_file_size",
        -  "maximum_api_v3_page_size",
        -  "per_page_options",
        -  "duration_format",
        -  "hours_per_day",
        -  "days_per_month",
        -  "active_feature_flags",
        -  "available_features",
        -  "trialling_features"
        -]New value: +[
        +  "host_name",
        +  "maximum_attachment_file_size_bytes",
        +  "maximum_api_v3_page_size",
        +  "per_page_options",
        +  "duration_format",
        +  "hours_per_day",
        +  "days_per_month",
        +  "active_feature_flags",
        +  "available_features",
        +  "trialling_features"
        +]
    • Removedget_job_status
    • Removedget_membership
    • Removedget_my_project_access
    • Removedget_news
    • Removedget_project
    • Removedget_project_admin_context
    • Removedget_project_configuration
    • Removedget_project_phase
    • Removedget_project_work_package_context
    • Removedget_sprint
    • Removedget_time_entry
    • Removedget_version
    • Removedget_view
    • Removedget_wiki_page
    • Removedget_work_package
    • Removedget_work_package_activities
    • Removedget_work_package_relations
    • Removedget_work_packages
    • Changedlist_actions1 field changed
      • addedInput schema / properties / select
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Select"
        +}
    • Removedlist_boards
    • Removedlist_capabilities
    • Removedlist_categories
    • Removedlist_documents
    • Removedlist_grids
    • Removedlist_my_open_work_packages
    • Removedlist_news
    • Removedlist_project_memberships
    • Removedlist_project_sprints
    • Removedlist_projects
    • Removedlist_relations
    • Removedlist_reminders
    • Changedlist_roles3 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Limit"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 1,
        +  "title": "Offset",
        +  "type": "integer"
        +}
      • addedInput schema / properties / select
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Select"
        +}
    • Removedlist_sprints
    • Removedlist_time_entries
    • Removedlist_time_entry_activities
    • Removedlist_versions
    • Removedlist_views
    • Removedlist_work_package_attachments
    • Removedlist_work_package_file_links
    • Removedlist_work_package_reactions
    • Removedlist_work_package_watchers
    • Removedlist_work_packages
    • Removedsearch_work_packages
  3. 3 tool updatesv0.3.8
    • Changedget_category2 fields changed
      • removedOutput schema / properties / is_default
        Removed value: -{
        -  "title": "Is Default",
        -  "type": "boolean"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "project_id",
        -  "project",
        -  "is_default"
        -]New value: +[
        +  "id",
        +  "name",
        +  "project_id",
        +  "project"
        +]
    • Changedget_job_status4 fields changed
      • removedOutput schema / properties / created_at
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Created At"
        -}
      • removedOutput schema / properties / percentage_complete
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "integer"
        -    },
        -    {
        -      "type": "number"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Percentage Complete"
        -}
      • removedOutput schema / properties / updated_at
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Updated At"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "type",
        -  "status",
        -  "message",
        -  "created_at",
        -  "updated_at",
        -  "percentage_complete",
        -  "project_id",
        -  "project",
        -  "created_resource_type",
        -  "created_resource_id",
        -  "created_resource_name"
        -]New value: +[
        +  "id",
        +  "type",
        +  "status",
        +  "message",
        +  "project_id",
        +  "project",
        +  "created_resource_type",
        +  "created_resource_id",
        +  "created_resource_name"
        +]
    • Changedget_project_admin_context1 field changed
      • addedOutput schema / $defs / ProjectRef / description
        Added value: +"Lightweight project picklist entry -- id/identifier/name only.\n\nUsed where a caller needs to pick a project by reference (e.g. a parent\nproject) but not read its full description/status: the full ProjectSummary\nwould cost a description/status_explanation (up to 1200 chars) per\ncandidate for no benefit to that use case."
  4. 58 tool updatesv0.3.7
    • Changedget_attachment3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "title",
        -  "file_name",
        -  "file_size",
        -  "description",
        -  "content_type",
        -  "status",
        -  "author",
        -  "container_type",
        -  "container_id",
        -  "created_at",
        -  "download_url",
        -  "url"
        -]New value: +[
        +  "id",
        +  "title",
        +  "file_name",
        +  "file_size",
        +  "description",
        +  "content_type",
        +  "status",
        +  "author",
        +  "container_type",
        +  "container_id",
        +  "created_at",
        +  "download_url"
        +]
    • Changedget_board3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "project_id",
        -  "project",
        -  "public",
        -  "hidden",
        -  "starred",
        -  "include_subprojects",
        -  "show_hierarchies",
        -  "timeline_visible",
        -  "timeline_zoom_level",
        -  "highlighting_mode",
        -  "group_by",
        -  "columns",
        -  "sort_by",
        -  "highlighted_attributes",
        -  "timestamps",
        -  "filters",
        -  "created_at",
        -  "updated_at",
        -  "can_update",
        -  "can_delete",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "project_id",
        +  "project",
        +  "public",
        +  "hidden",
        +  "starred",
        +  "include_subprojects",
        +  "show_hierarchies",
        +  "timeline_visible",
        +  "timeline_zoom_level",
        +  "highlighting_mode",
        +  "group_by",
        +  "columns",
        +  "sort_by",
        +  "highlighted_attributes",
        +  "timestamps",
        +  "filters",
        +  "created_at",
        +  "updated_at",
        +  "can_update",
        +  "can_delete"
        +]
    • Changedget_category3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "project_id",
        -  "project",
        -  "is_default",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "project_id",
        +  "project",
        +  "is_default"
        +]
    • Changedget_current_user3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "login",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "login"
        +]
    • Changedget_document4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / attachments_url
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Attachments Url"
        -}
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "title",
        -  "project_id",
        -  "project",
        -  "description",
        -  "created_at",
        -  "attachment_count",
        -  "attachments_url",
        -  "can_update",
        -  "url"
        -]New value: +[
        +  "id",
        +  "title",
        +  "project_id",
        +  "project",
        +  "description",
        +  "created_at",
        +  "attachment_count",
        +  "can_update"
        +]
    • Changedget_grid3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "row_count",
        -  "column_count",
        -  "scope",
        -  "created_at",
        -  "updated_at",
        -  "url"
        -]New value: +[
        +  "id",
        +  "row_count",
        +  "column_count",
        +  "scope",
        +  "created_at",
        +  "updated_at"
        +]
    • Changedget_instance_configuration1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_job_status4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / links
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Links",
        -  "type": "array"
        -}
      • removedOutput schema / properties / url
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Url"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "type",
        -  "status",
        -  "message",
        -  "created_at",
        -  "updated_at",
        -  "percentage_complete",
        -  "project_id",
        -  "project",
        -  "created_resource_type",
        -  "created_resource_id",
        -  "created_resource_name",
        -  "links",
        -  "url"
        -]New value: +[
        +  "id",
        +  "type",
        +  "status",
        +  "message",
        +  "created_at",
        +  "updated_at",
        +  "percentage_complete",
        +  "project_id",
        +  "project",
        +  "created_resource_type",
        +  "created_resource_id",
        +  "created_resource_name"
        +]
    • Changedget_membership3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "principal_id",
        -  "principal_name",
        -  "project_id",
        -  "project_name",
        -  "role_ids",
        -  "role_names",
        -  "can_update",
        -  "can_update_immediately",
        -  "url"
        -]New value: +[
        +  "id",
        +  "principal_id",
        +  "principal_name",
        +  "project_id",
        +  "project_name",
        +  "role_ids",
        +  "role_names",
        +  "can_update",
        +  "can_update_immediately"
        +]
    • Changedget_my_project_access3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / $defs / MembershipSummary / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / MembershipSummary / required
        Previous value: -[
        -  "id",
        -  "principal_id",
        -  "principal_name",
        -  "project_id",
        -  "project_name",
        -  "role_ids",
        -  "role_names",
        -  "can_update",
        -  "can_update_immediately",
        -  "url"
        -]New value: +[
        +  "id",
        +  "principal_id",
        +  "principal_name",
        +  "project_id",
        +  "project_name",
        +  "role_ids",
        +  "role_names",
        +  "can_update",
        +  "can_update_immediately"
        +]
    • Changedget_news3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "title",
        -  "summary",
        -  "description",
        -  "project_id",
        -  "project",
        -  "author",
        -  "created_at",
        -  "can_update",
        -  "can_delete",
        -  "url"
        -]New value: +[
        +  "id",
        +  "title",
        +  "summary",
        +  "description",
        +  "project_id",
        +  "project",
        +  "author",
        +  "created_at",
        +  "can_update",
        +  "can_delete"
        +]
    • Changedget_priority1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_project3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "identifier",
        -  "active",
        -  "description",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "identifier",
        +  "active",
        +  "description"
        +]
    • Changedget_project_admin_context5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / $defs / ProjectRef / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / ProjectRef / required
        Previous value: -[
        -  "id",
        -  "identifier",
        -  "name",
        -  "url"
        -]New value: +[
        +  "id",
        +  "identifier",
        +  "name"
        +]
      • removedOutput schema / $defs / ProjectSummary / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / ProjectSummary / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "identifier",
        -  "active",
        -  "description",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "identifier",
        +  "active",
        +  "description"
        +]
    • Changedget_project_configuration3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "project_id",
        -  "project_name",
        -  "maximum_attachment_file_size",
        -  "maximum_api_v3_page_size",
        -  "per_page_options",
        -  "duration_format",
        -  "hours_per_day",
        -  "days_per_month",
        -  "active_feature_flags",
        -  "available_features",
        -  "trialling_features",
        -  "enabled_internal_comments",
        -  "url"
        -]New value: +[
        +  "project_id",
        +  "project_name",
        +  "maximum_attachment_file_size",
        +  "maximum_api_v3_page_size",
        +  "per_page_options",
        +  "duration_format",
        +  "hours_per_day",
        +  "days_per_month",
        +  "active_feature_flags",
        +  "available_features",
        +  "trialling_features",
        +  "enabled_internal_comments"
        +]
    • Changedget_project_phase3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "project_id",
        -  "project",
        -  "phase_definition_id",
        -  "phase_definition",
        -  "start_date",
        -  "finish_date",
        -  "created_at",
        -  "updated_at",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "project_id",
        +  "project",
        +  "phase_definition_id",
        +  "phase_definition",
        +  "start_date",
        +  "finish_date",
        +  "created_at",
        +  "updated_at"
        +]
    • Changedget_project_phase_definition3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "start_gate",
        -  "finish_gate",
        -  "created_at",
        -  "updated_at",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "start_gate",
        +  "finish_gate",
        +  "created_at",
        +  "updated_at"
        +]
    • Changedget_project_work_package_context3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / $defs / VersionSummary / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / VersionSummary / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "status",
        -  "sharing",
        -  "start_date",
        -  "end_date",
        -  "defining_project",
        -  "description",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "status",
        +  "sharing",
        +  "start_date",
        +  "end_date",
        +  "defining_project",
        +  "description"
        +]
    • Changedget_sprint4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / status_href
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Status Href"
        -}
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "status",
        -  "status_href",
        -  "start_date",
        -  "finish_date",
        -  "defining_workspace_id",
        -  "defining_workspace",
        -  "created_at",
        -  "updated_at",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "status",
        +  "start_date",
        +  "finish_date",
        +  "defining_workspace_id",
        +  "defining_workspace",
        +  "created_at",
        +  "updated_at"
        +]
    • Changedget_status3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "is_default",
        -  "is_closed",
        -  "color",
        -  "position",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "is_default",
        +  "is_closed",
        +  "color",
        +  "position"
        +]
    • Changedget_time_entry3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "project",
        -  "entity_type",
        -  "entity_id",
        -  "entity_name",
        -  "user",
        -  "activity",
        -  "hours",
        -  "spent_on",
        -  "start_time",
        -  "end_time",
        -  "ongoing",
        -  "comment",
        -  "created_at",
        -  "updated_at",
        -  "url"
        -]New value: +[
        +  "id",
        +  "project",
        +  "entity_type",
        +  "entity_id",
        +  "entity_name",
        +  "user",
        +  "activity",
        +  "hours",
        +  "spent_on",
        +  "start_time",
        +  "end_time",
        +  "ongoing",
        +  "comment",
        +  "created_at",
        +  "updated_at"
        +]
    • Changedget_type3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "color",
        -  "position",
        -  "is_default",
        -  "is_milestone",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "color",
        +  "position",
        +  "is_default",
        +  "is_milestone"
        +]
    • Changedget_version3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "status",
        -  "sharing",
        -  "start_date",
        -  "end_date",
        -  "defining_project",
        -  "description",
        -  "url"
        -]New value: +[
        +  "id",
        +  "name",
        +  "status",
        +  "sharing",
        +  "start_date",
        +  "end_date",
        +  "defining_project",
        +  "description"
        +]
    • Changedget_view3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "type",
        -  "name",
        -  "project_id",
        -  "project",
        -  "query_id",
        -  "query",
        -  "public",
        -  "starred",
        -  "created_at",
        -  "updated_at",
        -  "links",
        -  "url"
        -]New value: +[
        +  "id",
        +  "type",
        +  "name",
        +  "project_id",
        +  "project",
        +  "query_id",
        +  "query",
        +  "public",
        +  "starred",
        +  "created_at",
        +  "updated_at",
        +  "links"
        +]
    • Changedget_wiki_page4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / attachments_url
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Attachments Url"
        -}
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "title",
        -  "project_id",
        -  "project",
        -  "content",
        -  "attachments_url",
        -  "url"
        -]New value: +[
        +  "id",
        +  "title",
        +  "project_id",
        +  "project",
        +  "content"
        +]
    • Changedget_work_package5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / activities_url
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Activities Url"
        -}
      • removedOutput schema / properties / relations_url
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Relations Url"
        -}
      • removedOutput schema / properties / url
        Removed value: -{
        -  "title": "Url",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "display_id",
        -  "subject",
        -  "type",
        -  "status",
        -  "priority",
        -  "project_phase",
        -  "assignee",
        -  "responsible",
        -  "project",
        -  "version",
        -  "sprint",
        -  "parent_id",
        -  "parent_display_id",
        -  "start_date",
        -  "due_date",
        -  "percentage_complete",
        -  "lock_version",
        -  "description",
        -  "url",
        -  "activities_url",
        -  "relations_url"
        -]New value: +[
        +  "id",
        +  "display_id",
        +  "subject",
        +  "type",
        +  "status",
        +  "priority",
        +  "project_phase",
        +  "assignee",
        +  "responsible",
        +  "project",
        +  "version",
        +  "sprint",
        +  "parent_id",
        +  "parent_display_id",
        +  "start_date",
        +  "due_date",
        +  "percentage_complete",
        +  "lock_version",
        +  "description"
        +]
    • Changedget_work_package_activities1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_work_package_relations1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_work_packages1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_actions1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_boards1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_capabilities1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_categories1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_documents1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_grids1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_my_open_work_packages1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_news1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_priorities1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_project_memberships1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_project_phase_definitions1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_project_sprints1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_projects1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_relations1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_reminders1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_roles1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_sprints1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_statuses1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_time_entries1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_time_entry_activities1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_types1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_versions1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_views1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_work_package_attachments1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_work_package_file_links1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_work_package_reactions1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_work_package_watchers1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_work_packages1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedsearch_work_packages1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
  5. 7 tool updatesv0.3.5
    • Changedget_job_status2 fields changed
      • changedInput schema / properties / job_status_id / type
        Previous value: -"integer"New value: +"string"
      • changedOutput schema / properties / id / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedget_my_project_access2 fields changed
      • removedOutput schema / properties / project_links
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Project Links",
        -  "type": "array"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "project_id",
        -  "project_name",
        -  "project_identifier",
        -  "current_user_id",
        -  "current_user_name",
        -  "membership",
        -  "project_links",
        -  "inferred_is_project_admin",
        -  "inferred_can_edit_project",
        -  "inferred_can_manage_memberships",
        -  "inference_basis"
        -]New value: +[
        +  "project_id",
        +  "project_name",
        +  "project_identifier",
        +  "current_user_id",
        +  "current_user_name",
        +  "membership",
        +  "inferred_is_project_admin",
        +  "inferred_can_edit_project",
        +  "inferred_can_manage_memberships",
        +  "inference_basis"
        +]
    • Changedget_project_admin_context4 fields changed
      • addedOutput schema / $defs / ProjectRef
        Added value: +{
        +  "properties": {
        +    "id": {
        +      "title": "Id",
        +      "type": "integer"
        +    },
        +    "identifier": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "title": "Identifier"
        +    },
        +    "name": {
        +      "title": "Name",
        +      "type": "string"
        +    },
        +    "url": {
        +      "title": "Url",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "identifier",
        +    "name",
        +    "url"
        +  ],
        +  "title": "ProjectRef",
        +  "type": "object"
        +}
      • changedOutput schema / properties / available_parent_projects / items / $ref
        Previous value: -"#/$defs/ProjectSummary"New value: +"#/$defs/ProjectRef"
      • removedOutput schema / properties / project_links
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Project Links",
        -  "type": "array"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "project",
        -  "available_statuses",
        -  "available_parent_projects",
        -  "fields",
        -  "project_links"
        -]New value: +[
        +  "project",
        +  "available_statuses",
        +  "available_parent_projects",
        +  "fields"
        +]
    • Changedget_time_entry2 fields changed
      • addedOutput schema / properties / comment_length
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Comment Length"
        +}
      • addedOutput schema / properties / comment_truncated
        Added value: +{
        +  "default": false,
        +  "title": "Comment Truncated",
        +  "type": "boolean"
        +}
    • Changedget_work_package2 fields changed
      • changedOutput schema / properties / ancestors / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "additionalProperties": {
        -        "type": "string"
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / children / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "additionalProperties": {
        -        "type": "string"
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedget_work_package_relations2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Limit"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 1,
        +  "title": "Offset",
        +  "type": "integer"
        +}
    • Changedlist_relations2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Limit"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 1,
        +  "title": "Offset",
        +  "type": "integer"
        +}
  6. 51 tool updatesv0.3.3
    • Addedget_attachment
    • Addedget_board
    • Addedget_category
    • Addedget_current_user
    • Addedget_document
    • Addedget_grid
    • Addedget_instance_configuration
    • Addedget_job_status
    • Addedget_membership
    • Addedget_my_project_access
    • Addedget_priority
    • Addedget_project
    • Addedget_project_admin_context
    • Addedget_project_configuration
    • Addedget_project_phase_definition
    • Addedget_project_work_package_context
    • Addedget_sprint
    • Addedget_time_entry
    • Addedget_type
    • Addedget_version
    • Addedget_view
    • Addedget_wiki_page
    • Addedget_work_package
    • Addedget_work_package_activities
    • Addedget_work_package_relations
    • Addedget_work_packages
    • Addedlist_actions
    • Addedlist_boards
    • Addedlist_capabilities
    • Addedlist_categories
    • Addedlist_documents
    • Addedlist_grids
    • Addedlist_news
    • Addedlist_priorities
    • Addedlist_project_memberships
    • Addedlist_project_phase_definitions
    • Addedlist_projects
    • Addedlist_relations
    • Addedlist_reminders
    • Addedlist_roles
    • Addedlist_sprints
    • Addedlist_time_entries
    • Addedlist_time_entry_activities
    • Addedlist_types
    • Addedlist_versions
    • Addedlist_views
    • Addedlist_work_package_attachments
    • Addedlist_work_package_file_links
    • Addedlist_work_package_reactions
    • Addedlist_work_packages
    • Addedsearch_work_packages
  7. 59 tool updatesv0.3.0
    • Removedget_attachment
    • Removedget_board
    • Removedget_category
    • Removedget_current_user
    • Removedget_document
    • Removedget_grid
    • Removedget_group
    • Removedget_instance_configuration
    • Removedget_job_status
    • Removedget_membership
    • Removedget_my_preferences
    • Removedget_my_project_access
    • Removedget_priority
    • Removedget_project
    • Removedget_project_admin_context
    • Removedget_project_configuration
    • Removedget_project_phase_definition
    • Removedget_project_work_package_context
    • Changedget_status3 fields changed
      • addedOutput schema / properties / default_done_ratio
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Default Done Ratio"
        +}
      • addedOutput schema / properties / excluded_from_totals
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Excluded From Totals"
        +}
      • addedOutput schema / properties / is_readonly
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Is Readonly"
        +}
    • Removedget_time_entry
    • Removedget_type
    • Removedget_user
    • Removedget_version
    • Removedget_view
    • Removedget_wiki_page
    • Removedget_work_package
    • Removedget_work_package_activities
    • Removedget_work_package_relations
    • Removedget_work_packages
    • Removedlist_actions
    • Removedlist_boards
    • Removedlist_capabilities
    • Removedlist_categories
    • Removedlist_documents
    • Removedlist_grids
    • Removedlist_groups
    • Removedlist_news
    • Removedlist_notifications
    • Removedlist_principals
    • Removedlist_priorities
    • Removedlist_project_memberships
    • Removedlist_project_phase_definitions
    • Addedlist_project_sprints
    • Removedlist_projects
    • Removedlist_relations
    • Removedlist_reminders
    • Removedlist_roles
    • Removedlist_time_entries
    • Removedlist_time_entry_activities
    • Removedlist_types
    • Removedlist_users
    • Removedlist_versions
    • Removedlist_views
    • Removedlist_work_package_attachments
    • Removedlist_work_package_file_links
    • Removedlist_work_package_reactions
    • Removedlist_work_packages
    • Removedsearch_work_packages
    • Removedupdate_my_preferences
  8. 48 tool updatesv0.2.3
    • Removedget_custom_option
    • Removedget_help_text
    • Removedget_query_column
    • Removedget_query_filter
    • Removedget_query_filter_instance_schema
    • Removedget_query_operator
    • Removedget_query_sort_by
    • Changedget_work_package17 fields changed
      • addedInput schema / properties / text_limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Text Limit"
        +}
      • addedOutput schema / properties / ancestors
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ancestors"
        +}
      • addedOutput schema / properties / ancestors_truncated
        Added value: +{
        +  "default": false,
        +  "title": "Ancestors Truncated",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / author
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Author"
        +}
      • addedOutput schema / properties / category
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Category"
        +}
      • addedOutput schema / properties / children
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Children"
        +}
      • addedOutput schema / properties / children_truncated
        Added value: +{
        +  "default": false,
        +  "title": "Children Truncated",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / created_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Created At"
        +}
      • addedOutput schema / properties / derived_estimated_time
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Derived Estimated Time"
        +}
      • addedOutput schema / properties / derived_remaining_time
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Derived Remaining Time"
        +}
      • addedOutput schema / properties / description_length
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Description Length"
        +}
      • addedOutput schema / properties / description_truncated
        Added value: +{
        +  "default": false,
        +  "title": "Description Truncated",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / duration
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Duration"
        +}
      • addedOutput schema / properties / estimated_time
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Estimated Time"
        +}
      • addedOutput schema / properties / remaining_time
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Remaining Time"
        +}
      • addedOutput schema / properties / spent_time
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Spent Time"
        +}
      • addedOutput schema / properties / updated_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Updated At"
        +}
    • Changedget_work_package_activities2 fields changed
      • addedInput schema / properties / text_limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Text Limit"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "ActivitySummary": {
        -      "properties": {
        -        "comment": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Comment"
        -        },
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Created At"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Type"
        -        },
        -        "user": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "User"
        -        },
        -        "version": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Version"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "type",
        -        "version",
        -        "user",
        -        "comment",
        -        "created_at"
        -      ],
        -      "title": "ActivitySummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/ActivitySummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "ActivityListResult",
        -  "type": "object"
        -}New value: +null
    • Changedget_work_package_relations1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "RelationSummary": {
        -      "properties": {
        -        "description": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Description"
        -        },
        -        "from_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "From Id"
        -        },
        -        "from_subject": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "From Subject"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "to_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "To Id"
        -        },
        -        "to_subject": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "To Subject"
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Type"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "type",
        -        "description",
        -        "from_id",
        -        "from_subject",
        -        "to_id",
        -        "to_subject"
        -      ],
        -      "title": "RelationSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/RelationSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "RelationListResult",
        -  "type": "object"
        -}New value: +null
    • Addedget_work_packages
    • Changedlist_actions1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "ActionSummary": {
        -      "properties": {
        -        "description": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Description"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "string"
        -        },
        -        "modules": {
        -          "items": {
        -            "type": "string"
        -          },
        -          "title": "Modules",
        -          "type": "array"
        -        },
        -        "name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Name"
        -        },
        -        "url": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Url"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "description",
        -        "modules",
        -        "url"
        -      ],
        -      "title": "ActionSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/ActionSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "ActionListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_boards1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "BoardSummary": {
        -      "properties": {
        -        "can_delete": {
        -          "title": "Can Delete",
        -          "type": "boolean"
        -        },
        -        "can_update": {
        -          "title": "Can Update",
        -          "type": "boolean"
        -        },
        -        "filter_count": {
        -          "title": "Filter Count",
        -          "type": "integer"
        -        },
        -        "hidden": {
        -          "title": "Hidden",
        -          "type": "boolean"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "include_subprojects": {
        -          "title": "Include Subprojects",
        -          "type": "boolean"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "project": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project"
        -        },
        -        "project_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Id"
        -        },
        -        "public": {
        -          "title": "Public",
        -          "type": "boolean"
        -        },
        -        "show_hierarchies": {
        -          "title": "Show Hierarchies",
        -          "type": "boolean"
        -        },
        -        "starred": {
        -          "title": "Starred",
        -          "type": "boolean"
        -        },
        -        "timeline_visible": {
        -          "title": "Timeline Visible",
        -          "type": "boolean"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "project_id",
        -        "project",
        -        "public",
        -        "hidden",
        -        "starred",
        -        "include_subprojects",
        -        "show_hierarchies",
        -        "timeline_visible",
        -        "filter_count",
        -        "can_update",
        -        "can_delete",
        -        "url"
        -      ],
        -      "title": "BoardSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/BoardSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "BoardListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_capabilities1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "CapabilitySummary": {
        -      "properties": {
        -        "action_id": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Action Id"
        -        },
        -        "action_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Action Name"
        -        },
        -        "context": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Context"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "string"
        -        },
        -        "name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Name"
        -        },
        -        "principal_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Principal Id"
        -        },
        -        "principal_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Principal Name"
        -        },
        -        "url": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Url"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "action_id",
        -        "action_name",
        -        "principal_id",
        -        "principal_name",
        -        "context",
        -        "url"
        -      ],
        -      "title": "CapabilitySummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/CapabilitySummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "CapabilityListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_categories1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "CategorySummary": {
        -      "properties": {
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "is_default": {
        -          "title": "Is Default",
        -          "type": "boolean"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "project": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project"
        -        },
        -        "project_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Id"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "project_id",
        -        "project",
        -        "is_default",
        -        "url"
        -      ],
        -      "title": "CategorySummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/CategorySummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "CategoryListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_documents1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "DocumentSummary": {
        -      "properties": {
        -        "attachment_count": {
        -          "title": "Attachment Count",
        -          "type": "integer"
        -        },
        -        "can_update": {
        -          "title": "Can Update",
        -          "type": "boolean"
        -        },
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Created At"
        -        },
        -        "description": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Description"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "project": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project"
        -        },
        -        "project_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Id"
        -        },
        -        "title": {
        -          "title": "Title",
        -          "type": "string"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "title",
        -        "project_id",
        -        "project",
        -        "description",
        -        "created_at",
        -        "attachment_count",
        -        "can_update",
        -        "url"
        -      ],
        -      "title": "DocumentSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/DocumentSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "DocumentListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_grids1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "GridSummary": {
        -      "properties": {
        -        "column_count": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Column Count"
        -        },
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Created At"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "row_count": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Row Count"
        -        },
        -        "scope": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Scope"
        -        },
        -        "updated_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Updated At"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "row_count",
        -        "column_count",
        -        "scope",
        -        "created_at",
        -        "updated_at",
        -        "url"
        -      ],
        -      "title": "GridSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/GridSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "GridListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_groups1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "GroupSummary": {
        -      "properties": {
        -        "can_delete": {
        -          "title": "Can Delete",
        -          "type": "boolean"
        -        },
        -        "can_update": {
        -          "title": "Can Update",
        -          "type": "boolean"
        -        },
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Created At"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "member_count": {
        -          "title": "Member Count",
        -          "type": "integer"
        -        },
        -        "name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Name"
        -        },
        -        "updated_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Updated At"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "member_count",
        -        "created_at",
        -        "updated_at",
        -        "can_update",
        -        "can_delete",
        -        "url"
        -      ],
        -      "title": "GroupSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/GroupSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "GroupListResult",
        -  "type": "object"
        -}New value: +null
    • Removedlist_help_texts
    • Changedlist_my_open_work_packages1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "WorkPackageSummary": {
        -      "properties": {
        -        "assignee": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Assignee"
        -        },
        -        "description": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Description"
        -        },
        -        "display_id": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Display Id"
        -        },
        -        "due_date": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Due Date"
        -        },
        -        "has_description": {
        -          "title": "Has Description",
        -          "type": "boolean"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "percentage_complete": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Percentage Complete"
        -        },
        -        "priority": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Priority"
        -        },
        -        "project": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project"
        -        },
        -        "project_phase": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Phase"
        -        },
        -        "responsible": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Responsible"
        -        },
        -        "start_date": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Start Date"
        -        },
        -        "status": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Status"
        -        },
        -        "subject": {
        -          "title": "Subject",
        -          "type": "string"
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Type"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        },
        -        "version": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Version"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "display_id",
        -        "subject",
        -        "type",
        -        "status",
        -        "priority",
        -        "project_phase",
        -        "assignee",
        -        "responsible",
        -        "project",
        -        "version",
        -        "start_date",
        -        "due_date",
        -        "percentage_complete",
        -        "description",
        -        "has_description",
        -        "url"
        -      ],
        -      "title": "WorkPackageSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/WorkPackageSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "WorkPackageListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_news1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "NewsSummary": {
        -      "properties": {
        -        "author": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Author"
        -        },
        -        "can_delete": {
        -          "title": "Can Delete",
        -          "type": "boolean"
        -        },
        -        "can_update": {
        -          "title": "Can Update",
        -          "type": "boolean"
        -        },
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Created At"
        -        },
        -        "description": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Description"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "project": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project"
        -        },
        -        "project_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Id"
        -        },
        -        "summary": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Summary"
        -        },
        -        "title": {
        -          "title": "Title",
        -          "type": "string"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "title",
        -        "summary",
        -        "description",
        -        "project_id",
        -        "project",
        -        "author",
        -        "created_at",
        -        "can_update",
        -        "can_delete",
        -        "url"
        -      ],
        -      "title": "NewsSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/NewsSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "NewsListResult",
        -  "type": "object"
        -}New value: +null
    • Removedlist_non_working_days
    • Changedlist_notifications1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "NotificationSummary": {
        -      "properties": {
        -        "created_at": {
        -          "title": "Created At",
        -          "type": "string"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "project_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Id"
        -        },
        -        "project_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Name"
        -        },
        -        "read": {
        -          "title": "Read",
        -          "type": "boolean"
        -        },
        -        "reason": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Reason"
        -        },
        -        "subject": {
        -          "title": "Subject",
        -          "type": "string"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        },
        -        "work_package_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Work Package Id"
        -        },
        -        "work_package_subject": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Work Package Subject"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "subject",
        -        "reason",
        -        "read",
        -        "project_id",
        -        "project_name",
        -        "work_package_id",
        -        "work_package_subject",
        -        "created_at",
        -        "url"
        -      ],
        -      "title": "NotificationSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/NotificationSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "total",
        -    "results"
        -  ],
        -  "title": "NotificationListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_principals1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "PrincipalSummary": {
        -      "properties": {
        -        "email": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Email"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "login": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Login"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "status": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Status"
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Type"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "type",
        -        "name",
        -        "login",
        -        "email",
        -        "status",
        -        "url"
        -      ],
        -      "title": "PrincipalSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/PrincipalSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "PrincipalListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_priorities1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "PrioritySummary": {
        -      "properties": {
        -        "color": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Color"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "is_active": {
        -          "title": "Is Active",
        -          "type": "boolean"
        -        },
        -        "is_default": {
        -          "title": "Is Default",
        -          "type": "boolean"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "position": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Position"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "is_default",
        -        "is_active",
        -        "color",
        -        "position"
        -      ],
        -      "title": "PrioritySummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/PrioritySummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "PriorityListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_project_memberships1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "MembershipSummary": {
        -      "properties": {
        -        "can_update": {
        -          "title": "Can Update",
        -          "type": "boolean"
        -        },
        -        "can_update_immediately": {
        -          "title": "Can Update Immediately",
        -          "type": "boolean"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "principal_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Principal Id"
        -        },
        -        "principal_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Principal Name"
        -        },
        -        "project_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Id"
        -        },
        -        "project_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Name"
        -        },
        -        "role_ids": {
        -          "items": {
        -            "type": "integer"
        -          },
        -          "title": "Role Ids",
        -          "type": "array"
        -        },
        -        "role_names": {
        -          "items": {
        -            "type": "string"
        -          },
        -          "title": "Role Names",
        -          "type": "array"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "principal_id",
        -        "principal_name",
        -        "project_id",
        -        "project_name",
        -        "role_ids",
        -        "role_names",
        -        "can_update",
        -        "can_update_immediately",
        -        "url"
        -      ],
        -      "title": "MembershipSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/MembershipSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "MembershipListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_project_phase_definitions1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "ProjectPhaseDefinition": {
        -      "properties": {
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Created At"
        -        },
        -        "finish_gate": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Finish Gate"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "start_gate": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Start Gate"
        -        },
        -        "updated_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Updated At"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "start_gate",
        -        "finish_gate",
        -        "created_at",
        -        "updated_at",
        -        "url"
        -      ],
        -      "title": "ProjectPhaseDefinition",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/ProjectPhaseDefinition"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "ProjectPhaseDefinitionListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_projects2 fields changed
      • addedInput schema / properties / select
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Select"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "ProjectSummary": {
        -      "properties": {
        -        "active": {
        -          "anyOf": [
        -            {
        -              "type": "boolean"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Active"
        -        },
        -        "can_delete": {
        -          "default": false,
        -          "title": "Can Delete",
        -          "type": "boolean"
        -        },
        -        "can_update": {
        -          "default": false,
        -          "title": "Can Update",
        -          "type": "boolean"
        -        },
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Created At"
        -        },
        -        "description": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Description"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "identifier": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Identifier"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "parent_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Parent Id"
        -        },
        -        "parent_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Parent Name"
        -        },
        -        "public": {
        -          "anyOf": [
        -            {
        -              "type": "boolean"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Public"
        -        },
        -        "status": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Status"
        -        },
        -        "status_explanation": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Status Explanation"
        -        },
        -        "updated_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Updated At"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "identifier",
        -        "active",
        -        "description",
        -        "url"
        -      ],
        -      "title": "ProjectSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/ProjectSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "ProjectListResult",
        -  "type": "object"
        -}New value: +null
    • Removedlist_query_filter_instance_schemas
    • Changedlist_relations1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "RelationSummary": {
        -      "properties": {
        -        "description": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Description"
        -        },
        -        "from_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "From Id"
        -        },
        -        "from_subject": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "From Subject"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "to_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "To Id"
        -        },
        -        "to_subject": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "To Subject"
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Type"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "type",
        -        "description",
        -        "from_id",
        -        "from_subject",
        -        "to_id",
        -        "to_subject"
        -      ],
        -      "title": "RelationSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/RelationSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "RelationListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_reminders1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "ReminderSummary": {
        -      "properties": {
        -        "creator": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Creator"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "note": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Note"
        -        },
        -        "remind_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Remind At"
        -        },
        -        "url": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Url"
        -        },
        -        "work_package_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Work Package Id"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "remind_at",
        -        "note",
        -        "work_package_id",
        -        "creator",
        -        "url"
        -      ],
        -      "title": "ReminderSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/ReminderSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "ReminderListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_roles1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "RoleSummary": {
        -      "properties": {
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "url"
        -      ],
        -      "title": "RoleSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/RoleSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "RoleListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_statuses1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "StatusSummary": {
        -      "properties": {
        -        "color": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Color"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "is_closed": {
        -          "title": "Is Closed",
        -          "type": "boolean"
        -        },
        -        "is_default": {
        -          "title": "Is Default",
        -          "type": "boolean"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "position": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Position"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "is_default",
        -        "is_closed",
        -        "color",
        -        "position",
        -        "url"
        -      ],
        -      "title": "StatusSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/StatusSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "StatusListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_time_entries1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "TimeEntrySummary": {
        -      "properties": {
        -        "activity": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Activity"
        -        },
        -        "comment": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Comment"
        -        },
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Created At"
        -        },
        -        "end_time": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "End Time"
        -        },
        -        "entity_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Entity Id"
        -        },
        -        "entity_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Entity Name"
        -        },
        -        "entity_type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Entity Type"
        -        },
        -        "hours": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Hours"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "ongoing": {
        -          "title": "Ongoing",
        -          "type": "boolean"
        -        },
        -        "project": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project"
        -        },
        -        "spent_on": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Spent On"
        -        },
        -        "start_time": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Start Time"
        -        },
        -        "updated_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Updated At"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        },
        -        "user": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "User"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "project",
        -        "entity_type",
        -        "entity_id",
        -        "entity_name",
        -        "user",
        -        "activity",
        -        "hours",
        -        "spent_on",
        -        "start_time",
        -        "end_time",
        -        "ongoing",
        -        "comment",
        -        "created_at",
        -        "updated_at",
        -        "url"
        -      ],
        -      "title": "TimeEntrySummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/TimeEntrySummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "TimeEntryListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_time_entry_activities1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "TimeEntryActivitySummary": {
        -      "properties": {
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "is_default": {
        -          "title": "Is Default",
        -          "type": "boolean"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "position": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Position"
        -        },
        -        "projects": {
        -          "items": {
        -            "type": "string"
        -          },
        -          "title": "Projects",
        -          "type": "array"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "position",
        -        "is_default",
        -        "projects",
        -        "url"
        -      ],
        -      "title": "TimeEntryActivitySummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/TimeEntryActivitySummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "TimeEntryActivityListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_types1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "TypeSummary": {
        -      "properties": {
        -        "color": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Color"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "is_default": {
        -          "title": "Is Default",
        -          "type": "boolean"
        -        },
        -        "is_milestone": {
        -          "title": "Is Milestone",
        -          "type": "boolean"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "position": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Position"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "color",
        -        "position",
        -        "is_default",
        -        "is_milestone",
        -        "url"
        -      ],
        -      "title": "TypeSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/TypeSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "TypeListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_users2 fields changed
      • addedInput schema / properties / select
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Select"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "UserSummary": {
        -      "properties": {
        -        "admin": {
        -          "anyOf": [
        -            {
        -              "type": "boolean"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Admin"
        -        },
        -        "avatar_url": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Avatar Url"
        -        },
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Created At"
        -        },
        -        "email": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Email"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "locked": {
        -          "anyOf": [
        -            {
        -              "type": "boolean"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Locked"
        -        },
        -        "login": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Login"
        -        },
        -        "name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Name"
        -        },
        -        "status": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Status"
        -        },
        -        "updated_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Updated At"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "login",
        -        "email",
        -        "status",
        -        "admin",
        -        "locked",
        -        "avatar_url",
        -        "created_at",
        -        "updated_at",
        -        "url"
        -      ],
        -      "title": "UserSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/UserSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "UserListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_versions1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "VersionSummary": {
        -      "properties": {
        -        "defining_project": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Defining Project"
        -        },
        -        "description": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Description"
        -        },
        -        "end_date": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "End Date"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "sharing": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Sharing"
        -        },
        -        "start_date": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Start Date"
        -        },
        -        "status": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Status"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "status",
        -        "sharing",
        -        "start_date",
        -        "end_date",
        -        "defining_project",
        -        "description",
        -        "url"
        -      ],
        -      "title": "VersionSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/VersionSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "VersionListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_views1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "ViewSummary": {
        -      "properties": {
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Created At"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "project": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project"
        -        },
        -        "project_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Id"
        -        },
        -        "public": {
        -          "title": "Public",
        -          "type": "boolean"
        -        },
        -        "query": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Query"
        -        },
        -        "query_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Query Id"
        -        },
        -        "starred": {
        -          "title": "Starred",
        -          "type": "boolean"
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Type"
        -        },
        -        "updated_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Updated At"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "type",
        -        "name",
        -        "project_id",
        -        "project",
        -        "query_id",
        -        "query",
        -        "public",
        -        "starred",
        -        "created_at",
        -        "updated_at",
        -        "url"
        -      ],
        -      "title": "ViewSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/ViewSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "ViewListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_work_package_attachments1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "AttachmentSummary": {
        -      "properties": {
        -        "author": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Author"
        -        },
        -        "container_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Container Id"
        -        },
        -        "container_type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Container Type"
        -        },
        -        "content_type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Content Type"
        -        },
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Created At"
        -        },
        -        "description": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Description"
        -        },
        -        "download_url": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Download Url"
        -        },
        -        "file_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "File Name"
        -        },
        -        "file_size": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "File Size"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "status": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Status"
        -        },
        -        "title": {
        -          "title": "Title",
        -          "type": "string"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "title",
        -        "file_name",
        -        "file_size",
        -        "description",
        -        "content_type",
        -        "status",
        -        "author",
        -        "container_type",
        -        "container_id",
        -        "created_at",
        -        "download_url",
        -        "url"
        -      ],
        -      "title": "AttachmentSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/AttachmentSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "AttachmentListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_work_package_file_links1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "FileLinkSummary": {
        -      "properties": {
        -        "created_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Created At"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "storage_id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Storage Id"
        -        },
        -        "storage_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Storage Name"
        -        },
        -        "title": {
        -          "title": "Title",
        -          "type": "string"
        -        },
        -        "updated_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Updated At"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "title",
        -        "storage_id",
        -        "storage_name",
        -        "created_at",
        -        "updated_at",
        -        "url"
        -      ],
        -      "title": "FileLinkSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/FileLinkSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "FileLinkListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_work_package_reactions1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "EmojiReactionSummary": {
        -      "properties": {
        -        "count": {
        -          "title": "Count",
        -          "type": "integer"
        -        },
        -        "emoji": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Emoji"
        -        },
        -        "reaction": {
        -          "title": "Reaction",
        -          "type": "string"
        -        },
        -        "users": {
        -          "items": {
        -            "type": "string"
        -          },
        -          "title": "Users",
        -          "type": "array"
        -        }
        -      },
        -      "required": [
        -        "reaction",
        -        "emoji",
        -        "count",
        -        "users"
        -      ],
        -      "title": "EmojiReactionSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/EmojiReactionSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "EmojiReactionListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_work_package_watchers1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "WatcherSummary": {
        -      "properties": {
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "login": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Login"
        -        },
        -        "name": {
        -          "title": "Name",
        -          "type": "string"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "login",
        -        "url"
        -      ],
        -      "title": "WatcherSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/WatcherSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "count",
        -    "results"
        -  ],
        -  "title": "WatcherListResult",
        -  "type": "object"
        -}New value: +null
    • Changedlist_work_packages14 fields changed
      • addedInput schema / properties / assignee
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Assignee"
        +}
      • addedInput schema / properties / created_between
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Created Between"
        +}
      • addedInput schema / properties / created_on
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Created On"
        +}
      • addedInput schema / properties / due_between
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Due Between"
        +}
      • addedInput schema / properties / due_on
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Due On"
        +}
      • addedInput schema / properties / group_by
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Group By"
        +}
      • removedInput schema / properties / has_description
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Has Description"
        -}
      • addedInput schema / properties / priority
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Priority"
        +}
      • addedInput schema / properties / select
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Select"
        +}
      • addedInput schema / properties / sort_by
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Sort By"
        +}
      • addedInput schema / properties / status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Status"
        +}
      • addedInput schema / properties / updated_between
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Updated Between"
        +}
      • addedInput schema / properties / updated_on
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Updated On"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "WorkPackageSummary": {
        -      "properties": {
        -        "assignee": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Assignee"
        -        },
        -        "description": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Description"
        -        },
        -        "display_id": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Display Id"
        -        },
        -        "due_date": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Due Date"
        -        },
        -        "has_description": {
        -          "title": "Has Description",
        -          "type": "boolean"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "percentage_complete": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Percentage Complete"
        -        },
        -        "priority": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Priority"
        -        },
        -        "project": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project"
        -        },
        -        "project_phase": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Phase"
        -        },
        -        "responsible": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Responsible"
        -        },
        -        "start_date": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Start Date"
        -        },
        -        "status": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Status"
        -        },
        -        "subject": {
        -          "title": "Subject",
        -          "type": "string"
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Type"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        },
        -        "version": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Version"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "display_id",
        -        "subject",
        -        "type",
        -        "status",
        -        "priority",
        -        "project_phase",
        -        "assignee",
        -        "responsible",
        -        "project",
        -        "version",
        -        "start_date",
        -        "due_date",
        -        "percentage_complete",
        -        "description",
        -        "has_description",
        -        "url"
        -      ],
        -      "title": "WorkPackageSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/WorkPackageSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "WorkPackageListResult",
        -  "type": "object"
        -}New value: +null
    • Removedlist_working_days
    • Removedrender_text
    • Changedsearch_work_packages12 fields changed
      • addedInput schema / properties / assignee
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Assignee"
        +}
      • addedInput schema / properties / created_between
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Created Between"
        +}
      • addedInput schema / properties / created_on
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Created On"
        +}
      • addedInput schema / properties / due_between
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Due Between"
        +}
      • addedInput schema / properties / due_on
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Due On"
        +}
      • addedInput schema / properties / group_by
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Group By"
        +}
      • addedInput schema / properties / priority
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Priority"
        +}
      • addedInput schema / properties / select
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Select"
        +}
      • addedInput schema / properties / sort_by
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Sort By"
        +}
      • addedInput schema / properties / updated_between
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Updated Between"
        +}
      • addedInput schema / properties / updated_on
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Updated On"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "WorkPackageSummary": {
        -      "properties": {
        -        "assignee": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Assignee"
        -        },
        -        "description": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Description"
        -        },
        -        "display_id": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Display Id"
        -        },
        -        "due_date": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Due Date"
        -        },
        -        "has_description": {
        -          "title": "Has Description",
        -          "type": "boolean"
        -        },
        -        "id": {
        -          "title": "Id",
        -          "type": "integer"
        -        },
        -        "percentage_complete": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Percentage Complete"
        -        },
        -        "priority": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Priority"
        -        },
        -        "project": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project"
        -        },
        -        "project_phase": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Project Phase"
        -        },
        -        "responsible": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Responsible"
        -        },
        -        "start_date": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Start Date"
        -        },
        -        "status": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Status"
        -        },
        -        "subject": {
        -          "title": "Subject",
        -          "type": "string"
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Type"
        -        },
        -        "url": {
        -          "title": "Url",
        -          "type": "string"
        -        },
        -        "version": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Version"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "display_id",
        -        "subject",
        -        "type",
        -        "status",
        -        "priority",
        -        "project_phase",
        -        "assignee",
        -        "responsible",
        -        "project",
        -        "version",
        -        "start_date",
        -        "due_date",
        -        "percentage_complete",
        -        "description",
        -        "has_description",
        -        "url"
        -      ],
        -      "title": "WorkPackageSummary",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "count": {
        -      "title": "Count",
        -      "type": "integer"
        -    },
        -    "limit": {
        -      "title": "Limit",
        -      "type": "integer"
        -    },
        -    "next_offset": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Next Offset"
        -    },
        -    "offset": {
        -      "title": "Offset",
        -      "type": "integer"
        -    },
        -    "results": {
        -      "items": {
        -        "$ref": "#/$defs/WorkPackageSummary"
        -      },
        -      "title": "Results",
        -      "type": "array"
        -    },
        -    "total": {
        -      "title": "Total",
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "title": "Truncated",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "offset",
        -    "limit",
        -    "total",
        -    "count",
        -    "next_offset",
        -    "truncated",
        -    "results"
        -  ],
        -  "title": "WorkPackageListResult",
        -  "type": "object"
        -}New value: +null
    • Changedupdate_my_preferences1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "$defs": {
        -    "UserPreferences": {
        -      "properties": {
        -        "auto_hide_popups": {
        -          "anyOf": [
        -            {
        -              "type": "boolean"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Auto Hide Popups"
        -        },
        -        "comment_sort_descending": {
        -          "anyOf": [
        -            {
        -              "type": "boolean"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Comment Sort Descending"
        -        },
        -        "id": {
        -          "anyOf": [
        -            {
        -              "type": "integer"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Id"
        -        },
        -        "lang": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Lang"
        -        },
        -        "notifications_reminder_time": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Notifications Reminder Time"
        -        },
        -        "time_zone": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Time Zone"
        -        },
        -        "updated_at": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Updated At"
        -        },
        -        "warn_on_leaving_unsaved": {
        -          "anyOf": [
        -            {
        -              "type": "boolean"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "title": "Warn On Leaving Unsaved"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "lang",
        -        "time_zone",
        -        "comment_sort_descending",
        -        "warn_on_leaving_unsaved",
        -        "auto_hide_popups",
        -        "notifications_reminder_time",
        -        "updated_at"
        -      ],
        -      "title": "UserPreferences",
        -      "type": "object"
        -    }
        -  },
        -  "properties": {
        -    "action": {
        -      "title": "Action",
        -      "type": "string"
        -    },
        -    "confirmed": {
        -      "title": "Confirmed",
        -      "type": "boolean"
        -    },
        -    "message": {
        -      "title": "Message",
        -      "type": "string"
        -    },
        -    "payload": {
        -      "additionalProperties": true,
        -      "title": "Payload",
        -      "type": "object"
        -    },
        -    "ready": {
        -      "title": "Ready",
        -      "type": "boolean"
        -    },
        -    "requires_confirmation": {
        -      "title": "Requires Confirmation",
        -      "type": "boolean"
        -    },
        -    "result": {
        -      "anyOf": [
        -        {
        -          "$ref": "#/$defs/UserPreferences"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    }
        -  },
        -  "required": [
        -    "action",
        -    "confirmed",
        -    "requires_confirmation",
        -    "ready",
        -    "message",
        -    "payload",
        -    "result"
        -  ],
        -  "title": "UserPreferencesWriteResult",
        -  "type": "object"
        -}New value: +null
  9. 74 tool updatesv0.2.2
    • First observedget_attachment
    • First observedget_board
    • First observedget_category
    • First observedget_current_user
    • First observedget_custom_option
    • First observedget_document
    • First observedget_grid
    • First observedget_group
    • First observedget_help_text
    • First observedget_instance_configuration
    • First observedget_job_status
    • First observedget_membership
    • First observedget_my_preferences
    • First observedget_my_project_access
    • First observedget_news
    • First observedget_priority
    • First observedget_project
    • First observedget_project_admin_context
    • First observedget_project_configuration
    • First observedget_project_phase
    • First observedget_project_phase_definition
    • First observedget_project_work_package_context
    • First observedget_query_column
    • First observedget_query_filter
    • First observedget_query_filter_instance_schema
    • First observedget_query_operator
    • First observedget_query_sort_by
    • First observedget_status
    • First observedget_time_entry
    • First observedget_type
    • First observedget_user
    • First observedget_version
    • First observedget_view
    • First observedget_wiki_page
    • First observedget_work_package
    • First observedget_work_package_activities
    • First observedget_work_package_relations
    • First observedlist_actions
    • First observedlist_boards
    • First observedlist_capabilities
    • First observedlist_categories
    • First observedlist_documents
    • First observedlist_grids
    • First observedlist_groups
    • First observedlist_help_texts
    • First observedlist_my_open_work_packages
    • First observedlist_news
    • First observedlist_non_working_days
    • First observedlist_notifications
    • First observedlist_principals
    • First observedlist_priorities
    • First observedlist_project_memberships
    • First observedlist_project_phase_definitions
    • First observedlist_projects
    • First observedlist_query_filter_instance_schemas
    • First observedlist_relations
    • First observedlist_reminders
    • First observedlist_roles
    • First observedlist_statuses
    • First observedlist_time_entries
    • First observedlist_time_entry_activities
    • First observedlist_types
    • First observedlist_users
    • First observedlist_versions
    • First observedlist_views
    • First observedlist_work_package_attachments
    • First observedlist_work_package_file_links
    • First observedlist_work_package_reactions
    • First observedlist_work_package_watchers
    • First observedlist_work_packages
    • First observedlist_working_days
    • First observedrender_text
    • First observedsearch_work_packages
    • First observedupdate_my_preferences

TDQS

B3.4/5.0

Scored across 147 tools

Disambiguation3/5

Descriptions are unusually detailed and explicitly cross-reference each other, which rescues many boundaries. However, there is genuine overlap in the work-package listing family (list_work_packages, search_work_packages, list_my_open_work_packages, execute_query, get_work_packages) and in paired tools like create_time_entry vs create_time_entry_until and list_work_package_relations vs list_relations. An agent can usually pick correctly after reading, but misselection is easy without the docstrings.

Naming Consistency4/5

Names overwhelmingly follow a snake_case verb_noun pattern (list_/get_/create_/update_/delete_ + resource), consistently across projects, work packages, meetings, memberships, etc. A few outliers exist (execute_query, toggle_activity_emoji_reaction, get_project_work_package_context, bulk_* prefixes), but they are readable and follow their own sub-convention.

Tool Count1/5

147 tools is far beyond any reasonable surface for an agent-facing MCP server; the rules mark 50+ as an extreme mismatch. While the domain (a full project-management suite) is broad, this count imposes heavy context cost and makes tool selection error-prone even with excellent descriptions.

Completeness4/5

Coverage is very broad: full CRUD for projects, work packages, relations, time entries, versions, memberships, meetings/series/agenda/outcomes, boards, grids, news, and many read-only integrations, with upstream limitations (wiki body text, posts, cost entries, statuses/types) clearly explained. Minor gaps remain—notably no create/delete for documents, and write operations for sprints/backlog buckets are absent—but they are narrow.

Maintenance

ActivityActive
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that connects Claude Desktop to your OpenProject instance, allowing you to manage projects, tasks, and time entries through natural language.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server enabling AI agents to interact with OpenProject API v3 for project management, including creating and managing work packages, projects, comments, time entries, boards, and user dashboards.
    52 npm
    MIT