openproject-mcp
Provides tools for interacting with OpenProject's REST API, enabling management of work packages (search, view, comment, attach files, log time), projects, and users.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@openproject-mcpshow my open work packages"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
sse | Legacy HTTP transport ( |
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;
uvicornis 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 transportOption 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 enoughAfter 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/macOSEnvironment variables
Variable | Prefix | Required | Description |
| op | β | Base URL of your OpenProject without a trailing |
| op | β | Personal API token. Created in profile settings β Access tokens. Requires the administrator setting "Enable API tokens". |
| mcp | β |
|
| mcp | β | HTTP transport address as |
| mcp | β | Optional Bearer token protecting the HTTP endpoint. Empty = no auth (trusted network / reverse proxy only). Clients send |
| mcp | β | Comma-separated host list (DNS-rebinding protection). Suffix |
| mcp | β |
|
Variables can also be set without a .env β directly in the client config or at container startup.
Getting an API token
Sign in to OpenProject.
Profile icon (top right) β My account β Access tokens.
Click + API token, give it a name (e.g. "MCP"), copy the value.
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-mcpHealth 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 |
| Address for HTTP (IPv6: |
|
|
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_TOKENor 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-mcpHealth 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 # stopAfter 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_HOSTSis 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_HOSTSwith the hostname your clients connect to, or (for an internal network) leave it empty and protect the endpoint withMCP_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.envexists in the working directory, theenvblock 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=ssethe endpoints change to/sse(GET, stream) and/messages/(POST) β use your client's SSE mode.
Tools
Tool | Purpose | Key parameters |
| Check URL + token | β |
| Search work packages |
|
| Details of one work package |
|
| List projects / subprojects / tree |
|
| Comment on a work package |
|
| Upload a file |
|
| Log time |
|
| Time report for a period |
|
| Search users |
|
| 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, deduplicatedSearch 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 fallbackAll 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 projectsSubprojects 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 childrenAdd 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
.envin the working directory and the variables were not passed viaenv/-e.HTTP 401 Unauthorized β missing/incorrect
MCP_AUTH_TOKEN. The client must sendAuthorization: Bearer <value>.HTTP 421 "Invalid Host header" β the host allowlist triggered. Either set
MCP_ALLOWED_HOSTSwith the hostname clients use, or leave it empty (protection is disabled) and secure withMCP_AUTH_TOKEN.Connection fails in Docker β check that
MCP_BIND=0.0.0.0:8000(not127.0.0.1) and the port is published (-p 8000:8000)."Port already in use" β change the port in
MCP_BIND/--bindand 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 toolsop_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, ΡΡΡΠ»ΠΊΠ°).
| Name | Required | Description | Default |
|---|---|---|---|
| file_name | No | ||
| file_path | Yes | ||
| work_package_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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, ΡΠ΅ΠΊΡΡ, Π°Π²ΡΠΎΡ, Π΄Π°ΡΠ°).
| Name | Required | Description | Default |
|---|---|---|---|
| comment | Yes | ||
| internal | No | ||
| work_package_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎΠ± ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ΅/ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 Ρ ΠΏΠΎΠ»Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ Π·Π°Π΄Π°ΡΠΈ (ΡΠ΅ΠΌΠ°, ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΡΠΈΠΏ, ΡΡΠ°ΡΡΡ, Π΄Π°ΡΡ, ΠΎΡΠ΅Π½ΠΊΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π°Π²ΡΠΎΡ, ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΡΠΉ, ΡΡΡΠ»ΠΊΠΈ Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ) ΠΈ, ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ, ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ/Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ.
| Name | Required | Description | Default |
|---|---|---|---|
| work_package_id | Yes | ||
| include_comments | No | ||
| include_attachments | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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=["Π΄Π΅ΠΌΠΎ", "ΡΠ΅ΡΡΠΎΠ²ΡΠΉ"]. ΠΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄/ΡΡΠ°Π½ΡΠ»ΠΈΡΠ΅ΡΠ°ΡΠΈΡ
Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ β ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ²Π½ΠΎ ΠΏΠΎΠΏΡΠΎΡΠΈΠ».
ΠΠΎΠ³ΠΈΠΊΠ° ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ:
ΠΡΠ΅ΠΌ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° (ΡΠΈΠ»ΡΡΡ
name ~) ΠΏΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠ°, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ (ΠΠΠ), Π΄Π΅Π΄ΡΠΏΠ»ΠΈΡΠΈΡΡΠ΅ΠΌ ΠΏΠΎ id.ΠΡΠ»ΠΈ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΠΈ 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 Ρ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΎΠΉ.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| active | No | ||
| offset | No | ||
| as_tree | No | ||
| filters | No | ||
| sort_by | No | ||
| page_size | No | ||
| parent_id | No | ||
| direct_children_only | No | ||
| include_description_fallback | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 ΠΎ Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΈΡΠΎΠ³Π΅.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | ||
| date_to | No | ||
| filters | No | ||
| sort_by | No | ||
| user_id | No | ||
| date_from | No | ||
| page_size | No | ||
| project_id | No | ||
| activity_id | No | ||
| include_comments | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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, ...}].
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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}] ΠΈ ΡΠ²ΠΎΠ΄ΠΊΠΎΠΉ ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΈΠΈ.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| offset | No | ||
| filters | No | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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, ...).
| Name | Required | Description | Default |
|---|---|---|---|
| hours | Yes | ||
| comment | No | ||
| spent_on | No | ||
| activity_id | No | ||
| work_package_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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:
ΠΡΠ΅ΠΌ ΠΏΠΎ ΡΠ΅ΠΌΠ΅ Π·Π°Π΄Π°ΡΠΈ (ΡΠΈΠ»ΡΡΡ
subject ~) ΠΏΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠ°, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ (Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΠΠ), Π΄Π΅Π΄ΡΠΏΠ»ΠΈΡΠΈΡΡΠ΅ΠΌ ΠΏΠΎ id.ΠΡΠ»ΠΈ ΠΏΠΎ ΡΠ΅ΠΌΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ β Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΠΌ ΠΏΠΎΠΈΡΠΊ ΠΏΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ (ΡΠΈΠ»ΡΡΡ
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 Ρ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΎΠΉ.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | ||
| status | No | ||
| filters | No | ||
| sort_by | No | ||
| subject | No | ||
| type_id | No | ||
| page_size | No | ||
| project_id | No | ||
| assignee_id | No | ||
| priority_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v0.1.0- First observed
op_add_attachment - First observed
op_add_comment - First observed
op_check_connection - First observed
op_get_work_package - First observed
op_list_projects - First observed
op_list_time_entries - First observed
op_list_time_entry_activities - First observed
op_list_users - First observed
op_log_time - First observed
op_search_work_packages
TDQS
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.
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.
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.
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
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
Nifty's MCP server β exposes tasks, projects, messages, and files as tools for AI agents.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
MCP server for building and testing AI agents with multi-model experimentation and insights.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for integrating with OpenProject API, enabling AI assistants to manage projects, work packages, time tracking, and users.23-
- AlicenseBqualityAmaintenanceAn MCP server that lets local AI agents read and manage OpenProject project data through structured, guarded tools, with write operations requiring explicit confirmation.5820MIT
- FlicenseNot gradedqualityBmaintenanceAn MCP server that enables AI assistants to interact with OpenProject, listing projects and work packages and managing resources through natural language.-
- AlicenseAqualityBmaintenanceWrite-capable MCP server for OpenProject API v3 with Community Edition support. Search, create, update, assign, prioritize, and comment on work packages.41MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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