Skip to main content
Glama

openproject-mcp

MCP (Model Context Protocol) server for OpenProject β€” gives AI agents (ZCode, Claude Desktop, etc.) a limited set of operations over OpenProject via the REST API v3:

  • πŸ” Search work packages β€” by subject, ID, status, project, assignee

  • πŸ“„ Work package details β€” all fields, description, optional comments and attachments

  • πŸ’¬ Add comments to work packages

  • πŸ“Ž Upload files (attachments) to work packages

  • ⏱ Log time (time entries)

  • πŸ“Š Time report for a period β€” grouped by project with a total

  • πŸ—‚ List projects β€” all projects, parent's subprojects, or the full hierarchy tree

  • πŸ‘€ Search users β€” by name or login (to obtain IDs)

Русская вСрсия

Three transports are supported (selected by the MCP_TRANSPORT variable or the --transport flag):

Transport

Purpose

stdio

Local clients (ZCode, etc.): the server runs as a subprocess and talks over stdin/stdout. Default.

streamable-http

Modern MCP HTTP transport (endpoint /mcp). Recommended for Docker / a networked microservice.

sse

Legacy HTTP transport (/sse + /messages/). For old clients that do not support streamable-http.

Why a custom server when OpenProject 17.2 has a built-in MCP? The built-in one is Enterprise-only and read-only. This server works with any edition (including Community) and supports write operations: comments, files, time.


Requirements

  • Python 3.10+ (tested on 3.13)

  • Access to an OpenProject instance with the API enabled (Personal Access Token)

  • Token permissions: view work packages/projects, add work package notes (comments), log time, add attachments (edit work package or add attachments)

  • For HTTP/Docker β€” Docker (or any ASGI server; uvicorn is included as a dependency)

Related MCP server: OpenProject MCP

Installation

Option A β€” via uv (recommended, faster)

cd path\to\openproject-mcp
uv venv
uv pip install -e ".[http]"     # [http] is only needed for the HTTP transport

Option B β€” via standard pip

cd path\to\openproject-mcp
python -m venv .venv
.venv\Scripts\activate
pip install -e ".[http]"        # for stdio, `pip install -e .` is enough

After installation both the openproject-mcp command and python -m openproject_mcp are available.

Configuration

Variables are grouped by prefix to avoid confusion:

  • op_ β€” connection to OpenProject (where we talk to)

  • mcp_ β€” settings of the MCP service itself (how it works)

Copy the example and fill in your values:

copy .env.example .env          # Windows
cp .env.example .env            # Linux/macOS

Environment variables

Variable

Prefix

Required

Description

OP_URL

op

βœ…

Base URL of your OpenProject without a trailing /. Example: https://openproject.example.com

OP_API_KEY

op

βœ…

Personal API token. Created in profile settings β†’ Access tokens. Requires the administrator setting "Enable API tokens".

MCP_TRANSPORT

mcp

❌

stdio (default) | streamable-http | sse

MCP_BIND

mcp

❌

HTTP transport address as host:port (IPv6: [address]:port). Default 127.0.0.1:8000. In Docker β€” 0.0.0.0:8000. Ignored for stdio.

MCP_AUTH_TOKEN

mcp

❌

Optional Bearer token protecting the HTTP endpoint. Empty = no auth (trusted network / reverse proxy only). Clients send Authorization: Bearer <value>.

MCP_ALLOWED_HOSTS

mcp

❌

Comma-separated host list (DNS-rebinding protection). Suffix :* β€” any port. Example: mcp.corp.local,mcp.corp.local:*. Empty = host protection disabled (see the "Host allowlist" section).

MCP_LOG_LEVEL

mcp

❌

DEBUG / INFO / WARNING / ERROR. Default INFO. Logs go to stderr.

Variables can also be set without a .env β€” directly in the client config or at container startup.

Getting an API token

  1. Sign in to OpenProject.

  2. Profile icon (top right) β†’ My account β†’ Access tokens.

  3. Click + API token, give it a name (e.g. "MCP"), copy the value.

  4. If the section is unavailable, an administrator must enable Enable API tokens in Administration β†’ … (or grant your account the right).

The token is shown only once β€” save it right away.


Running

stdio (local client)

openproject-mcp                 # MCP_TRANSPORT=stdio (default)

The server starts and waits for client commands over stdin/stdout. Stop with Ctrl+C.

streamable-http / sse (HTTP service)

openproject-mcp --transport streamable-http --bind 0.0.0.0:8000
# or via environment variables:
#   MCP_TRANSPORT=streamable-http MCP_BIND=0.0.0.0:8000 openproject-mcp

Health check:

curl http://127.0.0.1:8000/health        # β†’ {"status": "ok"}  (no auth required)

CLI arguments (override env; precedence: CLI > env > default):

Argument

Description

--transport {stdio,streamable-http,sse}

Transport

--bind HOST:PORT

Address for HTTP (IPv6: [address]:port). Ignored for stdio.

--log-level LEVEL

DEBUG / INFO / WARNING / ERROR


Docker

The microservice is built into a portable image and runs as an HTTP service (streamable-http by default). Secrets (OP_URL, OP_API_KEY, MCP_AUTH_TOKEN) are passed at runtime β€” not baked into the image.

⚠️ Security. The server opens write operations to OpenProject (comments, files, time). On any network except a fully isolated one, set MCP_AUTH_TOKEN or keep the service behind an authenticated reverse proxy.

Build and run

# Build the image
docker build -t openproject-mcp .

# Run (secrets via -e / --env-file)
docker run --rm -p 8000:8000 \
  -e OP_URL=https://openproject.example.com \
  -e OP_API_KEY=your_api_token_here \
  -e MCP_AUTH_TOKEN=choose_a_secret \
  openproject-mcp

Health check:

curl http://localhost:8000/health                                    # 200
curl -H "Authorization: Bearer choose_a_secret" \
     -H "Content-Type: application/json" \
     -H "Accept: application/json, text/event-stream" \
     -X POST http://localhost:8000/mcp \
     -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}'

docker compose

Easier via docker-compose.yml (reads .env):

cp .env.example .env           # fill in OP_URL / OP_API_KEY / MCP_AUTH_TOKEN
docker compose up --build      # build + start
docker compose logs -f         # logs
docker compose down            # stop

After startup the MCP endpoint is http://localhost:8000/mcp, health at /health.

Container variables

The image sets the defaults MCP_TRANSPORT=streamable-http and MCP_BIND=0.0.0.0:8000 (overridable at runtime). The following are passed in explicitly:

  • OP_URL, OP_API_KEY β€” connection to OpenProject;

  • MCP_AUTH_TOKEN β€” endpoint protection (recommended);

  • MCP_ALLOWED_HOSTS β€” see below.

Host allowlist (DNS-rebinding protection)

By default the MCP SDK accepts HTTP requests only to localhost β€” in Docker (even on 0.0.0.0) or behind a reverse proxy this yields HTTP 421 on every request. This server behaves in a hybrid way:

  • If MCP_ALLOWED_HOSTS is set (e.g. mcp.corp.local,mcp.corp.local:*) β€” protection is enabled with that host list.

  • If empty β€” protection is disabled; the server relies on Bearer auth (MCP_AUTH_TOKEN), a reverse proxy, or network isolation.

If you see 421 "Invalid Host header" β€” either set MCP_ALLOWED_HOSTS with the hostname your clients connect to, or (for an internal network) leave it empty and protect the endpoint with MCP_AUTH_TOKEN.


Client integration

stdio (ZCode, Claude Desktop β€” local subprocess)

Add the configuration to your MCP client's settings file.

{
  "mcpServers": {
    "openproject": {
      "command": "C:\\path\\to\\project\\.venv\\Scripts\\python.exe",
      "args": ["-m", "openproject_mcp"],
      "env": {
        "OP_URL": "https://openproject.example.com",
        "OP_API_KEY": "your_api_token_here",
        "MCP_TRANSPORT": "stdio",
        "MCP_LOG_LEVEL": "INFO"
      }
    }
  }
}

Paths in JSON on Windows require a double backslash \\ or forward slashes. If a .env exists in the working directory, the env block can be omitted, but explicit variables are more reliable (they do not depend on the working directory at launch).

Alternative via console script (if openproject-mcp is on your PATH):

{
  "mcpServers": {
    "openproject": {
      "command": "C:\\path\\to\\project\\.venv\\Scripts\\openproject-mcp.exe",
      "args": [],
      "env": { "OP_URL": "https://openproject.example.com", "OP_API_KEY": "..." }
    }
  }
}

After saving the config, restart the client (or reconnect the MCP server). The tools with the op_* prefix will appear in the tool list.

streamable-http (remote microservice)

The client connects to the HTTP endpoint by URL and (if MCP_AUTH_TOKEN is set) sends the authorization header. The exact format depends on the client; for ZCode this is an MCP server section of type http/url:

{
  "mcpServers": {
    "openproject": {
      "type": "http",
      "url": "http://mcp.corp.local:8000/mcp",
      "headers": {
        "Authorization": "Bearer choose_a_secret"
      }
    }
  }
}

With MCP_TRANSPORT=sse the endpoints change to /sse (GET, stream) and /messages/ (POST) β€” use your client's SSE mode.


Tools

Tool

Purpose

Key parameters

op_check_connection

Check URL + token

β€”

op_search_work_packages

Search work packages

subject (a string or a list of synonyms, searched in subject with an automatic description fallback), status (open/closed/all), project_id, assignee_id, type_id, filters (JSON), page_size, offset, sort_by

op_get_work_package

Details of one work package

work_package_id, include_comments, include_attachments

op_list_projects

List projects / subprojects / tree

name (a string or a list of synonyms, with a description fallback), parent_id, direct_children_only, active, filters (JSON), page_size, offset, sort_by, as_tree

op_add_comment

Comment on a work package

work_package_id, comment, internal

op_add_attachment

Upload a file

work_package_id, file_path (absolute path), file_name

op_log_time

Log time

work_package_id, hours (1.5h/2h30m/90m/1:30/PT1H30M), activity_id, spent_on (YYYY-MM-DD), comment

op_list_time_entries

Time report for a period

user_id ('me' or ID), date_from/date_to (YYYY-MM-DD), project_id, activity_id, include_comments, page_size, offset, sort_by

op_list_users

Search users

query (name or login), filters (JSON), page_size, offset

op_list_time_entry_activities

Time-entry activity reference

β€”

Tools are available over any transport β€” behavior is identical for stdio and HTTP.

Usage examples

Find open work packages in project #5 assigned to me:

op_search_work_packages(project_id="5", status="open", assignee_id="me", page_size=10)

Find a work package by subject (one term or synonyms):

op_search_work_packages(subject="login")                         # one term
op_search_work_packages(subject=["bug", "defect", "issue"])      # synonyms β†’ OR, deduplicated

Search goes through the work package subject first; if nothing is found it automatically falls back to the description. With no matches an empty list is returned (not the whole backlog).

Find a project by name:

op_list_projects(name="demo")
op_list_projects(name=["demo", "test"])          # synonyms, description fallback

All projects or the hierarchy tree:

op_list_projects()                              # flat list of all projects
op_list_projects(as_tree=True)                  # tree: roots β†’ children β†’ ...
op_list_projects(active=True)                   # only active projects

Subprojects of a specific project:

op_list_projects(parent_id="1")                              # full subtree (any depth)
op_list_projects(parent_id="1", direct_children_only=True)   # only direct children

Add a comment to work package #42:

op_add_comment(work_package_id=42, comment="Verified, the bug reproduces", internal=True)

Log 1.5 hours against work package #42:

op_log_time(work_package_id=42, hours="1.5h", activity_id=1, comment="Debugging")

Upload a file to work package #42:

op_add_attachment(work_package_id=42, file_path="C:\\reports\\bug.png")

Time report for a period (for me, for July):

# "for July" β†’ date_from/date_to (the agent computes month boundaries itself)
op_list_time_entries(user_id="me", date_from="2026-07-01", date_to="2026-07-31")
# numbers only, no comments:
op_list_time_entries(user_id="me", date_from="2026-07-01", date_to="2026-07-31", include_comments=False)
# for a specific project:
op_list_time_entries(user_id="me", project_id="1", date_from="2026-07-01", date_to="2026-07-31")

Returns entries grouped by project, with per-project hour totals and a grand total.

Find a user by name (to substitute the ID):

op_list_users(query="Ivanov")
# then use the found id in op_list_time_entries(user_id="...")

OpenProject version compatibility

The server is not tied to a version number and works with any OpenProject exposing API v3. The only dialect-dependent point is the work-package link in a time entry:

  • OpenProject 14+ β†’ _links.entity (/api/v3/work_packages/{id})

  • OpenProject ≀13 β†’ _links.workPackage

op_log_time automatically tries the modern entity field and, on a server rejection (HTTP 422), retries with the legacy workPackage field. The successful variant is cached, so subsequent writes avoid extra attempts. Search, comments and attachments are identical across versions.


Project structure

openproject-mcp/
β”œβ”€β”€ Dockerfile                 # microservice image (python:3.13-slim)
β”œβ”€β”€ docker-compose.yml         # local compose startup
β”œβ”€β”€ .dockerignore
β”œβ”€β”€ pyproject.toml             # hatchling; deps: mcp[cli], httpx, anyio; extra [http]: uvicorn[standard]
β”œβ”€β”€ .env.example               # config template (op_* / mcp_*)
β”œβ”€β”€ .env                       # real credentials (in .gitignore)
└── src/openproject_mcp/
    β”œβ”€β”€ __init__.py            # package version
    β”œβ”€β”€ __main__.py            # entry point: transport selection (stdio / http), CLI, stderr logging
    β”œβ”€β”€ config.py              # .env / environment variable loading, validation, security_settings()
    β”œβ”€β”€ client.py              # httpx client for API v3: auth, HAL errors, pagination
    β”œβ”€β”€ formatting.py          # HAL+JSON _links parsing, ISO8601 durations, filters
    β”œβ”€β”€ http_app.py            # HTTP app assembly: /health + optional Bearer auth
    └── server.py              # MCP tool registration (transport-independent)

Troubleshooting

  • "Configuration error: OP_URL is not set" β€” no .env in the working directory and the variables were not passed via env/-e.

  • HTTP 401 Unauthorized β€” missing/incorrect MCP_AUTH_TOKEN. The client must send Authorization: Bearer <value>.

  • HTTP 421 "Invalid Host header" β€” the host allowlist triggered. Either set MCP_ALLOWED_HOSTS with the hostname clients use, or leave it empty (protection is disabled) and secure with MCP_AUTH_TOKEN.

  • Connection fails in Docker β€” check that MCP_BIND=0.0.0.0:8000 (not 127.0.0.1) and the port is published (-p 8000:8000).

  • "Port already in use" β€” change the port in MCP_BIND/--bind and in the port mapping.

  • HTTP 401/403 from OpenProject β€” wrong/expired token or missing permissions. Check the token and its rights (add work package notes, log time).

  • HTTP 404 β€” the work package/project was not found or you have no view permission.

  • Need diagnostics β€” set MCP_LOG_LEVEL=DEBUG; logs go to stderr.

Testing

pip install -r requirements-dev.txt
pytest tests/

The integration tests hit a live OpenProject server configured via OP_URL / OP_API_KEY (or the repo's .env) and are skipped automatically when the server is not reachable.

License

MIT

Available Tools

10 tools
op_add_attachmentA

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΊΠ°ΠΊ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊ Π·Π°Π΄Π°Ρ‡Π΅.

OpenProject Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ multipart/form-data Ρ€ΠΎΠ²Π½ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… частСй: 'metadata' (JSON {fileName}) ΠΈ 'file' (сырыС Π±Π°ΠΉΡ‚Ρ‹).

Args: work_package_id: Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π·Π°Π΄Π°Ρ‡ΠΈ. file_path: ΠΠ±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ. file_name: Имя Ρ„Π°ΠΉΠ»Π° для сохранСния (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ бСрётся ΠΈΠ· file_path).

Returns: JSON с созданным Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ (id, fileName, fileSize, contentType, ссылка).

ParametersJSON Schema
NameRequiredDescriptionDefault
file_nameNo
file_pathYes
work_package_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description must fully disclose behavior. It explains the multipart format and the default file_name behavior, which adds valuable context. However, it does not mention permissions, error conditions, or side effects beyond the upload, leaving gaps 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.

Conciseness5/5

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

The description is well-structured with sections for operation, technical context, args, and returns. Every sentence serves a purpose, and the technical note about multipart/form-data is concise and informative without unnecessary verbosity.

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 covers the operation's purpose, required multipart format, all parameters, and return format. With an output schema present, the return explanation is a bonus. It lacks explicit usage exclusions or error semantics, but for a simple file upload tool, it is reasonably complete.

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 has 0% description coverage, but the description compensates with an Args section that explains each parameter clearly, including the default derivation for file_name. This goes beyond the schema's bare type declarations, though it does not specify constraints like file size or allowed characters.

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 the specific action 'Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΊΠ°ΠΊ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊ Π·Π°Π΄Π°Ρ‡Π΅' (upload file as attachment), clearly distinguishing it from sibling tools like op_add_comment or op_get_work_package. It uses a specific verb and resource, leaving no ambiguity about 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 first line provides a clear use case for the tool. It also includes a technical requirement for multipart/form-data, which implicitly advises on the expected input format. However, it does not explicitly mention alternatives or when-not-to-use, though the sibling tools are functionally distinct and not competing for the same action.

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

op_add_commentA

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ (Π·Π°ΠΌΠ΅Ρ‚ΠΊΡƒ) ΠΊ Π·Π°Π΄Π°Ρ‡Π΅.

Args: work_package_id: Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π·Π°Π΄Π°Ρ‡ΠΈ. comment: ВСкст коммСнтария. internal: True для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ коммСнтария (Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²Π° add_internal_comments).

Returns: JSON с созданной Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ (id, тСкст, Π°Π²Ρ‚ΠΎΡ€, Π΄Π°Ρ‚Π°).

ParametersJSON Schema
NameRequiredDescriptionDefault
commentYes
internalNo
work_package_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries full responsibility. It discloses the behavior of the 'internal' flag, notes the permission requirement ('add_internal_comments'), and describes the return format (JSON with id, text, author, date). This covers key behavioral traits, though it does not mention potential side effects or visibility rules beyond the permission note.

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 structured into a one-line summary, an 'Args' list, and a 'Returns' section. It is front-loaded, concise, and contains no fluff. Every sentence serves a purposeβ€”introduction, parameter explanations, and return formatβ€”making it highly efficient.

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, has an output schema (so return values need minimal explanation), and the description covers all parameters and the key behavioral nuance (internal permission). It could go further by clarifying ownership or posting context, but for a straightforward add-comment operation, it provides sufficient context.

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 schema provides only types and titles (0% description coverage), so the description must add meaning. It does so for all three parameters: work_package_id (task ID), comment (text), and internal (internal comment with permission requirement). This fully compensates for the schema's lack of descriptions.

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 begins with a clear, specific verb and resource: 'Add a comment (note) to a task.' This directly distinguishes it from sibling tools that search, list, get, attach, or log time. It unambiguously states the tool's action and target.

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 context ('add a comment to a task') but does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions or competing tools. Since the siblings are functionally distinct, the lack of explicit comparison is acceptable but still leaves room for guidance.

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

op_check_connectionA

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ соСдинСниС с OpenProject ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ API-Ρ‚ΠΎΠΊΠ΅Π½Π°.

Returns: JSON с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ: ok=true/false ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ± экзСмплярС/ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the burden of disclosing behavior. It states the tool verifies connection and token, and describes the return format. However, it does not mention potential side effects (likely none) or behavior like network timeouts, making it adequate but not deeply transparent.

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 sentences: the first states the purpose, the second outlines the return JSON. This is concise, well-structured, and front-loaded with no unnecessary 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?

Given the tool's simplicity (zero parameters) and the presence of an output schema, the description is reasonably complete. It explains the output format and the purpose, but could additionally mention that it is a safe read-only check, which would enhance completeness.

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 has zero parameters, so the empty schema requires no description. The description appropriately focuses on purpose and return values, achieving the baseline for a no-parameter tool.

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 clearly states the tool's function: verifying the connection to OpenProject and API token validity. This is distinct from sibling tools which handle work packages, projects, comments, etc., making the purpose 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 provides no guidance on when to use this tool versus alternatives. There is no mention of using it before other operations or as a diagnostic step, leaving the usage context implied rather than explicit.

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

op_get_work_packageA

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π·Π°Π΄Π°Ρ‡Π΅ ΠΏΠΎ Π΅Ρ‘ ID.

Args: work_package_id: Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π·Π°Π΄Π°Ρ‡ΠΈ. include_comments: Если True β€” Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ послСдниС ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ. include_attachments: Если True β€” Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ список Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Returns: JSON с ΠΏΠΎΠ»Π½Ρ‹ΠΌΠΈ полями Π·Π°Π΄Π°Ρ‡ΠΈ (Ρ‚Π΅ΠΌΠ°, описаниС, Ρ‚ΠΈΠΏ, статус, Π΄Π°Ρ‚Ρ‹, ΠΎΡ†Π΅Π½ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π°Π²Ρ‚ΠΎΡ€, отвСтствСнный, ссылки Π½Π° дСйствия) ΠΈ, ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ, коммСнтариями/влоТСниями.

ParametersJSON Schema
NameRequiredDescriptionDefault
work_package_idYes
include_commentsNo
include_attachmentsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

The description outlines the return structure (full task fields plus optional comments/attachments), which adds useful context. However, without annotations, it does not explicitly state that this is a read-only operation, nor does it mention permissions, error handling, or side effects. The focus is on the data returned rather than behavioral guarantees.

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 well-structured: a single-sentence purpose, followed by a concise Args section and a Returns section. Every sentence contributes necessary information without redundancy or fluff.

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 get-by-ID tool, the description covers purpose, parameters, and return value. The existence of an output schema is noted, and the description additionally enumerates return fields, which is helpful. It lacks explicit error case details, but this is not critical for such a straightforward read operation.

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 description provides clear explanations for all three parameters in the Args section, including the effect of include_comments and include_attachments. Since the schema has no descriptions for its parameters, this fully compensates for the missing schema coverage.

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 clearly states the tool's function: to get detailed information about a task by its ID. It uses a specific verb and resource, and the mention of 'by ID' distinguishes it from sibling tools like op_search_work_packages.

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 that the tool should be used when the agent already has a task ID, as indicated by 'by its ID.' However, it does not explicitly mention when not to use it or point to alternative tools for searching or other operations.

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

op_list_projectsA

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π² OpenProject.

Поиск ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ name) выполняСтся ΠΏΠΎ синонимам: ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°ΠΉΡ‚Π΅ сразу нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ (строка ΠΈΠ»ΠΈ список). ΠŸΡ€ΠΈΠΌΠ΅Ρ€: name=["Π΄Π΅ΠΌΠΎ", "тСстовый"]. НС добавляйтС ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄/Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ автоматичСски β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ явно попросил.

Π›ΠΎΠ³ΠΈΠΊΠ° поиска ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ:

  1. Π˜Ρ‰Π΅ΠΌ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ name ~) ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ синонима, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ объСдиняСм (Π˜Π›Π˜), Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ id.

  2. Если ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΠΈ include_description_fallback=True β€” повторяСм поиск ΠΏΠΎ описанию ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ description ~).

Π Π΅ΠΆΠΈΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ (Π±Π΅Π· ΡƒΡ‡Ρ‘Ρ‚Π° name):

  • Π‘Π΅Π· parent_id ΠΈ as_tree: плоский список всСх Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

  • Π‘ parent_id: ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. direct_children_only=False (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) β€” Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ ancestor, всё ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² любой Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹; direct_children_only=True β€” Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ parent_id, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прямыС Π΄Π΅Ρ‚ΠΈ.

  • as_tree=True: Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ всС Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΈ собираСт Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ Π² памяти ΠΏΠΎ _links.parent. ΠŸΡ€ΠΈ as_tree ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ name игнорируСтся (Π΄Π΅Ρ€Π΅Π²ΠΎ строится ΠΏΠΎ всСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ).

Если совпадСний ΠΏΠΎ name Π½Π΅Ρ‚, возвращаСтся пустой список с подсказкой.

Args: parent_id: ID ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°-родитСля. Если Π·Π°Π΄Π°Π½ β€” Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ as_tree=True. direct_children_only: True β†’ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прямыС Π΄Π΅Ρ‚ΠΈ parent_id (Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ parent_id). False β†’ всё ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² (Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ ancestor). active: Π€ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎ активности: True β†’ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅, False β†’ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅. None β†’ Π±Π΅Π· Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°. name: Имя ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ список синонимов (строка Π»ΠΈΠ±ΠΎ список строк). Поиск ΠΏΠΎ части ΠΈΠΌΠ΅Π½ΠΈ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ '~'), объСдинСниС Π˜Π›Π˜ ΠΌΠ΅ΠΆΠ΄Ρƒ синонимами. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: "Π΄Π΅ΠΌΠΎ" ΠΈΠ»ΠΈ ["Π΄Π΅ΠΌΠΎ", "тСст"]. include_description_fallback: True (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) β€” Ссли поиск ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ пуст, ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΠΎ описанию. False β€” ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. filters: ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ JSON-массив Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² API, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ [{"public":{"operator":"=","values":["t"]}}]. ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ΡΡ (AND) с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. page_size: Π Π°Π·ΠΌΠ΅Ρ€ страницы (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 50). Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ as_tree ΠΈ ΠΏΡ€ΠΈ поискС ΠΏΠΎ name. offset: НомСр страницы, начиная с 1. Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ as_tree ΠΈ ΠΏΡ€ΠΈ поискС ΠΏΠΎ name. sort_by: JSON-массив сортировки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ [["name","asc"]]. ДопустимыС поля: id, name, typeahead, created_at, public, latest_activity_at, required_disk_space. as_tree: True β€” Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² вмСсто плоского списка (ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ parent_id/name/ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡŽ).

Returns: JSON со списком ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² (ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄) ΠΈ сводкой. ΠŸΡ€ΠΈ поискС ΠΏΠΎ синонимам Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ поля searched_field, matched_terms, fallback_used. ΠŸΡ€ΠΈ as_tree β€” Π΄Π΅Ρ€Π΅Π²ΠΎ {'projects': [<ΡƒΠ·Π΅Π»>]}. ΠŸΡ€ΠΈ пустом Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ β€” список [] ΠΈ note с подсказкой.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
activeNo
offsetNo
as_treeNo
filtersNo
sort_byNo
page_sizeNo
parent_idNo
direct_children_onlyNo
include_description_fallbackNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavior: synonym OR-merge and dedup by id, fallback to description search, in-memory tree building via _links.parent, pagination constraints, and the empty-result note. It also states that as_tree ignores name and pagination, making side effects explicit.

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 long but structured with clear sections and bullets. The one-line summary is front-loaded, and every detailβ€”mode logic, parameter semantics, return formatβ€”serves a distinct purpose without fluff.

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 10 parameters, no schema descriptions, and no annotations, the description comprehensively covers all modes, edge cases (fallback, empty results), and return shapes, including extra fields for synonym search and tree output. It leaves no significant gaps.

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 schema has 0% description coverage, but the Args section defines every parameter's meaning, default, and interactionsβ€”e.g., parent_id uses 'ancestor' or 'parent_id' filters, filters is an arbitrary JSON array combined with AND, and sort_by lists allowed fields. The description fully compensates for the schema's lack of descriptions.

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 'ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π² OpenProject', using a specific verb (get list) and resource (projects/subprojects). It clearly differentiates this list tool from sibling tools focused on work packages, time entries, and users.

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 'Π Π΅ΠΆΠΈΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹' section explicitly explains when to use parent_id, direct_children_only, as_tree, and name search, including parameter interactions like 'Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ as_tree=True'. It also gives instructions such as not auto-adding translations, providing clear usage context.

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

op_list_time_entriesA

ΠžΡ‚Ρ‡Ρ‘Ρ‚ ΠΏΠΎ записям Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (time entries) Π·Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ записи сгруппированными ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ, с суммой часов ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΈ ΠΎΠ±Ρ‰ΠΈΠΌ ΠΈΡ‚ΠΎΠ³ΠΎΠΌ. Π£Π΄ΠΎΠ±Π½ΠΎ для ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π²ΠΈΠ΄Π° Β«ΠΏΠΎΠΊΠ°ΠΆΠΈ врСмя ΠΏΠΎ ΠΌΠ½Π΅ Π·Π° июль, сгруппированноС ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ, ΠΈ ΠΎΠ±Ρ‰Π΅Π΅ количСство часов».

Args: user_id: ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ 'me' (Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ). OpenProject ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ 'me' Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π΅ user_id. project_id: Π€ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ (числовой ID). date_from: Начало ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° (YYYY-MM-DD, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ). date_to: ΠšΠΎΠ½Π΅Ρ† ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° (YYYY-MM-DD, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ). Π“Ρ€Π°Π½ΠΈΡ†Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ spent_on ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ <>d; Π°Π³Π΅Π½Ρ‚ считаСт Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ мСсяца/Π½Π΅Π΄Π΅Π»ΠΈ сам (Β«Π·Π° июль» β†’ 2026-07-01..2026-07-31). activity_id: Π€ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎ активности ΡƒΡ‡Ρ‘Ρ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (ID). filters: ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ JSON-массив Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² API, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ [{"entity_id":{"operator":"=","values":["5"]}}]. ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ΡΡ (AND) с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. include_comments: True (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) β€” Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ тСкст коммСнтария ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи; False β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ†ΠΈΡ„Ρ€Ρ‹ (id, hours, Π΄Π°Ρ‚Π°, Π·Π°Π΄Π°Ρ‡Π°, Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ), Π±Π΅Π· ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². ΠšΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Π΅Π΅ для сводок. page_size: Π Π°Π·ΠΌΠ΅Ρ€ страницы (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 100). Π’ΠΠ˜ΠœΠΠΠ˜Π•: ΠΈΡ‚ΠΎΠ³ ΠΈ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π²Ρ‹Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π’Π‘Π• записи ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° β€” ΠΏΡ€ΠΈ total > Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈΡ‚ΠΎΠ³ Π½Π΅ΠΏΠΎΠ»ΠΎΠ½. Для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ page_size. offset: НомСр страницы, начиная с 1. sort_by: JSON-массив сортировки, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ [["spent_on","asc"], ["id","asc"]]. ДопустимыС поля: id, hours, spent_on, created_at, updated_at.

Returns: JSON: period, filters_applied, total (entries + hours ISO/decimal), by_project [{project, project_id, entries_count, hours, entries}], pagination. ΠŸΡ€ΠΈ total > count β€” note ΠΎ Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNo
date_toNo
filtersNo
sort_byNo
user_idNo
date_fromNo
page_sizeNo
project_idNo
activity_idNo
include_commentsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/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. It discloses pagination behavior (page_size, offset, incomplete totals when page size is insufficient), default sorting, inclusive date boundaries, filter combination (AND), and the effect of include_comments. This is thorough and goes well beyond basic descriptions.

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 structured with a summary paragraph, an Args list, and a Returns section. It is front-loaded with the main purpose, and every sentence adds value. While lengthy, the length is justified by the complexity (10 parameters) and the dense technical details.

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 and the presence of an output schema, the description covers all necessary context: input parameters, grouping/summing behavior, pagination caveats, and the shape of the returned JSON. It also provides a natural-language example, making it complete for an agent to select and invoke 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 description coverage is 0%, but the description compensates fully. It explains each parameter: user_id accepts 'me', date boundaries are inclusive, filters are arbitrary JSON combined with AND, page_size affects total accuracy, sort_by has allowed fields, and include_comments controls comment output. This adds critical meaning beyond the bare 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 clearly states the tool produces a time entry report grouped by project with hour sums and totals. It uses a specific verb ('ΠžΡ‚Ρ‡Ρ‘Ρ‚'/'Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ записи сгруппированными') and resource ('записи Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ'), and the example use case distinguishes it from sibling tools like op_log_time or op_list_time_entry_activities.

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 a concrete usage example: 'ΠΏΠΎΠΊΠ°ΠΆΠΈ врСмя ΠΏΠΎ ΠΌΠ½Π΅ Π·Π° июль, сгруппированноС ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ'. This clearly indicates when to use the tool. It does not explicitly mention alternatives or exclusions, but the sibling tools are sufficiently different that no confusion is likely. Lacks explicit 'when-not-to-use' guidance, so not a 5.

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

op_list_time_entry_activitiesA

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список доступных активностСй ΡƒΡ‡Ρ‘Ρ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Time Entry Activities).

ΠΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π° ΠΏΡ€ΠΈ записи Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ID/title ΠΈΠ· этого списка Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ activity_id инструмСнта op_log_time.

Если список пуст ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π° ошибка 404 β€” ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΡƒΡ‡Ρ‘Ρ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Β«Time and costsΒ», Π»ΠΈΠ±ΠΎ Β«Time tracking activitiesΒ» Π² Administration) Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½/Π½Π΅ настроСн Π½Π° сСрвСрС.

Returns: JSON со списком активностСй: [{id, title, ...}].

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries full burden. It discloses the 404/empty list behavior and that activities may be mandatory, which adds useful context beyond a bare list call. However, it does not discuss other behaviors like authentication, rate limits, or response format beyond the basic list structure.

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 compact and well-structured: purpose, usage hint, error condition, and return format are each briefly covered. Every sentence earns its place without redundancy.

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 zero-parameter list tool with an output schema, the description covers the essential context: what it lists, how to use the results, and what to do if it fails. It is sufficiently complete for an AI agent to select and invoke the tool 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?

The tool has zero parameters, so schema coverage is 100% by default. The description adds value by explaining the output elements (id, title) and how they relate to op_log_time's activity_id parameter, which is more than necessary for a parameter-less tool.

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 clear verb+resource: 'Get the list of available time tracking activities.' It explicitly distinguishes itself from siblings by focusing on activities rather than time entries or logging, and directly references its output being used by op_log_time.

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 clear context on when to use the tool: before logging time, to fetch valid activity IDs for op_log_time. Also explains the 404/empty list scenario, indicating the module is not enabled. Does not explicitly list when not to use alternatives, but the reference to op_log_time gives sufficient guidance.

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

op_list_usersA

Поиск ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΠ½Ρƒ.

Π›ΡŽΠ΄ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ, Π° Π½Π΅ ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌ. Π­Ρ‚ΠΎΡ‚ инструмСнт ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π² op_list_time_entries ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ user_id). Π˜Ρ‰Π΅Ρ‚ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ Π»ΠΎΠ³ΠΈΠ½Ρƒ (ΠΎΠ±Π° β€” ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ содСрТания).

Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π² Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ списка ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ; ΠΏΡ€ΠΈ ΠΈΡ… отсутствии Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ с подсказкой.

Args: query: ΠŸΠΎΠ΄ΡΡ‚Ρ€ΠΎΠΊΠ° ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΠ½Π° (ΠΈΡ‰Π΅Ρ‚ ΠΈ ΠΏΠΎ name, ΠΈ ΠΏΠΎ login). filters: ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ JSON-массив Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² API, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ [{"status":{"operator":"=","values":["active"]}}]. ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ΡΡ (AND) с query. page_size: Π Π°Π·ΠΌΠ΅Ρ€ страницы (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 50). offset: НомСр страницы, начиная с 1.

Returns: JSON со списком ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ [{id, name, login, email, self}] ΠΈ сводкой ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
offsetNo
filtersNo
page_sizeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries full behavioral disclosure. It mentions permission requirements ('Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π² Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ списка ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ') and error behavior ('Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ с подсказкой'), plus how filters combine with query (AND). It also describes the return format, including pagination summary. Missing details like rate limits or exact error types, but substantial context is provided.

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 well-structured with an intro, Args, and Returns sections. It earns its length by explaining purpose and parameter semantics. The opening sentence about 'Π›ΡŽΠ΄ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ' adds context but is slightly verbose; still, it's not excessive.

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 (4 parameters, output schema exists), the description covers all critical aspects: purpose, parameter behavior, filter semantics, pagination, permissions, error handling, and return shape. It is a self-contained reference sufficient for correct 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?

The schema provides 0% coverage for parameter descriptions, but the description fully compensates. Each parameter is explained: query (substring of name/login), filters (JSON array, combined via AND), page_size (default 50), and offset (page number starting at 1). This adds complete semantic meaning beyond the bare 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 clearly states the tool's function: 'Поиск ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΠ½Ρƒ' (Search users by name or login). It goes further to explain the practical use caseβ€”finding a user ID to pass to op_list_time_entriesβ€”which distinguishes it from sibling tools like op_list_projects or op_list_time_entries.

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 on when to use the tool: 'ΠŸΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ... для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π² op_list_time_entries ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ user_id'. It explains the search semantics (name and login) and mentions required permissions. However, it doesn't explicitly discuss alternatives or negative usage cases, so it falls 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.

op_log_timeA

Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя ΠΊ Π·Π°Π΄Π°Ρ‡Π΅ (time entry).

Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π±Ρ‹Π» Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Β«Time and costsΒ» ΠΈ Ρƒ Ρ€ΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π°Π²ΠΎ Β«Log timeΒ».

Args: work_package_id: Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π·Π°Π΄Π°Ρ‡ΠΈ. hours: Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹: '1.5h', '2h30m', '90m', '1:30', 'PT1H30M'. activity_id: ID активности ΡƒΡ‡Ρ‘Ρ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (ΠΈΠ· op_list_time_entry_activities). ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ: Ссли Π½Π΅ Π·Π°Π΄Π°Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (ΠΈΠ»ΠΈ сСрвСр ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΠΈΡ‚, Ссли активности ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΈ Π½Π΅ настроСны). spent_on: Π”Π°Ρ‚Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ YYYY-MM-DD (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” сСгодня). comment: ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΊ записи Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Returns: JSON с созданной записью Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (id, hours, spentOn, activity, ...).

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursYes
commentNo
spent_onNo
activity_idNo
work_package_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It details the acceptance of human-readable time formats, the optional nature of activity_id and its fallback to default activity, the behavior when activities are mandatory and not configured, the default date for spent_on, and the return format. This is comprehensive and transparent.

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 well-structured with an initial purpose line, prerequisites, a clear Args list, and a Returns section. It covers necessary detail without unnecessary verbosity; the time format examples are useful and every sentence contributes to understanding the tool.

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 has 5 parameters, no annotations, and an output schema, the description covers all required aspects: purpose, prerequisites, all parameters with defaults and formats, potential server rejection scenarios, and a summary of the return value. It is complete enough for an agent to select and invoke the tool 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 description coverage is 0%, so the description must compensate. It does so thoroughly: each parameter is explained with meaning beyond the schema. For example, hours includes specific accepted formats, activity_id references another tool and explains default behavior, and spent_on specifies format and default. This adds substantial value over the bare 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 clearly states the tool's function: 'Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя ΠΊ Π·Π°Π΄Π°Ρ‡Π΅ (time entry)' (Log time spent to a task). It uses a specific verb and resource, and it is easily distinguished from sibling tools like op_list_time_entries which lists time entries rather than creating them.

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 usage context by listing prerequisites: the 'Time and costs' module must be enabled and the user must have 'Log time' permission. It also references op_list_time_entry_activities as a source for activity_id. However, it does not explicitly name alternatives or state when not to use the tool, so it falls just 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.

op_search_work_packagesA

Поиск Π·Π°Π΄Π°Ρ‡ (work packages) Π² OpenProject.

Поиск ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ выполняСтся ΠΏΠΎ синонимам: ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°ΠΉΡ‚Π΅ сразу нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ Π² subject (строка ΠΈΠ»ΠΈ список). ΠŸΡ€ΠΈΠΌΠ΅Ρ€: subject=["Π±Π°Π³", "ошибка"]. НС добавляйтС ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄/Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ автоматичСски β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ явно попросил.

Π›ΠΎΠ³ΠΈΠΊΠ° поиска ΠΏΠΎ subject:

  1. Π˜Ρ‰Π΅ΠΌ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ (Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ subject ~) ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ синонима, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ объСдиняСм (логичСскоС Π˜Π›Π˜), Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ id.

  2. Если ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ β€” автоматичСски повторяСм поиск ΠΏΠΎ описанию Π·Π°Π΄Π°Ρ‡ΠΈ (Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ description ~), Ссли сСрвСр Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚.

ΠŸΡ€ΠΎΡ‡ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ (project_id, status, type_id ΠΈ Ρ‚.Π΄.) ΡΡƒΠΆΠ°ΡŽΡ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ поиска (объСдинСниС И с условиСм ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅/описанию).

Если совпадСний Π½Π΅Ρ‚, возвращаСтся пустой список с подсказкой ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запрос β€” ΠΏΠΎΠ»Π½Ρ‹ΠΉ список Π·Π°Π΄Π°Ρ‡ НЕ выдаётся.

Args: subject: Π’Π΅ΠΌΠ° Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈΠ»ΠΈ список синонимов (строка Π»ΠΈΠ±ΠΎ список строк). Поиск ΠΏΠΎ части Ρ‚Π΅ΠΌΡ‹ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ содСрТания '~'), объСдинСниС Π˜Π›Π˜ ΠΌΠ΅ΠΆΠ΄Ρƒ синонимами. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: "Π±Π°Π³" ΠΈΠ»ΠΈ ["Π±Π°Π³", "ошибка", "Π΄Π΅Ρ„Π΅ΠΊΡ‚"]. project_id: Π€ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ; Ссли Π·Π°Π΄Π°Π½ β€” поиск вСдётся Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. status: БСмантичСский статус: 'open' (ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅), 'closed' (Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅), 'all'. type_id: Π€ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ Π·Π°Π΄Π°Ρ‡ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ '1' для Task, '2' для Bug). assignee_id: Π€ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŽ (ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ 'me'). priority_id: Π€ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρƒ. filters: ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ JSON-массив Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² API, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ [{"status_id":{"operator":"o","values":null}}]. ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ΡΡ (AND) с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Π΄Π°Π½ subject (поиск Π±Π΅Π· тСкста), Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ Π΄ΠΎΠΏ. ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅. page_size: Π Π°Π·ΠΌΠ΅Ρ€ страницы (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 20, максимум 100). ΠŸΡ€ΠΈ поискС ΠΏΠΎ subject примСняСтся ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ синониму ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. offset: НомСр страницы, начиная с 1. ΠŸΡ€ΠΈ поискС ΠΏΠΎ subject игнорируСтся (Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ всС Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ совпадСния, Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅). sort_by: JSON-массив сортировки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ [["status","asc"],["id","desc"]].

Returns: JSON со списком Π·Π°Π΄Π°Ρ‡ (ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄) ΠΈ сводкой. ΠŸΡ€ΠΈ поискС ΠΏΠΎ синонимам Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ поля searched_field (subject/description), matched_terms (ΡΡ€Π°Π±ΠΎΡ‚Π°Π²ΡˆΠΈΠ΅ синонимы) ΠΈ fallback_used. ΠŸΡ€ΠΈ пустом Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ β€” список [] ΠΈ note с подсказкой.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNo
statusNo
filtersNo
sort_byNo
subjectNo
type_idNo
page_sizeNo
project_idNo
assignee_idNo
priority_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the behavioral disclosure burden. It details the OR-merge logic for synonyms, deduplication by id, automatic fallback to description search, page_size applied per synonym, offset ignored in synonym search, and special return fields (searched_field, matched_terms, fallback_used). This is exceptionally transparent.

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 long but well-structured with numbered logic, parameter list, and return details. Every sentence adds value and there is no fluff. The front-loaded purpose, clear sections, and concrete examples make the length justified.

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 (10 parameters, no annotations), the description is remarkably complete. It covers return values, empty-result behavior, fallback logic, pagination nuances, and even explains what fields are added in synonym mode. The presence of an output schema does not reduce the need for behavioral context, and this description provides it fully.

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%, and the description compensates thoroughly. Every parameter is explained with semantics beyond the schema: status values ('open'/'closed'/'all'), type_id examples, filters JSON example, sort_by JSON array format, and specific behavior of page_size/offset during subject search. This is exemplary.

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 clearly states the tool's purpose: searching work packages in OpenProject. It specifies the resource (work packages), the verb (поиск/search), and the unique synonym-based search behavior, distinguishing it from siblings like op_get_work_package (single fetch) and op_list_projects (list projects).

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 on how to use the tool: pass multiple synonym variants, avoid auto-translation, and how other parameters narrow the search. It also explicitly states that the full list is NOT returned when there are no matches, which is a usage exclusion. However, it does not explicitly name alternative sibling tools for when to use them instead.

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. Dates show when Glama detected each change.

  1. 10 tool updatesv0.1.0
    • First observedop_add_attachment
    • First observedop_add_comment
    • First observedop_check_connection
    • First observedop_get_work_package
    • First observedop_list_projects
    • First observedop_list_time_entries
    • First observedop_list_time_entry_activities
    • First observedop_list_users
    • First observedop_log_time
    • First observedop_search_work_packages

TDQS

A4.3/5.0
Disambiguation5/5

Each tool targets a distinct resource and action: searching work packages, listing projects, retrieving a work package, adding comments/attachments, time tracking activities, logging time, listing time entries, searching users, and checking connection. No two tools have overlapping responsibilities; even the time-related tools are clearly separated between activity catalog, entry creation, and reporting.

Naming Consistency5/5

All tools share the 'op_' prefix and follow a consistent verb_noun pattern: search_work_packages, list_projects, get_work_package, add_comment, add_attachment, list_time_entry_activities, log_time, list_time_entries, list_users, check_connection. The naming is uniform and predictable, with no mixed conventions.

Tool Count5/5

With 10 tools, the server is well-scoped for OpenProject operations. It covers the core areas (projects, work packages, comments, attachments, time tracking, users, connection) without unnecessary bloat or thin coverage. Each tool earns its place.

Completeness3/5

The set covers searching/reading work packages, adding comments/attachments, and time tracking well, but lacks work package creation, update, deletion, and status/type management. This creates notable gaps for full workflow coverage, though the available operations form a coherent internal surface.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

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/sergeyfedyakov/openproject-mcp'

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