Skip to main content
Glama

search_work_packages

Search work packages by subject text or numeric ID across projects, and filter by project, status, assignee, priority, or date ranges.

Instructions

Search work packages by free text, optionally scoped to a project.

query 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, query is always also resolved directly (numeric id or display id like "PROJ-42") the same way get_work_package does. When that resolves to a work package that also satisfies every other filter given here (project/status/assignee/dates/ 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 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.

sort_by accepts a list of sort criteria in format "field:direction" (e.g., ["status:desc", "priority:asc"]). Direction defaults to "asc" if omitted. Common sortable fields: id, subject, status, priority, type, assignee, author, created_at, updated_at, start_date, due_date.

group_by accepts a field name to group results by (e.g., "status", "assignee"). Common groupable fields: status, priority, type, assignee, author, version, category.

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, ignore_non_working_days. 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.

limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. total is the real matching count only when the query is provably restricted to OPENPROJECT_READ_PROJECTS server-side — scope is unrestricted, or an explicit project was given. Otherwise (no project, restricted scope) 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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
due_onNo
offsetNo
selectNo
statusNo
projectNo
sort_byNo
assigneeNo
group_byNo
priorityNo
open_onlyNo
created_onNo
updated_onNo
assignee_meNo
due_betweenNo
created_betweenNo
updated_betweenNo

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed1 schema field changedv0.3.7
    • addedInput schema / additionalProperties
      Added value: +false
  2. Addedv0.3.3
  3. Removedv0.3.0
  4. Changed12 schema fields changedv0.2.3
    • 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
  5. First observedv0.2.2

TDQS

A5/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden—and it delivers extensively. It discloses the exact_match parallel resolution, its absence conditions, the total/count/pagination fallback behavior for restricted scopes, the security reason behind it, and version-dependent parent_display_id 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?

Although long, the description is efficiently structured: a clear opening purpose, then logically grouped parameter semantics, scoping rules, pagination caveats, and field nuances. Every sentence adds operational value, and critical limitations like exact_match and total fallback are front-loaded enough to prevent misuse.

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 an 18-parameter tool with no output schema and no annotations, this description is remarkably complete. It covers match behavior, filters, date handling, sorting, grouping, selection, pagination, total fallback, scope restrictions, and even OpenProject version differences—leaving no significant gap for safe invocation.

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 description coverage is 0%, so the description must compensate, and it does comprehensively. It explains query semantics, date formats and inclusive ranges, _on/_between exclusivity, assignee_me precedence, sort direction defaults, groupable fields, select behavior, limit cap, and offset continuation—far beyond the bare schema names.

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 opens with a specific verb and resource: 'Search work packages by free text, optionally scoped to a project.' It further distinguishes itself from siblings by explicitly routing version-filtering to list_work_packages and by clarifying that the query matches only subject and numeric ID, not other fields.

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 gives explicit when-to-use guidance and names alternatives: 'To filter by version, use list_work_packages(version=..., project=...) instead.' It also explains scoping behavior with and without project, status/assignee/priority filtering semantics, and pagination via next_offset, leaving little to inference.

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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jtauschl/openproject-ce-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server