Skip to main content
Glama
igorolv

redmine-mcp-server

Redmine MCP Server

CI Release License Java 25 MCP Glama score Listed on mcpservers.org

A local MCP server for accessing a corporate Redmine instance. It exposes a limited set of write operations for issues, time entries, and wiki alongside the read tools; set REDMINE_MCP_WRITE_ENABLED=false to run fully read-only. It lets AI agents (Claude Code, Cursor, VS Code Copilot, etc.) work with issues, projects, members, versions, wiki, attachments, time entries, and reference data.

Quick Start

This documentation covers installing and connecting Redmine MCP Server itself. Installing and configuring the AI clients themselves is out of scope here.

  1. Install JDK 25+.

  2. Download redmine-mcp-server.jar from the latest release, or build it yourself: ./gradlew bootJar (see Build). A Docker image is published as well.

  3. Obtain REDMINE_URL and REDMINE_API_KEY (see Configuration).

  4. Verify that the JAR starts (see Smoke Test).

  5. Add the JAR to your client's MCP configuration (see Connecting to an AI Client).

For Claude Code that is one command:

claude mcp add --scope user -e REDMINE_URL=https://redmine.example.com -e REDMINE_API_KEY=your_key -- redmine java -jar /path/to/redmine-mcp-server.jar

Related MCP server: Redmine MCP Server

Architecture

The server supports only the stdio transport.

Stdio

┌─────────────┐     stdio      ┌──────────────────┐    REST API    ┌──────────┐
│  AI agent   │ <------------> │  redmine-mcp-    │ -------------> │ Redmine  │
│ (Claude Code│   stdin/stdout │  server (Java)   │   HTTP + API   │ (corp.)  │
│  Cursor...) │                │                  │   Key          │          │
└─────────────┘                └──────────────────┘                └──────────┘

The AI client launches the server as a child process; communication follows the MCP protocol over stdin/stdout.

Tools

The server exports 32 read-only MCP tools plus 7 write tools by default. Set REDMINE_MCP_WRITE_ENABLED=false to remove the write tools and run fully read-only.

User

Tool

Description

getCurrentUser

Current user: ID, login, groups, projects. Useful for "my issues" filtering

Projects

Tool

Description

listProjects

List of all accessible projects

getProject

Project details: trackers, modules, description

listProjectMembers

Project members with roles

listVersions

Project versions (milestones)

Issues

Tool

Description

listIssues

Issue list with filters: project, status, tracker, assignee, priority, version, saved query, custom fields (customFieldFilters in cf_<id>=value format), sorting

searchIssues

Full-text issue search with detailed results

getIssue

Issue details: description, status, assignee, dates, notes, relations, custom fields, attachments, linked revisions (changesets). Parameters: issueId, focus (default, implementation, timeline, full; optional)

getIssueJournal

A single complete issue journal note/event without response compression. Parameters: issueId, journalId

getMyIssues

Issues of the current user. Parameters: projectId, statusId, sort, limit, offset

getIssueTree

Parent chain and subtasks. root and ancestors keep the Issue JSON shape but contain compact context; call getIssue for full details or relations. Parameters: issueId, depth (default 2, max 5)

getIssueHistory

Creation and every journal event, with status intervals. Long text is shortened; journalId identifies the full entry for getIssueJournal. Follow nextOffset with the optional offset parameter until it is absent.

Issue, Time Entry, and Wiki Writes (optional)

These tools appear in tools/list by default; set REDMINE_MCP_WRITE_ENABLED=false to remove them:

Tool

Description

createIssue

Creates an issue. Supports core Redmine fields and custom fields via customFieldsJson

updateIssue

Partially updates the specified fields of an existing issue

addIssueNote

Adds a note to the issue journal

attachFileToIssue

Uploads a file from any readable local path and attaches it to the issue

createTimeEntry

Creates a time entry for the user from REDMINE_API_KEY; accepts exactly one of issueId/projectId, hours, date, activity, comment, and custom fields

createWikiPage

Creates a wiki page and rejects the request if the page already exists

updateWikiPage

Fully replaces the wiki page text, requiring the optimistic-lock version returned by getWikiPage

Redmine itself enforces the permissions, workflow, and required-field rules of the REDMINE_API_KEY user. The MCP server introduces no additional model of "own" issues or notes. To make AI-created issues recognizable, the description of an issue created by createIssue is prefixed with AI_EDIT: by default (updateIssue does not add it). Notes, time-entry comments, wiki revision comments, and uploaded file names are not marked by default; each marker is configured separately with a REDMINE_MCP_WRITE_*_PREFIX variable (see Configuration), and an empty value turns it off. Issue descriptions and notes get the prefix on its own line followed by a blank line; single-line fields (time-entry and wiki revision comments) get the prefix and a space; file names get the prefix with no separator. Wiki page markup itself is never changed.

Editing and deleting existing notes is not implemented: the targeted Redmine 4.0.4 does not provide a compatible REST API for it. Editing and deleting time entries; deleting, renaming, and protecting wiki pages; and creating time entries on behalf of another user are outside the current operation set.

Tool

Description

searchAll

Global Redmine search: issues, wiki, news, documents, commits, etc. Parameters: searchQuery, projectId, types, limit, offset

Attachments and Wiki

Tool

Description

getAttachment

Downloads the original attachment file into a local snapshot directory, returns localPath/fileUri, and immediately adds text context to parts[] if the format is supported: txt/log/xml/json/csv, PDF, Word (.docx), Excel (.xlsx), PowerPoint (.pptx), ZIP. A ZIP may yield a separate part per entry. A .docx yields one text part: pandoc markdown when pandoc is available, POI plain text otherwise. Parameters: issueId, attachmentId, maxChars, partLimit (see Processing Limits)

getWikiPage

Content of a project wiki page

listWikiPages

List of all wiki pages of a project

searchWikiPages

Full-text search across wiki pages. Parameters: searchQuery, projectId, limit, offset

Time Entries

Tool

Description

listTimeEntries

Logged time with filters: project, issue, user, period

getMyTimeEntries

Logged time of the current user. Parameters: projectId, issueId, from, to, limit, offset

Reference Data

Tool

Description

listQueries

Saved queries (custom filters) — ID + name. Use the ID with listIssues(queryId) to apply the filter, including custom-field filters

listStatuses

All issue statuses (ID + name) — for filtering in listIssues

listTrackers

All trackers (ID + name) — for filtering in listIssues

listPriorities

All priorities (ID + name) — for filtering in listIssues

listIssueCategories

Issue categories of a project (ID + name)

listTimeEntryActivities

Activity types for interpreting existing time entries (ID + name)

Analytics

Tool

Description

getProjectSummary

Aggregated project summary: overall open/closed count; analyzed open issues broken down by status, tracker, priority, assignee; overdue issues; estimated/spent hours. Analyzes up to 500 open issues and returns a truncation flag. Parameters: projectId, versionId (optional)

getUserWorkload

Workload analysis: open issues by project and priority, overdue issues, top issues. Analyzes up to 500 open issues and returns a truncation flag. Parameters: userId (optional, defaults to current user), projectId (optional)

getVersionChangelog

Version issues grouped by tracker, open/closed statistics. Analyzes up to 500 issues and returns a truncation flag. Parameters: projectId, versionId

getBlockerChain

Recursive traversal of the blocking chain (blocks/blocked_by) upward and downward, limited to depth 10 and 30 loaded issues. Parameters: issueId

getStaleIssues

Open issues not updated for N days, oldest first. Parameters: projectId, daysSinceUpdate (default 30), limit

getReleaseRisks

Release risk assessment: blockers, overdue items, high-priority issues, unassigned issues. Analyzes up to 500 open issues and returns a truncation flag. Parameters: projectId, versionId

compareVersions

Compares two versions: unique issues, shared issues, closure percentage. Analyzes up to 500 issues per version and returns a truncation flag. Parameters: projectId, versionId1, versionId2

With REDMINE_MCP_WRITE_ENABLED=false all tools are read-only and no data in Redmine is modified.

Tool Groups (enable/disable)

Tools are grouped by domain, and each group can be disabled via an environment variable. All groups are enabled by default — the out-of-the-box tool manifest is unchanged. Disabling groups shrinks the MCP tools/list manifest that the client loads into model context at session start. This helps small-context (local) models: disable unneeded groups so only the tools the model actually needs remain.

Variable

Group (tools)

REDMINE_MCP_TOOLS_ISSUE

Issues (core): listIssues, searchIssues, getIssue, getMyIssues, getIssueJournal

REDMINE_MCP_TOOLS_ISSUE_STRUCTURE

Issue structure/history: getIssueTree, getIssueHistory

REDMINE_MCP_TOOLS_PROJECT

Projects: listProjects, getProject, listProjectMembers, listVersions

REDMINE_MCP_TOOLS_SEARCH

Search: searchAll

REDMINE_MCP_TOOLS_ATTACHMENT

Attachments: getAttachment

REDMINE_MCP_TOOLS_WIKI

Wiki: getWikiPage, listWikiPages, searchWikiPages

REDMINE_MCP_TOOLS_TIME_ENTRY

Time entries: listTimeEntries, getMyTimeEntries

REDMINE_MCP_TOOLS_REFERENCE_DATA

Reference data: listQueries, listStatuses, listTrackers, listPriorities, listIssueCategories, listTimeEntryActivities

REDMINE_MCP_TOOLS_USER

User: getCurrentUser

REDMINE_MCP_TOOLS_ISSUE_ANALYTICS

Issue analytics: getBlockerChain, getStaleIssues

REDMINE_MCP_TOOLS_RELEASE_ANALYTICS

Release/project analytics: getProjectSummary, getUserWorkload, getVersionChangelog, getReleaseRisks, compareVersions

Each variable accepts true (default) or false. Example: to keep only issue and project work, disable the remaining groups — REDMINE_MCP_TOOLS_RELEASE_ANALYTICS=false, REDMINE_MCP_TOOLS_WIKI=false, etc. MCP prompts are not affected by these flags; a prompt tells the model to skip a step whose tool is disabled.

MCP Prompts

The server also exports MCP prompts for typical issue-handling scenarios. Each takes one required argument, issueId — the Redmine issue number (12345 or #12345).

Prompt

Description

incident-brief

Quick incident overview: fetches the issue via getIssue, downloads all attachments via getAttachment with short previews, and produces a concise Markdown report

incident-implementation

Implementation context: fetches the issue with focus=implementation, picks relevant attachments by name, description and date, recovers compressed journal data only when it matters, and produces requirements, revision evidence, and a verification checklist

incident-timeline

Incident chronology: uses getIssue(focus=timeline) for issue and changeset context, then reads every getIssueHistory page for journal events and status intervals

issue-remaining-work

What is still unfinished: combines getIssue, getIssueTree (including siblings when relevant), getBlockerChain, and getIssueHistory when needed, and reports open items without trusting the status alone

Clients that build command templates by requesting a prompt with a placeholder argument (for example opencode 1.x, which sends $1) get the template with the placeholder left in place, so their own substitution keeps working.

Tech Stack

  • Java 25, Spring Boot 4.2.0-M2, Spring AI MCP 2.1.0-M1 (stdio transport)

  • Apache PDFBox 3.0.5 — text extraction from PDFs

  • Apache POI 5.4.0 — text extraction from Word, Excel, PowerPoint

  • Apache Tika 3.2.0 (core + parsers-standard) — fallback parser and metadata extraction

  • Pandoc (optional, external binary) — improved DOCX to text/markdown conversion when available on PATH; otherwise the server uses POI

  • Gradle 9.3.1 with version catalog (gradle/libs.versions.toml)

Build

Linux/macOS:

# Point to JDK 25+ if it is not the default JDK:
export JAVA_HOME="$HOME/.jdks/jdk-25.0.2"

./gradlew build

Windows PowerShell:

# Point to JDK 25+ if it is not the default JDK:
$env:JAVA_HOME="C:\Program Files\Java\jdk-25"

.\gradlew.bat build

Result: build/libs/redmine-mcp-server.jar

Configuration

The server needs REDMINE_URL and REDMINE_API_KEY; the remaining variables are optional:

Variable

Description

REDMINE_URL

Base URL of the Redmine instance (e.g. https://redmine.example.com)

REDMINE_API_KEY

Redmine user's API key

REDMINE_MCP_WRITE_ENABLED

Adds the createIssue, updateIssue, addIssueNote, attachFileToIssue, createTimeEntry, createWikiPage, updateWikiPage tools to tools/list; set to false to remove them and run read-only; defaults to true

REDMINE_MCP_WRITE_ISSUE_DESCRIPTION_PREFIX

Marker prepended to the description of issues created by createIssue; defaults to AI_EDIT:. Set to an empty value to disable

REDMINE_MCP_WRITE_ISSUE_NOTE_PREFIX

Marker prepended to notes added by addIssueNote; empty (disabled) by default

REDMINE_MCP_WRITE_TIME_ENTRY_COMMENT_PREFIX

Marker prepended to createTimeEntry comments; counts toward Redmine's 1024-character limit; empty (disabled) by default

REDMINE_MCP_WRITE_WIKI_COMMENT_PREFIX

Marker prepended to wiki revision comments of createWikiPage / updateWikiPage; empty (disabled) by default

REDMINE_MCP_WRITE_ATTACHMENT_FILENAME_PREFIX

Prefix added to file names uploaded by attachFileToIssue (e.g. AI_EDIT__); must not contain / \ ? % * : | " ' < >; empty (disabled) by default

REDMINE_MCP_DATA_DIR

Local data directory of the server; defaults to ~/.redmine-mcp-server

REDMINE_MCP_HTTP_CONNECT_TIMEOUT_SECONDS

Timeout for opening a connection to Redmine; defaults to 10 seconds

REDMINE_MCP_HTTP_READ_TIMEOUT_SECONDS

Timeout for Redmine to answer one request (including the request upload); defaults to 30 seconds. Tool calls are processed one at a time, so a stalled request otherwise delays every later call

REDMINE_MCP_HTTP_SLOW_REQUEST_WARN_MILLIS

Redmine requests slower than this are logged as warnings; defaults to 5000 ms

REDMINE_MCP_ATTACHMENT_PER_PART_CHARS

Text limit per single part (e.g., one file inside a ZIP) for getAttachment calls without limits; defaults to 30000 characters. The tool's partLimit parameter replaces it, and so does maxChars when partLimit is omitted.

REDMINE_MCP_ATTACHMENT_PER_ATTACHMENT_CHARS

Total limit of extracted text per attachment in getAttachment calls without maxChars; defaults to 40000 characters, which keeps a default response below REDMINE_MCP_RESPONSE_MAX_CHARS.

REDMINE_MCP_ATTACHMENT_MAX_REQUEST_CHARS

Ceiling for the maxChars and partLimit a caller passes to getAttachment; defaults to 200000 characters. Larger requests are reduced to it and the response limits.note says so.

REDMINE_MCP_RELATED_MAX_SIBLINGS

Maximum sibling issues added to related when reading an issue; defaults to 20

REDMINE_MCP_RELATED_MAX_CHILDREN

Maximum child issues added to related when reading an issue; defaults to 20

REDMINE_MCP_RELATED_MAX_RELATED

Maximum related issues from relations added to related when reading an issue; defaults to 10

getIssue resolves the related context with one lightweight read of the parent and one batched lookup for siblings, children and relation targets; related issues are not snapshotted. The timeline and changesets focus modes omit related and skip these requests entirely. | REDMINE_MCP_RESPONSE_MAX_CHARS | Target response size limit before stepwise compression of getIssue and getAttachment; defaults to 50000 characters | | REDMINE_MCP_RESPONSE_JOURNAL_TAIL_KEEP | How many most-recent journal entries the budget compression of getIssue keeps before more aggressive reduction; defaults to 30 | | REDMINE_MCP_RESPONSE_ATTACHMENT_TEXT_PART_CHARS | Text limit per attachment part during response compression of getAttachment calls without maxChars/partLimit; defaults to 10000 characters. Calls with explicit limits are never truncated below them. | | REDMINE_MCP_RESPONSE_JOURNAL_NOTE_CHARS | Text limit per journal note during response compression of getIssue; defaults to 5000 characters | | REDMINE_MCP_RESPONSE_IMAGE_PARTS_KEEP | How many image parts the response compression of getAttachment keeps; defaults to 5 | | REDMINE_MCP_PAGINATION_DEFAULT_LIMIT | Default page size for list/search tools; defaults to 25 | | REDMINE_MCP_PAGINATION_DEFAULT_OFFSET | Default offset for list/search tools; defaults to 0 | | REDMINE_MCP_PAGINATION_MEMBERS_DEFAULT_LIMIT | Default page size for listProjectMembers; defaults to 100 | | REDMINE_MCP_TREE_DEFAULT_DEPTH | Default depth for getIssueTree; defaults to 2 | | REDMINE_MCP_TREE_MAX_DEPTH | Maximum depth of getIssueTree; defaults to 5 | | REDMINE_MCP_TREE_MAX_ISSUES | Maximum issues loaded by getIssueTree; defaults to 50 | | REDMINE_MCP_ANALYSIS_MAX_PAGES | Maximum Redmine pages read by analytics tools; defaults to 5 | | REDMINE_MCP_ANALYSIS_PAGE_SIZE | Redmine page size for analytics tools; defaults to 100 | | REDMINE_MCP_ANALYSIS_TOP_ISSUES_LIMIT | Maximum issues in top lists of analytics responses; defaults to 10 | | REDMINE_MCP_ANALYSIS_MAX_BLOCKER_DEPTH | Maximum traversal depth for getBlockerChain; defaults to 10 | | REDMINE_MCP_ANALYSIS_MAX_BLOCKER_ISSUES | Maximum issues loaded by getBlockerChain; defaults to 30 | | REDMINE_MCP_ANALYSIS_STALE_ISSUES_DEFAULT_DAYS_SINCE_UPDATE | Default daysSinceUpdate for getStaleIssues; defaults to 30 | | REDMINE_MCP_ANALYSIS_STALE_ISSUES_DEFAULT_LIMIT | Default result limit for getStaleIssues; defaults to 25 | | REDMINE_MCP_ANALYSIS_STALE_ISSUES_MAX_LIMIT | Maximum result limit for getStaleIssues; defaults to 100 | | REDMINE_MCP_EXTRACTION_PANDOC_ENABLED | Enables the use of Pandoc for DOCX when the binary is found on PATH; defaults to true | | REDMINE_MCP_EXTRACTION_PANDOC_PROBE_TIMEOUT_SECONDS | Timeout for probing Pandoc availability at startup; defaults to 2 seconds | | REDMINE_MCP_EXTRACTION_PANDOC_CONVERSION_TIMEOUT_SECONDS | Timeout for a single DOCX conversion via Pandoc; defaults to 30 seconds | | REDMINE_MCP_EXTRACTION_LIMITS_MAX_DEPTH | Maximum recursion depth for processing nested documents and archives; defaults to 1 | | REDMINE_MCP_EXTRACTION_LIMITS_MAX_TOTAL_PARTS | Maximum text/metadata parts per extraction; defaults to 100 | | REDMINE_MCP_EXTRACTION_LIMITS_MAX_TOTAL_BYTES | Total bytes-read limit per extraction; defaults to 52428800 bytes | | REDMINE_MCP_EXTRACTION_LIMITS_MAX_ENTRY_BYTES | Limit for a single entry inside an archive; defaults to 10485760 bytes | | REDMINE_MCP_EXTRACTION_ZIP_MAX_ENTRIES_PER_ARCHIVE | Maximum entries per ZIP archive; defaults to 100 | | REDMINE_MCP_EXTRACTION_TIKA_BODY_LIMIT_BYTES | Body size limit passed to the Tika fallback parser; defaults to 5242880 bytes | | REDMINE_MCP_EXTRACTION_TIKA_METADATA_MAX_FIELDS | Maximum Tika metadata fields in the response; defaults to 40 |

How to Get REDMINE_URL

Open Redmine in your browser and copy the address-bar value without the path — scheme and domain only.

Examples:

In browser address bar

REDMINE_URL value

https://redmine.example.com/projects/myproject

https://redmine.example.com

http://192.168.1.50:3000/issues/123

http://192.168.1.50:3000

http://10.0.0.5/redmine/projects

http://10.0.0.5/redmine

If Redmine is reachable only by IP address (no domain name), use the IP as-is, including the port if it differs from the standard one (80/443). If Redmine is deployed under a subpath (e.g. /redmine), include it in the URL too.

How to Get REDMINE_API_KEY

  1. Log in to Redmine with your account

  2. Click "My account" (top right corner)

  3. In the right column find the "API access key" block

  4. Click "Show" — your personal API key will be displayed

  5. Copy the key and use it as the REDMINE_API_KEY value

If the "API access key" block is not shown, contact the Redmine administrator — the REST API may be disabled in settings.

Smoke Test

Before connecting an AI client it is worth verifying that the JAR starts correctly with the same environment variables that will later go into the client configuration.

Linux/macOS:

REDMINE_URL=https://redmine.example.com REDMINE_API_KEY=your_key \
  java -jar build/libs/redmine-mcp-server.jar

Windows PowerShell:

$env:REDMINE_URL="https://redmine.example.com"
$env:REDMINE_API_KEY="your_key"
java -jar .\build\libs\redmine-mcp-server.jar

The server runs over stdio and opens no HTTP port: after a successful start it silently waits for MCP requests on stdin/stdout. A successful start shows as the absence of errors in the log and no immediate process exit. Press Ctrl+C to stop.

Docker

The image is published to GHCR with every release:

docker run -i --rm   -e REDMINE_URL=https://redmine.example.com   -e REDMINE_API_KEY=your_key   ghcr.io/igorolv/redmine-mcp-server:latest

The same command is what an MCP client should launch (-i keeps stdin open for the stdio transport). Mount a host directory at /data to keep logs and issue snapshots between runs. To build the image locally: docker build -t redmine-mcp-server .

Logs

Logs are written to ${REDMINE_MCP_DATA_DIR:-~/.redmine-mcp-server}/logs/redmine-mcp-server.log. The file rotates by date and size: 10MB, retention 30 days, total cap 512MB.

Issue Snapshots

When loading an issue the server persists a snapshot to disk under ${REDMINE_MCP_DATA_DIR:-~/.redmine-mcp-server}/issues/<issue-id>/: issue.json, snapshot.json with snapshot metadata, attachments.json, and an extracted/<attachment-id>/ directory for derived files. Attachments are materialized under attachments/ with names like <attachment-id>__<filename> and can be reused across snapshots when the local file already exists and its size matches the Redmine metadata.

Connecting to an AI Client

Add to the client configuration:

{
  "command": "java",
  "args": ["-jar", "<absolute-path>/redmine-mcp-server.jar"],
  "env": {
    "REDMINE_URL": "https://redmine.example.com",
    "REDMINE_API_KEY": "your_api_key"
  }
}

Where exactly:

Client

How to connect

Claude Code

claude mcp add --scope user -e REDMINE_URL=... -e REDMINE_API_KEY=... -- redmine java -jar /path/to/redmine-mcp-server.jar

Qwen Code

~/.qwen/settings.json -> "mcpServers" -> "redmine"

VS Code

.vscode/mcp.json -> "servers" -> "redmine"

Cursor

.cursor/mcp.json -> "mcpServers" -> "redmine"

Claude Desktop

claude_desktop_config.json -> "mcpServers" -> "redmine"

Restart the client afterwards.

Operations and Security

This MCP server is designed to run locally alongside the AI client. It opens no HTTP port and accepts no incoming network connections: the client launches the JAR as a child process and communicates with it via stdin/stdout.

Access Model

  • The server uses the permissions of the Redmine user whose API key is set in REDMINE_API_KEY.

  • Seven explicitly listed write tools for issues, time entries, and wiki are available by default; set REDMINE_MCP_WRITE_ENABLED=false to run fully read-only. The server neither extends the API user's rights nor bypasses the Redmine workflow.

  • Accessible projects, issues, attachments, and time entries are determined by the user's permissions in Redmine. If a user cannot see an object in Redmine, the server must not gain access to it either.

  • The REDMINE_MCP_WRITE_*_PREFIX markers (such as the default AI_EDIT: on created issues) are search labels, not an authorization mechanism: authorship of a change is reliably established by the Redmine account that owns the API key.

  • attachFileToIssue deliberately accepts any readable local path without an allow-list of directories. Since write tools are on by default, run the server only next to a trusted AI client, keeping in mind that the client will be able to pass the contents of any file readable by the process into Redmine.

  • Treat the API key as a secret. Do not commit it to the repository, shell scripts, .vscode/mcp.json, .cursor/mcp.json, or other shared files of the project.

For development and verification of write operations use a separate test Redmine and a separate API key. Because writes are on by default, set REDMINE_MCP_WRITE_ENABLED=false when pointing integrationTest or a manual smoke test at a production installation.

What Data Is Passed to the AI Client

The AI client receives exactly the data it requests through MCP tools:

  • issue cards: subject, description, status, priority, assignee, author, dates, relations, subtasks, journals/comments, custom fields;

  • information about projects, versions, members, reference data, and time entries;

  • wiki pages;

  • attachment metadata;

  • local paths to the original attachment files and text extracted from PDF, DOCX, XLSX, PPTX, ZIP, and text files via getAttachment.

Before connecting an external or cloud AI client, check your company's internal policies: Redmine data may contain trade secrets, personal data, logs, keys, error dumps, and document contents.

Processing Limits

There are protective limits in the code so that a single large document or a related network of issues cannot overload the MCP client:

Area

Limit

Each text part of getAttachment.parts[]

up to 30,000 characters by default, beyond that the text is truncated

One attachment in getAttachment in total

up to 40,000 characters by default

Explicit maxChars / partLimit in getAttachment

honored up to 200,000 characters each

ZIP depth

1 level

ZIP archives

up to 100 entries

ZIP file inside an archive

up to 10 MB

ZIP archive in total

up to 50 MB of extracted data

getIssueTree

depth up to 5, max 50 issues

getIssueHistory

Each JSON page fits REDMINE_MCP_RESPONSE_MAX_CHARS in both characters and UTF-8 bytes; all events remain available through nextOffset

getAttachment reports the limits it applied in limits (maxChars, partLimit, and a note when a requested value was reduced to the ceiling); a cut part carries totalChars with its full length. Without explicit limits, a response that still exceeds REDMINE_MCP_RESPONSE_MAX_CHARS (for example, many ZIP entries) is compressed: extra image parts are collapsed, then text parts are cut to REDMINE_MCP_RESPONSE_ATTACHMENT_TEXT_PART_CHARS. With explicit limits, only image parts are collapsed. The original file remains on disk at localPath; for pandoc DOCX extraction, the markdown part also points to its saved text file. Other document parts can point to a PDF or Office source file rather than a separate extracted-text file.

getIssue supports the focus parameter. default keeps the usual response shape and applies compression only when the response budget is exceeded. implementation targets implementation work on the issue: the full issue is still persisted to disk, while the tool response keeps the description, human notes, attachment metadata, and all changeset revisions; verbose history and commit message bodies are omitted. timeline targets "who did what and when" questions: it keeps journals and changesets but omits attachments, custom fields, and related context. full is an explicit choice of the full form with protective budget compression.

getIssueTree still loads and snapshots every fetched issue in full, but returns only compact Issue context for root and ancestors; their description, journals, custom fields, attachments, and changesets are omitted from this view. Its subtree remains the hierarchy view. This changes the contents of those existing Issue fields: clients that previously read full details from the tree should call getIssue(id) instead. getIssueTree does not include direct relations.

getIssueHistory includes the creation event and each journal event, including journals without a note or a recognized field change. It shortens long notes and old/new field values when needed, keeps journalId on each update, and explains reductions in compressionNotes. For exact wording or a complete old/new value, call getIssueJournal(issueId, journalId). Start with getIssueHistory(issueId); when nextOffset is present, pass that number as offset in the next call. Continue until nextOffset is absent. totalEvents includes creation. Status intervals in statusDurations belong to events on that page; combine them across pages. Compare sourceUpdatedOn across pages and restart if it changes. The server uses the existing REDMINE_MCP_RESPONSE_MAX_CHARS setting; no new environment variable is needed. If one event cannot fit after text shortening, its page keeps the event and journalId but reduces the event to metadata; compressionNotes identify any omitted status intervals and point to getIssueJournal for the full entry.

If the note you need was dropped from the getIssue response by budget compression or the note was shortened, call getIssueJournal(issueId, journalId): it re-takes the issue snapshot and returns the selected journal entry without response compression.

Some regular list tools (listIssues, listProjects, listTimeEntries, listQueries) accept limit and offset directly. For reliable operation avoid requesting excessively large pages; a practical range is 25-100 items per call.

Diagnostics

Environment check:

java -version
echo "$REDMINE_URL"
test -n "$REDMINE_API_KEY" && echo "REDMINE_API_KEY is set"

Redmine REST API access check:

curl -H "X-Redmine-API-Key: <key>" <url>/users/current.json

Build check:

./gradlew test
./gradlew build

Integration tests against a live Redmine:

REDMINE_URL=<url> REDMINE_API_KEY=<key> ./gradlew integrationTest

Integration tests require a reachable Redmine and real test data. Unit tests exclude tests tagged integration by default.

Known Operational Limitations

  • HTTP timeouts and the retry policy are currently not configurable separately. If Redmine is slow to respond, an MCP call may wait longer than is convenient for the AI client.

  • Redmine errors (401, 403, 404, 5xx) are currently handled mostly at the Spring RestClient level; the message seen by the AI-client user may be less friendly than a dedicated MCP tool error.

  • A note or attachment may be written successfully, but its new journalId/attachmentId may stay undefined if Redmine or a concurrent user modifies the issue between confirmation reads. The operation itself is still considered completed.

  • Search depends on Redmine settings. If /search.json is disabled by the administrator, searchAll, searchIssues, and searchWikiPages may not return the expected results.

  • Text extraction from PDF works only for PDFs with a text layer. Scanned documents without OCR are detected as PDFs with no extractable text.

  • Images are not re-encoded. getAttachment returns the path to the original file; text parts[] for images remain empty.

Project Structure

├── src/main/java/ru/it_spectrum/ai/redmine/mcp/
│   ├── RedmineMcpServerApplication.java   — Spring Boot entry point
│   ├── api/                                — stable MCP wire format: records returned by tools/services
│   │   ├── Issue.java
│   │   ├── AttachmentContent.java
│   │   ├── Project.java
│   │   ├── IssueMutationResult.java        — stable result of issue write operations
│   │   ├── TimeEntryMutationResult.java    — stable result of time-entry creation
│   │   ├── WikiMutationResult.java         — stable result of wiki-page writes
│   │   └── ...                             — tool response DTOs and analytics DTOs
│   ├── client/
│   │   ├── RedmineClient.java              — read-only wrapper over the Redmine REST API
│   │   ├── RedmineMutationClient.java      — optional POST/PUT for issues, time entries, and wiki
│   │   └── model/                          — raw Redmine REST API DTOs, never exported directly to MCP
│   │       ├── RedmineIssue.java
│   │       ├── RedmineAttachment.java
│   │       ├── RedmineProject.java
│   │       └── ...
│   ├── config/
│   │   ├── RedmineClientProperties.java   — url + apiKey from env
│   │   ├── RedmineMcpProperties.java      — all redmine-mcp.* runtime settings
│   │   ├── RedmineConfig.java             — RestClient
│   │   ├── McpServerConfig.java           — stdio MCP customizer with immediateExecution(true)
│   │   └── JsonConfig.java                — ObjectMapper for MCP JSON
│   ├── extraction/
│   │   ├── ExtractionPipeline.java        — document-to-text pipeline
│   │   ├── DocumentParser.java            — parser interface
│   │   ├── FileTypeDetector.java          — file type detection
│   │   ├── PandocAvailability.java        — external pandoc probe at startup
│   │   └── parser/
│   │       ├── PlainTextParser.java       — txt/log/csv/json/xml
│   │       ├── PdfTextParser.java         — PDF via PDFBox
│   │       ├── DocxTextParser.java        — DOCX via POI
│   │       ├── DocxPandocParser.java      — DOCX via Pandoc when available
│   │       ├── XlsxTextParser.java        — XLSX via POI
│   │       ├── PptxTextParser.java        — PPTX via POI
│   │       ├── ZipParser.java             — ZIP with bounded recursion
│   │       ├── ImagePassthroughParser.java
│   │       ├── TikaTextFallbackParser.java
│   │       ├── TikaMetadataParser.java
│   │       └── BinaryFallbackParser.java
│   ├── service/
│   │   ├── IssueService.java              — issue business logic and mapping client.model -> api
│   │   ├── IssueMutationService.java      — optional issue writing and AI marking
│   │   ├── TimeEntryMutationService.java  — optional time-entry creation
│   │   ├── WikiMutationService.java       — safe wiki writing with optimistic locking
│   │   ├── AttachmentService.java         — attachment snapshot, download, and extraction
│   │   ├── IssueSnapshotService.java      — local issue and attachment snapshots
│   │   ├── AnalysisService.java           — analytics, risks, blocker chain
│   │   └── ...                            — services for projects, wiki, search, reference data, time entries
│   └── tools/
│       ├── AttachmentTools.java           — 1 MCP tool for files and attachment context
│       ├── IncidentPrompts.java           — 4 MCP prompts for issue investigation
│       ├── IssueAnalyticsTools.java       — 2 issue-analytics MCP tools (blocker chain, stale)
│       ├── IssueStructureTools.java       — 2 MCP tools: issue tree and change history
│       ├── IssueTools.java                — 5 core issue MCP tools
│       ├── IssueWriteTools.java           — 4 optional issue-write MCP tools
│       ├── ProjectTools.java              — 4 project MCP tools
│       ├── ReferenceDataTools.java        — 6 reference-data MCP tools
│       ├── ReleaseAnalyticsTools.java     — 5 release/project analytics MCP tools
│       ├── SearchTools.java               — 1 global-search MCP tool
│       ├── TimeEntryTools.java            — 2 time-entry MCP tools
│       ├── TimeEntryWriteTools.java       — 1 optional time-entry creation MCP tool
│       ├── UserTools.java                 — 1 current-user MCP tool
│       ├── WikiTools.java                 — 3 wiki MCP tools
│       └── WikiWriteTools.java            — 2 optional wiki-write MCP tools
└── src/main/resources/
    ├── application.yml                    — MCP server configuration (stdio)
    └── logback-spring.xml                 — logging configuration

Troubleshooting

  • "Gradle requires JVM 17 or later" — point JAVA_HOME at JDK 25+

  • Connection refused / 401 — check REDMINE_URL and REDMINE_API_KEY. Test: curl -H "X-Redmine-API-Key: <key>" <url>/users/current.json

  • No search results — verify that /search.json is available in Redmine (it may be disabled by the administrator)

Available Tools

39 tools
addIssueNoteaddIssueNoteA

Append a new journal note to one existing Redmine issue without changing its fields. This is non-idempotent: retrying can add a duplicate note, and existing journal entries cannot be edited.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesYes
issueIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
issueIdYes
journalIdNo
attachmentIdNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare idempotentHint=false, but the description adds the operative consequence — retrying can create a duplicate note — plus the immutable nature of existing journal entries. That is genuinely useful mutation context beyond the structured hints, though permission/auth behavior for this open-world write is not addressed.

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

Conciseness5/5

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

Two sentences, zero filler, with the core action and its non-idempotency caveat front-loaded. Every clause earns its place.

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

Completeness4/5

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

Return values need not be explained since an output schema exists, and the key risk (duplicate notes on retry) is disclosed. Minor gaps remain around auth/permissions given openWorldHint=true and the lack of any issueId format guidance for a write operation.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must carry parameter meaning. It does implicitly map 'journal note' to notes and 'one existing issue' to issueId, but never states the identifier is an integer issueId or what content format notes accepts, leaving the mapping inferential for a mutating call.

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

Purpose5/5

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

States a specific verb ('Append a new journal note'), the exact resource scope ('one existing Redmine issue'), and carves out what it does not do ('without changing its fields'), which separates it from updateIssue and getIssueJournal in the sibling list.

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

Usage Guidelines4/5

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

Gives clear context ('one existing issue', 'without changing its fields'), implicitly routing field edits to updateIssue, and warns against retrying. It stops short of naming an alternative tool or stating prerequisites explicitly, so it is clear but not fully prescriptive.

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

attachFileToIssueattachFileToIssueA

Upload a readable server-local file and attach it to one existing Redmine issue. This is non-idempotent and retries may create duplicate attachments; getAttachment performs the reverse read/download flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
issueIdYes
localPathYes
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
issueIdYes
journalIdNo
attachmentIdNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare idempotentHint=false and destructiveHint=false, but the description adds the concrete consequence an agent actually needs: retrying may create duplicate attachments. It also discloses that the file must be server-local and readable, which is a real operational constraint. Auth/permission requirements are not covered, keeping it out of 5 territory.

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

Conciseness5/5

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

Two sentences, front-loaded with the action and scope, then the non-idempotency caveat and sibling pointer. No filler; every clause earns its place.

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

Completeness4/5

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

For a 3-parameter mutation tool with an output schema and full annotation coverage, the description supplies purpose, idempotency behavior, and sibling routing. The remaining gap is parameter-level detail and any permission/error expectations, which is minor given the output schema handles results.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must carry parameter meaning. 'server-local file' usefully clarifies that localPath is a path on the server rather than the client, and 'one existing issue' implies issueId must reference a valid issue. However, the optional description parameter and the format/type of issueId are entirely undocumented.

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

Purpose5/5

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

States a specific verb (Upload/attach), a specific resource (one existing Redmine issue), and a constraint on the input (readable server-local file). It also distinguishes itself from getAttachment by naming that sibling's opposite flow, so an agent can separate the two without opening either schema.

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

Usage Guidelines4/5

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

Gives clear operating context: non-idempotent, retries may create duplicates, and getAttachment handles the reverse read/download path. It stops short of explicit when-not-to-use guidance (e.g., no size/permission prerequisites), so it is clear context rather than full routing.

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

compareVersionscompareVersionsA
Read-onlyIdempotent

Compare the issue scope and completion of two known versions/milestones in one project. Returns issues unique to each, shared issues and closure percentages; use listVersions to discover IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject identifier or numeric ID
versionId1YesFirst version/milestone ID; from listVersions
versionId2YesSecond version/milestone ID; from listVersions

Output Schema

ParametersJSON Schema
NameRequiredDescription
firstNoScope statistics for the first version.
inBothNoIssues present in both versions.
secondNoScope statistics for the second version.
projectIdNoProject identifier the versions belong to.
onlyInFirstNoIssues present only in the first version.
onlyInSecondNoIssues present only in the second version.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive. The description adds behavioral value by explaining the returned comparison categories (unique issues, shared issues, closure percentages). No contradiction with annotations.

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

Conciseness5/5

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

Two sentences with no filler; the primary purpose is front-loaded and the prerequisite for IDs is tacked on at the end. Every sentence earns its place.

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

Completeness5/5

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

For a read-only three-parameter comparison tool, the description covers what it does, what it returns, and how to obtain valid IDs. The output schema exists, so detailed return structure is not the description's responsibility.

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

Parameters3/5

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

Schema coverage is 100%, and each parameter already has a description including the listVersions source for versionIds. The description reinforces the version/milestone semantics but does not materially add new parameter meaning.

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?

Description uses a specific verb 'Compare' with a defined resource ('issue scope and completion' of two versions/milestones) and names the outputs. This clearly distinguishes it from siblings like listVersions and getVersionChangelog.

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

Usage Guidelines4/5

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

It clearly states the context: comparing two known versions/milestones within one project, and tells the agent to use listVersions to discover IDs. It does not explicitly enumerate when-not-to-use alternatives, but the two-version comparison scope is unambiguous.

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

createIssuecreateIssueA

Create a new Redmine issue in a known project with core or custom fields. This writes as the API-key user and is not idempotent; use updateIssue when the issue already exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
dueDateNoYYYY-MM-DD
subjectYes
statusIdNoFrom listStatuses
doneRatioNo0-100
isPrivateNo
projectIdYesProject identifier or numeric ID
startDateNoYYYY-MM-DD
trackerIdNoFrom listTrackers
categoryIdNoFrom listIssueCategories
priorityIdNoFrom listPriorities
descriptionNo
parentIssueIdNo
estimatedHoursNo
fixedVersionIdNoFrom listVersions
assignedToUserIdNo
customFieldsJsonNoJSON object: field ID to scalar or scalar array, e.g. {"10":"rtk","11":["a","b"]}

Output Schema

ParametersJSON Schema
NameRequiredDescription
issueIdYes
journalIdNo
attachmentIdNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and idempotentHint=false, so the write/repeat semantics are covered; the description adds the genuinely new detail that the write is performed as the API-key user. The 'not idempotent' clause largely restates the annotation, so it stops short of a 5.

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

Conciseness5/5

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

Two sentences, zero filler, with the create scope front-loaded and the routing constraint immediately after. Every clause earns its place.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and annotations cover safety. The description covers mutation semantics, actor, idempotency, and the alternative tool; it does not mention the required projectId/subject pairing, but the schema marks those as required.

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

Parameters3/5

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

With 16 parameters and only 63% schema description coverage, the schema carries most of the burden. The phrase 'core or custom fields' loosely gestures at customFieldsJson and the field families, but adds no syntax, format, or mapping detail beyond what the schema already states.

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

Purpose5/5

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

States a specific verb (Create) and resource (Redmine issue) and scopes it to a known project with core or custom fields. The second sentence names the sibling it is not (updateIssue), so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

Explicitly gives the when-not condition and the alternative: 'use updateIssue when the issue already exists'. Nothing about selection is left to inference.

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

createTimeEntrycreateTimeEntryA

Record logged hours for the API-key user against exactly one issue or project. This is non-idempotent and retries can duplicate time; use listTimeEntryActivities when an activity ID is needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursYes
issueIdNo
spentOnNoYYYY-MM-DD
commentsNo
projectIdNo
activityIdNoFrom listTimeEntryActivities
customFieldsJsonNoJSON object: field ID to scalar or scalar array

Output Schema

ParametersJSON Schema
NameRequiredDescription
timeEntryIdYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare idempotentHint=false and readOnlyHint=false, so the safety profile is covered. The description still adds value beyond the annotations by explaining the consequence — 'retries can duplicate time' — which an agent needs in order to decide whether to retry, and it scopes the record to the API-key user.

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

Conciseness5/5

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

Two tight sentences with no filler. The purpose and the issue/project constraint lead, and the non-idempotency warning plus activity routing follow immediately.

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

Completeness4/5

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

An output schema exists so return values need not be explained, and the description covers the two highest-risk ambiguities: entry ownership/scoping and retry behavior. It stops short of describing hours constraints or customFieldsJson requirements, which remain thin at 43% coverage.

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

Parameters4/5

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

At 43% schema coverage the description has to compensate, and it does on the most ambiguous point: issueId and projectId are mutually exclusive ('exactly one issue or project'), a constraint absent from the schema. The activityId routing hint is partly redundant with the schema, and hours/customFieldsJson semantics are left to the schema.

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

Purpose5/5

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

The description states a specific verb ('Record logged hours') and resource ('time entry') and pins down the scoping rule: 'against exactly one issue or project.' This is enough to separate it from the sibling list tools like listTimeEntries and getMyTimeEntries without opening any schema.

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

Usage Guidelines4/5

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

It routes the agent explicitly: 'use listTimeEntryActivities when an activity ID is needed,' which is directly actionable. It gives no explicit when-not-to-use guidance (e.g., bulk vs single entry), so it falls short of a full 5.

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

createWikiPagecreateWikiPageA

Create a new Redmine wiki page with its complete initial text and optional parent. This writes as the API-key user and fails if the title already exists; use updateWikiPage for an existing page.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
commentsNo
pageTitleYes
projectIdYesProject identifier or numeric ID
parentTitleNoMust name an existing page

Output Schema

ParametersJSON Schema
NameRequiredDescription
versionYesCurrent wiki page revision after the operation.
pageTitleYesWiki page title used in the page path.
projectIdYesProject identifier or numeric ID used for the request.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds genuinely new behavioral context beyond them: it writes as the API-key user (auth/identity) and fails on duplicate title (concrete failure mode). It does not cover comment handling on an initial create, a minor omission against an otherwise informative write path.

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

Conciseness5/5

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

Two sentences, zero filler. The creation behavior comes first and the routing rule second, which is the right order for a front-loaded tool description.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and the annotations carry the safety profile. The description covers creation semantics, identity, duplicate-title failure, and the alternative tool. Only the undocumented comments parameter leaves a small gap.

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

Parameters3/5

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

Schema coverage is only 40%, with projectId and parentTitle documented in-schema; text, pageTitle, and comments are not. The description compensates for text ('complete initial text') and parentTitle ('optional parent'), but says nothing about pageTitle or comments, so the compensation is partial.

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

Purpose5/5

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

States a specific verb and resource ('Create a new Redmine wiki page') and narrows scope with 'complete initial text and optional parent'. It names the sibling updateWikiPage as the contrasting tool, so an agent can tell creation from update without opening a schema.

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

Usage Guidelines5/5

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

Explicit when-not and alternative: 'fails if the title already exists; use updateWikiPage for an existing page.' This directly tells the agent which tool to pick for a pre-existing page, leaving nothing to inference.

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

getAttachmentgetAttachmentA
Read-onlyIdempotent

Retrieve and inspect one known issue attachment by downloading it to the server's local snapshot and extracting text from supported documents or archives. Use getIssue to discover attachment IDs; images and unsupported binaries return metadata and a local path without extracted text. Text cut by the limits stays readable at each part's localPath.

ParametersJSON Schema
NameRequiredDescriptionDefault
issueIdYes
maxCharsNoTotal character budget for extracted text across all parts
partLimitNoPer-part character cap, mainly for ZIP entries; defaults to maxChars when maxChars is set
attachmentIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoFree-text note explaining the result, typically present when text extraction was skipped.
partsNoExtracted parser output. Text parts carry content; images and unsupported binaries carry localPath/fileUri and an explanatory note.
limitsNo
fileUriNoRFC 3986 `file://` URI pointing at the downloaded file.
localPathNoAbsolute filesystem path of the downloaded file.
localSizeYesSize of the downloaded file on disk, in bytes (-1 if the size could not be determined).
truncatedYesTrue when at least one part's text was cut to fit response size limits.
attachmentNo
textExtractedYesTrue when at least one part contains successfully extracted text.
extractionTypeNoDetected document kind used for extraction (`image`, `pdf`, `docx`, `xlsx`, `pptx`, `text`, `zip`, ...).
compressionNotesNoHuman-readable notes describing how this response was compressed to fit the response size budget. Null/empty when no compression was applied.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing what actually happens: the file is downloaded to a server-local snapshot, text is extracted only for supported documents/archives, and images or unsupported binaries yield metadata plus a local path with no text. The note that truncated text remains readable at each part's localPath clarifies truncation behavior that no structured field captures.

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

Conciseness4/5

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

Three sentences, front-loaded with the purpose, then ID-discovery guidance, then edge-case behavior — all content earns its place. Slightly dense with subordinate clauses, but there is no filler.

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

Completeness5/5

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

For a read-only retrieval tool with an output schema carrying return shape and annotations carrying the safety profile, the remaining burden is behavioral and procedural context, and the description covers both — extraction scope, unsupported-binary handling, truncation, and the ID discovery path.

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

Parameters4/5

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

Schema coverage is only 50% (issueId and attachmentId are undescribed), so the description must compensate, and it does in part: the 'limits' sentence ties maxChars/partLimit to truncation and 'each part's localPath' to the per-part model, and it says where attachmentId comes from via getIssue. issueId remains unaddressed in prose, keeping this just under a full score.

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

Purpose5/5

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

States a specific verb and resource ('Retrieve and inspect one known issue attachment') and adds the two mechanisms that define its behavior: local snapshot download and text extraction from supported documents or archives. This is readily distinguishable from attachFileToIssue and from getIssue, so an agent can route correctly.

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

Usage Guidelines4/5

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

Explicitly states the precondition for use — the agent must already have an attachment ID and should obtain it via getIssue — which is genuine routing guidance. It does not name an explicit when-not or an alternative tool for listing attachments, so it stops 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.

getBlockerChaingetBlockerChainA
Read-onlyIdempotent

Trace only blocks/blocked_by relations recursively in both directions, returning the full upstream and downstream blocking dependency chains. Use getIssueTree for parent/subtask hierarchy and other direct relation types.

ParametersJSON Schema
NameRequiredDescriptionDefault
issueIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
rootNoThe issue the chain is centred on.
blocksNoIssues that depend on the root (recursively), each annotated with its depth from the root.
blockedByNoIssues that block the root (recursively), each annotated with its depth from the root.
chainDepthYesEnd-to-end depth of the chain (upstream + 1 + downstream).
totalIssuesYesTotal number of distinct issues in the chain (including the root).

TDQS

A4.4/5.0
Behavior4/5

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

The annotations already establish readOnlyHint, non-destructive, and idempotent behavior. The description adds meaningful behavioral detail beyond those annotations: traversal is recursive in both directions and returns full dependency chains. This is useful context not inferable from the annotations or schema, though it does not cover edge cases like cycles or depth limits.

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

Conciseness5/5

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

Two sentences with no filler: the first sentence states the core behavior and scope, and the second sentence provides a direct pointer to the relevant sibling tool. The most important information is front-loaded.

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

Completeness4/5

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

For a read-only, single-parameter tracing tool with an output schema, the description covers the essential behavior and sibling differentiation. It does not mention potential cycle handling or whether the full chain includes the starting issue itself, but these are minor given the annotations and schema context.

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

Parameters3/5

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

The schema has only one parameter, issueId, and no description in the schema (0% coverage). The description does not explicitly document the parameter, but the tool name and the context of tracing relations make it reasonably clear that issueId identifies the starting issue. This is adequate for a single self-explanatory parameter, but the description misses the chance to explicitly say 'starting from the given issue.'

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 names a specific verb ('Trace') and a specific resource ('blocks/blocked_by relations'), and further defines the scope as recursive in both directions, returning full upstream and downstream chains. This clearly distinguishes it from the sibling getIssueTree, which handles parent/subtask hierarchy and other relation types.

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

Usage Guidelines5/5

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

The description explicitly tells the agent when to use this tool versus an alternative: 'Use getIssueTree for parent/subtask hierarchy and other direct relation types.' It also scopes its own applicability to exactly blocks/blocked_by relations, leaving no ambiguity about when to select it.

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

getCurrentUsergetCurrentUserA
Read-onlyIdempotent

Retrieve the identity and user ID of the currently authenticated API-key user. Use the ID in assignee/user filters; getMyIssues, getMyTimeEntries and the default getUserWorkload do not require it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
mailNoEmail address, may be absent if not visible to the API caller.
nameNoDisplay name (firstname + lastname).
loginNoLogin name.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, covering the safety profile. The description adds useful context about how the returned ID is used, which goes beyond the annotations without contradicting them. A minor gap is no mention of error behavior, but this is trivial for a read-only identity fetch.

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 with zero filler. It front-loads the core purpose and immediately provides actionable usage guidance. Every word earns its place.

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

Completeness5/5

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

With no parameters and an output schema provided, the description covers everything an agent needs: what the tool returns, how to use it, and which scenarios don't require it. There are no missing prerequisites or edge cases that would leave an agent confused.

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 baseline is 4. The description correctly notes there are no required inputs and does not need to explain any parameters. It adds value by explaining the purpose of the output, which is more than sufficient.

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 retrieves the identity and user ID of the authenticated API-key user. The verb 'retrieve' is specific, the resource is well-defined, and the mention of using the ID in filters distinguishes it from sibling tools that don't require it.

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

Usage Guidelines5/5

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

The description explicitly tells when to use the tool: to get the user ID for assignee/user filters. It also names specific sibling tools (getMyIssues, getMyTimeEntries, default getUserWorkload) that do not require this ID, providing clear exclusions and alternatives.

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

getIssuegetIssueA
Read-onlyIdempotent

Retrieve complete context for one known issue ID: core and custom fields, subtasks, direct relations, journals, attachments and linked changesets, with focus modes controlling compression. Use getIssueTree for recursive structure, getIssueJournal for a journal omitted or shortened by compression, or getAttachment for file content.

ParametersJSON Schema
NameRequiredDescriptionDefault
focusNoResponse focus: default, implementation (implementation-relevant text and all changeset revisions), timeline (who-did-what-and-when), changesets (issue identity fields and changesets only), or full (no compression).
issueIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesIssue identifier (the # shown in Redmine).
authorNoAuthor who created the issue.
statusNoCurrent workflow status (e.g. New, In Progress, Closed).
dueDateNoPlanned due date in ISO-8601 (yyyy-MM-dd).
projectNoProject the issue belongs to.
relatedNoEnriched references to related issues (parent, siblings, children, relations) — id + subject/tracker/status + roles. Populated when the issue is loaded with related-issue enrichment; null otherwise. Use it to decide which related issues are worth fetching in full.
subjectNoShort title of the issue.
trackerNoTracker type (Bug, Feature, Task, ...).
categoryNoIssue category within the project.
journalsNoChronological history entries — notes, status changes, field edits.
priorityNoPriority (e.g. Normal, High, Urgent).
createdOnNoCreation timestamp in ISO-8601.
doneRatioYesCompletion percentage from 0 to 100.
startDateNoPlanned start date in ISO-8601 (yyyy-MM-dd).
updatedOnNoTimestamp of the most recent change in ISO-8601.
assignedToNoUser currently assigned to the issue; null when unassigned.
changesetsNoLinked VCS changesets/commits, when the Redmine repository integration exposes them.
focusNotesNoHuman-readable notes describing semantic focus shaping applied before response-size compression. Null/empty when no focus shaping was applied.
spentHoursNoAggregated time already logged against the issue, in hours.
attachmentsNoFiles attached to the issue.
descriptionNoLong-form description of the issue, may contain Textile or Markdown markup depending on the Redmine instance.
customFieldsNoProject-defined custom field values, in display form.
fixedVersionNoTarget version / milestone this issue is planned for.
estimatedHoursNoEstimated effort in hours.
compressionNotesNoHuman-readable notes describing how this response was compressed to fit the response size budget. Null/empty when no compression was applied.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false, covering the safety profile and idempotency. The description adds detail about focus modes affecting compression, which is useful behavioral context. It doesn't mention pagination, rate limits, or exact return format, but with output schema present, that's less critical. So a 3 is appropriate.

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, front-loading the core purpose and then immediately offering alternatives, which is efficient. It packs a lot of information without fluff, every clause adds value.

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

Completeness5/5

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

For a read-only tool with an output schema, the description covers the tool's purpose, its scope, the existence of focus modes for compression, and clear routing to siblings. Given the complexity (returns many data types) and the output schema providing return structure, the description is complete enough. It lacks some details like default focus behavior, but that is minor given the other resources.

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

Parameters3/5

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

Schema description coverage is 50%: issueId has only a type/format, no description; focus has a brief description of allowed values. The description explains the purpose of focus modes and names them, adding context not in the schema, such as what each mode compresses (e.g., implementation, timeline, changesets, full). However, it doesn't dive into full parameter semantics for issueId beyond implying it's the known issue ID. With partial coverage, the description adds value but not comprehensive.

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?

Clearly states it retrieves complete context for a single known issue ID, enumerating the included data types (core/custom fields, subtasks, relations, journals, attachments, changesets). It also names three sibling tools (getIssueTree, getIssueJournal, getAttachment) and specifies what each provides, effectively distinguishing from siblings.

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

Usage Guidelines5/5

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

Explicitly directs when to use alternatives: recursive structure via getIssueTree, journal retrieval if omitted or shortened via getIssueJournal, and file content via getAttachment. Also mentions focus modes that control compression, implying when to use them, though not exhaustive. Overall, strong guidance on tool selection.

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

getIssueHistorygetIssueHistoryA
Read-onlyIdempotent

Read an issue's chronological journal events and status intervals. Long text is shortened; use journalId with getIssueJournal for full text, and nextOffset to read any remaining events.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNoNext page index from nextOffset
issueIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
offsetYesIndex of this page's first event.
timelineNoChronological timeline of creation and update events.
nextOffsetNoPass this as offset to getIssueHistory for the next page; absent when complete.
totalEventsYesTotal creation and journal events available.
sourceUpdatedOnNoIssue update timestamp; compare across pages to detect intervening edits.
statusDurationsNoStatus intervals beginning in this page's events.
compressionNotesNoWhat text was shortened and how to retrieve it in full.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds meaningful behavior beyond them: long text is truncated and remaining events require pagination via nextOffset, which tells the agent the result may be incomplete.

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

Conciseness5/5

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

Two dense sentences with zero waste: the core action is front-loaded, then truncation and the paging/alternative escape hatch follow. Nothing is redundant with structured fields.

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

Completeness5/5

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

An output schema exists, so return shape needn't be explained, and the description still covers the two things an agent must know to use the result correctly (truncation and pagination). Complete for this tool's complexity.

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

Parameters3/5

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

Schema description coverage is only 50% – offset is documented in the schema, issueId is not. The description refers to nextOffset for pagination but adds no format or meaning for issueId, so it only partially compensates for the coverage gap.

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

Purpose5/5

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

The description states a specific verb and resource ('Read an issue's chronological journal events and status intervals') and explicitly distinguishes itself from the sibling getIssueJournal. An agent can separate this from getIssue without opening either schema.

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

Usage Guidelines4/5

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

It routes the agent to getIssueJournal when full text is needed, and names nextOffset as the way to page through remaining events. That covers the main alternative and continuation path, though it doesn't say when not to use history at all.

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

getIssueJournalgetIssueJournalA
Read-onlyIdempotent

Retrieve one known issue journal entry in full, without response compression. Use a journal ID from getIssue or getIssueHistory when exact text is needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
issueIdYes
journalIdYesJournal entry ID from getIssue or getIssueHistory

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
userNo
notesNoFree-text note. Empty when the entry only carries field changes.
detailsNoField-level changes recorded in this entry. Raw form — use issue history endpoints for resolved values.
createdOnNoTimestamp the entry was recorded, ISO-8601.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds one useful behavioral fact beyond annotations — no response compression, i.e. full text returned — but says nothing about auth, pagination, or size limits.

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

Conciseness5/5

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

A single sentence with zero waste; the retrieval scope is front-loaded and the ID-source caveat follows immediately, so an agent can parse it in one pass.

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

Completeness4/5

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

An output schema exists, so return-value explanation is not required, and annotations carry the safety profile. The only remaining gap is the undocumented issueId parameter, which is minor for this simple two-parameter read tool.

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

Parameters3/5

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

Schema coverage is only 50%: journalId is documented in the schema and reinforced by the description's provenance note, but issueId has no description anywhere. The description compensates for the journalId side but leaves issueId's semantics (which issue, format) unexplained.

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

Purpose5/5

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

States a specific verb and resource ('Retrieve one known issue journal entry in full') plus the distinguishing scope ('without response compression'), which clearly separates it from getIssue and getIssueHistory that return aggregated or compressed content.

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

Usage Guidelines4/5

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

Explicitly tells the agent where to get the journalId ('from getIssue or getIssueHistory') and the condition for using this tool ('when exact text is needed'). It doesn't state when not to use it, but the trigger condition is clear enough to route correctly.

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

getIssueTreegetIssueTreeA
Read-onlyIdempotent

Explore one issue's parent chain and subtasks down to the requested depth. Root and ancestors are compact; use getIssue for full details or relations and getBlockerChain for blockers.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoHow deep to traverse children
issueIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
rootNoCompact context for the target issue; call getIssue for full details and relations.
subtreeNoThe root issue plus its descendant subtree, expanded up to the requested depth.
ancestorsNoCompact parent chain in order parent → grandparent → ... up to the root-most ancestor.
fetchedCountYesTotal issues fetched while building the tree (visibility into rate-limited traversal).
limitReachedYesTrue when traversal stopped at the safety limit and additional branches/depths exist.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly=true, idempotent=true, destructive=false, so the safety profile is covered. The description adds a genuine behavioral trait beyond them: root and ancestor nodes come back compact rather than full, which tells the agent when a follow-up getIssue call is needed.

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

Conciseness5/5

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

Two tight sentences with zero filler. The traversal scope is front-loaded and the sibling routing follows immediately, so nothing is buried.

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

Completeness4/5

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

An output schema exists, so return values need not be explained, and the description covers traversal direction and the compact-node caveat. The one gap is depth's default/limit behavior (e.g. what happens if depth is omitted or very large), which affects how the agent calls it but is unstated.

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

Parameters3/5

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

Schema coverage is 50% – depth is documented in the schema, issueId is not. The description restates depth in natural language ('down to the requested depth') but adds no format, default, or bounds information beyond the schema, so it neither compensates for the gap nor regresses from the baseline.

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

Purpose5/5

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

States a specific verb and resource ('explore one issue's parent chain and subtasks') with the traversal scope ('down to the requested depth'). It explicitly distinguishes itself from siblings getIssue and getBlockerChain, so an agent can route without opening a schema.

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

Usage Guidelines5/5

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

Names two concrete alternatives and the condition that selects each: getIssue for full details or relations, getBlockerChain for blockers. The tree-shaped subset this tool returns is framed as the reason to pick it over those, leaving little to inference.

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

getMyIssuesgetMyIssuesA
Read-onlyIdempotent

Browse issues assigned to the currently authenticated API-key user without first resolving their user ID. Use getUserWorkload for aggregated workload metrics or listIssues for another assignee.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort field and direction, e.g. 'updated_on:desc'
limitNo
offsetNo
statusIdNoStatus filter: open (default), closed, * (all), or a numeric status ID from listStatuses
projectIdNoProject identifier or numeric ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageNo
userNo

TDQS

A4.4/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations by clarifying that the tool operates against the currently authenticated API-key user and does not require a prior user-ID lookup. Given readOnlyHint and idempotentHint already cover the safety model, this is a strong addition, though it does not detail response pagination or filtering edge cases.

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

Conciseness5/5

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

Two short sentences front-load the core purpose and immediately route to relevant alternatives. There is no filler, repetition, or gratuitous detail.

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

Completeness4/5

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

With an output schema present, no return-value description is needed. The 5 optional params are mostly described in the schema, and annotations cover safety and idempotency. The only slight gap is the lack of guidance on limit/offset usage, but overall the description is complete enough for correct use.

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

Parameters3/5

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

The schema already has useful descriptions for sort, statusId, and projectId, so the description adds no extra parameter-level detail. Because limit and offset are still undocumented and the description does not compensate for that gap, a mid-range score is appropriate.

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

Purpose5/5

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

The description states a specific action ('Browse issues'), a specific scope (assigned to the currently authenticated API-key user), and the key benefit (no need to first resolve the user ID). It also distinguishes itself from sibling tools like listIssues and getUserWorkload in one sentence.

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

Usage Guidelines5/5

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

It explicitly routes to alternatives: getUserWorkload for aggregated workload metrics and listIssues for another assignee. This gives the agent clear decision heuristics about which sibling to pick based on the user's goal.

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

getMyTimeEntriesgetMyTimeEntriesA
Read-onlyIdempotent

Browse actual time-entry records logged by the currently authenticated API-key user without first resolving their user ID. Use listTimeEntries for another user or broader administrative filtering.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoYYYY-MM-DD
fromNoYYYY-MM-DD
limitNo
offsetNo
issueIdNo
projectIdNoProject identifier or numeric ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageNo
userNo

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the behavioral context that this tool avoids the need to resolve the user ID first, which is useful. However, it doesn't disclose anything about pagination, filtering behavior, or what happens when no time entries exist. With annotations covering the safety profile, a 3 is appropriate.

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

Conciseness5/5

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

Two sentences with zero waste. The core purpose and the key differentiator are front-loaded, and the alternative is named in the second sentence. Every word earns its place.

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

Completeness4/5

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

The tool has an output schema, so return values are covered. The description explains the key behavioral nuance (no user ID resolution needed) and routes to the alternative. The only minor gap is that the description doesn't mention that all parameters are optional or that the tool returns only the current user's entries, but the purpose statement already implies the scope. This is complete enough for a read-only list tool with an output schema.

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

Parameters3/5

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

Schema description coverage is 50%, so the schema documents 'to', 'from', and 'projectId' but leaves 'limit', 'offset', and 'issueId' without descriptions. The description doesn't add parameter-level meaning beyond what the schema provides. Baseline 3 is correct when the schema does partial heavy lifting and the description doesn't compensate for the undocumented parameters.

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

Purpose5/5

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

The description states a specific verb ('Browse'), a specific resource ('actual time-entry records logged by the currently authenticated API-key user'), and a key differentiator ('without first resolving their user ID'). It clearly distinguishes itself from listTimeEntries, which is for another user or broader administrative filtering.

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

Usage Guidelines5/5

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

The description explicitly says when to use this tool: to browse the current user's time entries without resolving the user ID. It also names the alternative (listTimeEntries) and the condition for using it ('for another user or broader administrative filtering'). This is explicit when/when-not guidance.

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

getProjectgetProjectA
Read-onlyIdempotent

Inspect one known project's configuration and metadata, including description, trackers and enabled modules. Use getProjectSummary for aggregated issue metrics, listProjectMembers for people or listVersions for milestones.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject identifier or numeric ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameNoDisplay name shown in the UI.
parentNoParent project reference, null for top-level projects.
homepageNoOptional homepage URL configured for the project.
isPublicYesTrue when the project is visible to anonymous users.
trackersNoTrackers enabled for this project (Bug, Feature, ...).
identifierNoURL-safe project slug. Either this or the numeric id can be used as projectId for other tools.
descriptionNoProject description (Textile/Markdown markup).
enabledModulesNoNames of enabled Redmine modules (e.g. issue_tracking, wiki, repository).

TDQS

A4.3/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety and side-effect profile. The description adds minimal behavioral detail beyond the annotations; it says 'Inspect' which aligns with read-only, but it doesn't disclose additional behavioral traits like authentication requirements or performance characteristics. Since the annotations are comprehensive, the description adds only marginal behavioral value.

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 with zero wasted words. The first sentence front-loads the primary purpose and content, and the second sentence provides targeted alternatives. This is a model of concise, structured tool documentation.

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 single parameter, the presence of an output schema, and comprehensive annotations, the description is complete for an agent to select and invoke the tool correctly. It states what the tool returns (configuration and metadata including description, trackers, enabled modules) and when to use alternatives, leaving no critical gaps.

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

Parameters3/5

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

The input schema fully documents the single parameter, projectId, with 'Project identifier or numeric ID' (100% schema coverage). The description does not add any further meaning or constraints about the parameter beyond what the schema already provides. With full schema coverage, the baseline of 3 applies.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Inspect one known project's configuration and metadata' with a specific verb ('Inspect') and resource ('project configuration and metadata'). It also lists what is included (description, trackers, enabled modules) and distinguishes from siblings by naming alternatives. This makes it immediately clear what the tool does and how it differs from related tools.

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

Usage Guidelines5/5

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

The description explicitly provides when-not-to-use guidance: 'Use getProjectSummary for aggregated issue metrics, listProjectMembers for people or listVersions for milestones.' This directly tells an agent which alternative to choose based on the need, leaving no ambiguity about when this tool is appropriate.

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

getProjectSummarygetProjectSummaryA
Read-onlyIdempotent

Summarize one project's issue health, optionally scoped to a milestone: complete open/closed totals plus status, tracker, priority and assignee distributions, overdue work and estimated versus spent hours for the analyzed open-issue set. Use listIssues when issue records are needed instead of aggregates.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject identifier or numeric ID
versionIdNoVersion/milestone ID; from listVersions

Output Schema

ParametersJSON Schema
NameRequiredDescription
hoursNo
countsNo
overdueYesNumber of open issues whose due date is in the past.
byStatusNoOpen-issue counts grouped by status name.
byTrackerNoOpen-issue counts grouped by tracker name.
projectIdNoProject identifier the summary was computed for.
truncatedYesTrue when the analyzed open issue set is a truncated slice of the full open set (analysis cap reached).
versionIdNoVersion/milestone the summary was scoped to, null when unscoped.
byAssigneeNoPer-assignee workload — total and overdue counts.
byPriorityNoOpen-issue counts grouped by priority name.
analyzedOpenIssuesYesNumber of open issues actually analyzed for the distributions below.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is known. The description adds behavioral context beyond that: the summary spans only the open-issue set and includes specifics like estimated-vs-spent hours and distributions. It does not mention auth or rate limits, but those are not essential given the annotation coverage. No contradiction with annotations.

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

Conciseness4/5

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

The description is a single dense sentence with a clear purpose and a final usage pointer. Every clause adds measurable detail (totals, distributions, overdue, hours). It is moderately long, but the information is front-loaded and no filler exists.

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

Completeness5/5

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

For a read-only aggregation tool with two parameters, an output schema, and full annotation coverage, the description leaves nothing essential uncovered. It clearly explains what the tool returns (aggregates), how scope is controlled (milestone), and when to choose listIssues instead. An agent can invoke this tool correctly based solely on the given description plus schema.

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

Parameters3/5

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

Schema description coverage is 100%, and both parameters are already described ('Project identifier or numeric ID', 'Version/milestone ID; from listVersions'). The description's 'optionally scoped to a milestone' only echoes the existing optional parameter. The schema carries the semantic load, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb ('Summarize') and a concrete resource ('one project's issue health'), then enumerates distinct facets (totals, status/tracker/priority/assignee distributions, overdue, hours). It explicitly contrasts with the sibling listIssues, so an agent can tell them apart without opening their schemas.

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

Usage Guidelines5/5

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

It gives explicit guidance: 'Use listIssues when issue records are needed instead of aggregates.' This names an alternative and gives the exact condition that triggers the switch. It also states the optional scope of 'to a milestone', telling the agent when versionId is useful.

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

getReleaseRisksgetReleaseRisksA
Read-onlyIdempotent

Assess readiness risks for one known version/milestone: open blockers, overdue work, high-priority unresolved issues and unassigned tasks, with a risk score. Use getVersionChangelog for the milestone issue breakdown rather than risk triage.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject identifier or numeric ID
versionIdYesVersion/milestone ID; from listVersions

Output Schema

ParametersJSON Schema
NameRequiredDescription
scoreNoAggregate risk score.
versionNo
projectIdNoProject identifier the version belongs to.
truncatedYesTrue when the analyzed set is a truncated slice of the full open set.
versionIdYesVersion/milestone identifier.
categoriesNoRisk categories that contain at least one issue.
analyzedIssuesYesNumber of issues actually analyzed for risks.
totalOpenIssuesYesTotal open issues for the version across all pages.
highPriorityNamesNoPriority names treated as 'high' by the heuristic (top third of the priority ladder, or just the highest one).

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds the tool's behavior, namely that it returns a risk score and aggregates issues, which is useful beyond the annotations. However, it does not disclose details like how the risk score is computed, pagination, or the exact structure of the output. Given the annotations, a 3 is appropriate; the description adds moderate context but not deep behavioral detail.

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

Conciseness5/5

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

The description is a single sentence that front-loads the core purpose and then lists the types of issues checked. It ends with the alternative routing. Every word is purposeful with no padding; it is efficient and well-structured for agent consumption.

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 a read-only risk assessment, and the annotations plus schema cover the safety profile and parameters. The description explains what it does and when to use it. Since an output schema exists, return value details aren't required. The main missing piece is the risk score's calculation semantics, but that doesn't block correct invocation. Given the clarity and routing, it is nearly complete, so a 4 is appropriate.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented, including the note that versionId comes from listVersions. The description does not add new meaning to the parameters (e.g., no format hints for projectId or versionId beyond schema), but that's acceptable because the schema carries the burden. Baseline 3 is correct.

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

Purpose5/5

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

States a specific purpose: assessing readiness risks for a version/milestone, and enumerates concrete issue types it checks (blockers, overdue work, high-priority issues, unassigned tasks) plus a risk score. This clearly distinguishes it from siblings like getVersionChangelog, which is explicitly named as the alternative for issue breakdowns.

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

Usage Guidelines5/5

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

Explicitly tells the agent when to use this tool (for risk assessment of a known version/milestone) and when not to (use getVersionChangelog for milestone issue breakdown rather than risk triage), naming the specific alternative tool. This is clear routing guidance that prevents mis-selection.

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

getStaleIssuesgetStaleIssuesA
Read-onlyIdempotent

Identify neglected open issues in one project by last-update age, ordered most stale first. Use listIssues for general field or status filters; this tool is for inactivity triage.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
projectIdYesProject identifier or numeric ID
daysSinceUpdateNoMinimum days since last update

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitYesMaximum number of results the search was capped at.
issuesNoStale issues that crossed the threshold.
projectIdNoProject identifier the search was scoped to.
daysSinceUpdateYesInactivity threshold in days that was applied.
oldestDaysSinceUpdatedYesHow many days the oldest returned issue has been untouched. 0 when the result set is empty.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, covering safety. The description adds behavioral context by specifying that it filters open issues, orders by staleness, and is for inactivity triage, which is beyond what annotations provide. It doesn't contradict annotations.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose and a pointer to the alternative. Every word earns its place.

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

Completeness4/5

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

With an output schema present and annotations covering safety, the description provides sufficient context for calling the tool: it clarifies the filter (open issues), the ordering, and the use case. It doesn't mention defaults or pagination, but that's minor given the output schema.

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

Parameters3/5

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

The schema already describes projectId and daysSinceUpdate, covering 67% of parameters. The description indirectly refers to daysSinceUpdate via 'last-update age' but doesn't add explicit parameter meaning. Since schema coverage is high, a baseline of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb 'Identify' and a clear resource 'neglected open issues in one project', and specifies ordering 'most stale first'. It also names the sibling tool 'listIssues' and clarifies the distinction, 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 Guidelines5/5

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

It explicitly instructs to use listIssues for general field or status filters and states this tool is for inactivity triage, providing a clear when-to-use and an alternative. This guides the agent to choose correctly.

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

getUserWorkloadgetUserWorkloadA
Read-onlyIdempotent

Analyze one user's open-issue workload by project and priority, including overdue count, estimated versus spent hours and top issues; omitting userId selects the API-key user. This returns aggregates, not issue records; use getMyIssues for the current user or listIssues for a specified user.

ParametersJSON Schema
NameRequiredDescriptionDefault
userIdNo
projectIdNoProject identifier or numeric ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
hoursNo
userIdYesUser identifier the analysis is for.
overdueYesNumber of analyzed issues whose due date is in the past.
userNameNoDisplay name of the user. May be a placeholder like 'User #42' when only an id was provided.
byProjectNoPer-project breakdown of the user's workload.
projectIdNoProject the workload was scoped to, null when scope is all projects.
topIssuesNoUp to 10 most important open issues for the user, sorted by priority then by due date.
truncatedYesTrue when the analyzed set is a truncated slice of the full open set.
analyzedIssuesYesNumber of issues actually analyzed (may be smaller than totalOpenIssues when analysis was truncated).
totalOpenIssuesYesTotal number of open issues assigned to the user across all pages.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description does not need to cover safety. It adds meaningful behavioral context by clarifying that the result is an aggregate view rather than issue records, and that omitting userId changes the target user to the API-key user.

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

Conciseness5/5

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

Two sentences carry significant value with no filler. The core behavior and filters are front-loaded, followed by the aggregate-versus-records distinction and a concise pointer to alternatives.

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 that an output schema exists, the annotations already cover the safety profile, and the description covers user selection, aggregation semantics, and sibling routing, nothing essential is missing for an agent to invoke this 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?

Schema coverage is only 50% because userId lacks any schema description. The description compensates by explaining the optional userId semantics, including the API-key user fallback. projectId is already described in the schema as 'Project identifier or numeric ID', and the description reinforces its role in workload analysis.

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

Purpose5/5

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

States a specific verb and resource ('Analyze one user's open-issue workload') and enumerates the analysis dimensions: project, priority, overdue count, estimated versus spent hours, and top issues. It also explicitly differentiates itself from siblings by noting it returns aggregates, not issue records, and names getMyIssues and listIssues as the alternatives.

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?

Provides clear routing guidance: use getMyIssues for the current user, listIssues for a specified user when issue records are needed, and this tool for aggregate workload analysis. Also explains the important behavior that omitting userId selects the API-key user, giving agents concrete selection criteria.

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

getVersionChangeloggetVersionChangelogA
Read-onlyIdempotent

Summarize the issue scope of one known version/milestone as open and closed counts with issues grouped by tracker. Use getReleaseRisks for readiness risks or listVersions to discover the version ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject identifier or numeric ID
versionIdYesVersion/milestone ID; from listVersions

Output Schema

ParametersJSON Schema
NameRequiredDescription
hoursNo
countsNo
versionNo
byTrackerNoIssues grouped by tracker name (Bug, Feature, ...).
projectIdNoProject identifier the version belongs to.
truncatedYesTrue when the analyzed set is a truncated slice of the full issue set.
versionIdYesVersion/milestone identifier.
totalIssuesYesTotal number of issues tied to this version across all pages.
analyzedIssuesYesNumber of issues actually analyzed for this changelog.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds that the tool summarizes rather than mutates and that it targets a single known version, which is useful behavioral context beyond the structured fields.

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

Conciseness5/5

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

Two sentences with no fluff. The primary purpose is front-loaded, and the alternative-tool guidance is compactly placed at the end. Every clause earns its place.

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

Completeness5/5

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

With an output schema present and robust annotations, the description only needed to clarify scope, output grouping, and how to obtain the version ID—all of which it does. An agent can correctly select and invoke this tool without additional context.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description's 'listVersions to discover the version ID' largely repeats the schema hint for versionId, and projectId is already self-explanatory in the schema. No new parameter-level meaning is added.

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

Purpose5/5

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

The description states a specific verb and resource: it summarizes one known version/milestone. It also specifies the output form (open and closed counts, grouped by tracker), which clearly separates it from generic changelog or comparison tools. The naming of getReleaseRisks and listVersions further disambiguates its niche.

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

Usage Guidelines5/5

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

It explicitly says to use getReleaseRisks when readiness risks are the goal, and listVersions when the version ID is unknown. This gives the agent an immediate routing decision against the most relevant siblings. No inference is required.

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

getWikiPagegetWikiPageA
Read-onlyIdempotent

Read the complete markup content and current version of one known project wiki page. Use listWikiPages or searchWikiPages to discover its title; the returned version is required by updateWikiPage.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageTitleYesWiki page title (use 'Wiki' for the start page)
projectIdYesProject identifier or numeric ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
textNoPage body in Textile or Markdown markup depending on the Redmine instance. Null in index listings.
titleNoPage title (URL-escaped form used as the path).
authorNoAuthor of the most recent revision.
versionNoMonotonic revision number of the page. Null for a content-less page in index listings.
commentsNoComment attached to the most recent revision.
createdOnNoWhen the page was first created, ISO-8601.
updatedOnNoWhen the page was last edited, ISO-8601.
attachmentsNoFiles attached to the page. Empty in index listings.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds behavioral context beyond that: it returns complete markup and the current version, and requires a known page title. This is useful supplemental detail without contradicting the annotations.

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

Conciseness5/5

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

Two sentences, front-loaded with purpose, then usage guidance. Every sentence earns its place with no redundancy or filler.

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

Completeness5/5

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

With an output schema present to document return values, and annotations covering safety, the description covers all critical usage aspects: how to discover the title, what the return includes, and the relationship to updateWikiPage. Nothing essential is missing for an agent to call this correctly.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description adds the 'use Wiki for the start page' hint for pageTitle, which is helpful but also present in the schema. No significant extra parameter meaning is provided beyond the schema, so a 3 is appropriate.

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

Purpose5/5

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

The description clearly states the verb (read), the resource (project wiki page), and the exact scope (complete markup content and current version). It distinguishes itself from sibling tools like listWikiPages and searchWikiPages by specifying 'one known project wiki page', implying the caller must already have the exact title.

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

Usage Guidelines5/5

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

It explicitly instructs when to use this tool: after discovering the title via listWikiPages or searchWikiPages. It also states the returned version is required by updateWikiPage, giving a clear prerequisite and downstream use case. This provides both when-to-use and when-not-to-use guidance.

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

listIssueCategorieslistIssueCategoriesA
Read-onlyIdempotent

Discover issue category IDs and names configured for one known project. Reuse the IDs as categoryId in createIssue or updateIssue.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject identifier or numeric ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNoEntity references.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds value by disclosing that the output is meant to be reused as categoryId and that the lookup is scoped to one known project, which informs how the agent should use the result.

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

Conciseness5/5

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

Two short sentences front-load the purpose and add one directly actionable usage note. There is no redundant restatement of the tool name, title, or annotations.

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 single-parameter read-only list tool with an output schema, the description fully supports correct invocation: the agent knows the required projectId, the nature of the returned data, and how to consume it downstream. Nothing essential is missing.

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

Parameters3/5

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

Schema coverage is 100%, so projectId is already described as 'Project identifier or numeric ID'. The description adds no additional parameter syntax or constraints beyond the idea of a known project, which is acceptable since the schema carries the parameter meaning.

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?

Clearly states a specific verb+resource: list issue categories for one project, and names the meaningful output (IDs and names). It distinguishes itself from sibling metadata tools like listPriorities, listStatuses, and listTrackers by focusing specifically on issue categories.

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

Usage Guidelines4/5

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

States it is for discovering category IDs for a known project and explicitly connects the result to createIssue or updateIssue via categoryId. It does not name excluded alternatives, but the 'one known project' scope and category-specific purpose give an agent clear context to select it correctly.

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

listIssueslistIssuesA
Read-onlyIdempotent

Browse issue summaries with structured Redmine filters, saved queries, custom-field filters, sorting and pagination. Use searchIssues when only free text is known, or getIssue for one known issue's complete context.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort field and direction, e.g. 'updated_on:desc'
limitNo
offsetNo
queryIdNoSaved query ID; from listQueries
statusIdNoStatus filter: open (default), closed, * (all), or a numeric status ID from listStatuses
projectIdNoProject identifier or numeric ID
trackerIdNoTracker ID (issue type); from listTrackers
versionIdNoVersion/milestone ID; from listVersions
priorityIdNoPriority ID; from listPriorities
assignedToUserIdNo
customFieldFiltersNoCustom field filters in query-string form, e.g. 'cf_10=rtk&cf_3=502167'

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitYesMaximum number of issues that may appear on this page.
issuesNoIssues on this page.
offsetYesZero-based offset of the first issue on this page.
totalCountYesTotal number of issues matching the query across all pages.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe read operation. The description adds that it returns 'issue summaries' (not full details) and mentions pagination, which is useful. However, it doesn't disclose default sort order, default limit, or how custom field filters interact with other filters. The description adds minimal context beyond the annotations, so a 3 is appropriate.

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

Conciseness5/5

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

The description is a single sentence that front-loads the core purpose and key capabilities, then adds a concise routing instruction. Every word earns its place; there is no fluff or repetition.

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

Completeness4/5

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

Given that the tool has an output schema, the description doesn't need to explain return values. It covers the core function (browsing issue summaries), key filters, sorting, pagination, and sibling differentiation. It could benefit from noting that it only returns summaries (not full details) and maybe a default limit, but these are minor given the output schema and annotations.

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

Parameters3/5

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

Schema description coverage is 73%, so the schema already documents most parameters. The description adds context that queryId is from listQueries, statusId can be 'open' or 'closed' (default), and customFieldFilters are in query-string form, which goes beyond the schema for those fields. However, several parameters (assignedToUserId, limit, offset) lack descriptions in both the schema and the description, leaving some gaps. The description adds value but not enough to fully compensate for the uncovered parameters.

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

Purpose5/5

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

The description states a specific verb ('Browse') and resource ('issue summaries') and immediately enumerates the key dimensions (filters, saved queries, custom-field filters, sorting, pagination). It also differentiates itself from siblings by naming searchIssues (free text) and getIssue (complete context for one issue), so an agent can clearly tell this is the list/browse tool.

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

Usage Guidelines5/5

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

The description explicitly tells when to use this tool versus alternatives: use searchIssues when only free text is known, or getIssue for one known issue's complete context. This gives clear selection criteria, though it doesn't exhaustively list all sibling alternatives (e.g., getMyIssues), but the guidance provided is strong enough for this purpose.

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

listPrioritieslistPrioritiesA
Read-onlyIdempotent

Discover valid issue priority IDs and names before filtering, creating or updating issues. Reuse the IDs as priorityId in listIssues, createIssue or updateIssue.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNoEntity references.

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds the behavioral context that this is a discovery/lookup operation and that the returned IDs are meant to be reused. However, it doesn't describe the output format or whether the list is ordered, but with a rich output schema present and annotations covering safety, a 3 is appropriate.

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

Conciseness5/5

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

Two sentences with no wasted words. The first sentence states the purpose and the second provides the reuse guidance. It is front-loaded with the core action and immediately gives the agent the key information needed to use the tool correctly.

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

Completeness4/5

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

For a zero-parameter, read-only lookup tool with an output schema and strong annotations, the description is nearly complete. It explains why the tool exists and how to use its output. The only minor gap is that it doesn't mention whether the list is exhaustive or ordered, but the openWorldHint annotation and output schema likely cover the return structure. This is a minor gap, not a significant one.

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 there is no parameter semantics burden on the description. The schema coverage is 100% (vacuously, since there are no properties). The description adds value by explaining the purpose of the output (valid IDs for reuse), which is more than the empty schema provides. Baseline 4 for zero-parameter tools is appropriate.

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

Purpose5/5

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

The description clearly states the tool's purpose: discovering valid issue priority IDs and names. It specifies the resource (issue priorities) and the action (discover/list), and it explicitly distinguishes its role as a lookup tool for use before filtering, creating, or updating issues. This differentiates it from sibling tools like listStatuses or listTrackers, which serve different lookup purposes.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool: before filtering, creating, or updating issues. It also tells the agent how to reuse the output (as priorityId in listIssues, createIssue, or updateIssue). This is clear, actionable guidance that routes the agent to the correct tool and explains the downstream usage.

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

listProjectMemberslistProjectMembersA
Read-onlyIdempotent

Discover the users and groups that belong to one project, their IDs and assigned roles. Use when choosing or interpreting assignees; getUserWorkload analyzes a user's issues rather than membership.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
projectIdYesProject identifier or numeric ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitYesMaximum number of memberships that may appear on this page.
offsetYesZero-based offset of the first membership on this page.
membersNoMemberships on this page.
totalCountYesTotal number of memberships across all pages.

TDQS

A4.1/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful context about membership vs. workload, but it does not disclose behavioral details such as default pagination behavior, open-world semantics, or any access requirements.

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 concise sentences with no filler. The core purpose and output scope are front-loaded, followed by a focused usage note naming the alternative tool.

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

Completeness4/5

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

With annotations covering safety, an output schema present, and the required projectId clearly identified, an agent has enough to invoke the tool correctly. The only notable omission is a description of limit/offset, but this is minor for standard pagination parameters and does not block correct use.

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

Parameters2/5

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

Schema description coverage is only 33%; only projectId has a schema description, while limit and offset are undocumented. The description reinforces that projectId identifies one project, but it does not explain limit/offset pagination semantics, leaving a real gap for those parameters.

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 names a specific verb and resource: it 'discovers' the users/groups of a project and reports their IDs and roles. It also explicitly distinguishes itself from getUserWorkload, which analyzes a user's issues rather than project membership, so an agent can tell them apart immediately.

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

Usage Guidelines5/5

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

It states when to use the tool: 'Use when choosing or interpreting assignees.' It also names the closest alternative, getUserWorkload, and explains why that tool is not the right choice for membership questions. This gives clear routing guidance.

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

listProjectslistProjectsA
Read-onlyIdempotent

Discover accessible Redmine projects and their valid identifiers before project-scoped operations when the target project is unknown. Returns project summaries; use getProject for one project's details.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitYesMaximum number of projects that may appear on this page.
offsetYesZero-based offset of the first project on this page.
projectsNoProjects on this page.
totalCountYesTotal number of projects across all pages.

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, covering the safety profile. The description adds meaningful context beyond these annotations by stating that only 'accessible' projects are listed, which implies authentication and permission filtering, and by clarifying that the return is project summaries rather than full details. No contradiction exists.

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 with no wasted words. It front-loads the primary purpose and action, then includes the key alternative. Every sentence earns its place, and the structure makes it easy for an agent to parse the core intent quickly.

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 that the tool has an output schema, the return value format is already covered. The description provides the purpose, usage timing, and the main alternative, while annotations cover safety and idempotency. The only gap is that limit and offset are not described in either the schema or the description, which is a minor omission for a simple listing tool with optional parameters.

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

Parameters2/5

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

The schema has 0% description coverage for parameters, and the description does not mention limit or offset at all. The parameter names are somewhat self-explanatory as pagination controls, but the description adds no explicit meaning about their behavior, defaults, or relationship to result size. Given the low schema coverage, the description should have compensated but does not.

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 action ('Discover accessible Redmine projects and their valid identifiers') and the specific resource (Redmine projects), giving agents a precise understanding of what the tool does. It also differentiates from the sibling tool getProject by noting that listProjects returns summaries while getProject provides one project's details.

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

Usage Guidelines5/5

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

The description explicitly tells the agent when to use this tool: 'before project-scoped operations when the target project is unknown.' It also names the alternative, getProject, and states the condition for choosing it ('for one project's details'). This is clear, actionable guidance that routes the agent correctly.

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

listQuerieslistQueriesA
Read-onlyIdempotent

Discover saved Redmine issue queries (stored filters), especially filters involving custom fields. Returns query IDs and names rather than issue results; pass a selected queryId to listIssues.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitYesMaximum number of queries that may appear on this page.
offsetYesZero-based offset of the first query on this page.
queriesNoQueries on this page.
totalCountYesTotal number of queries across all pages.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint, so the description's added value is contextual: it reveals that results are query metadata (IDs/names) rather than issues, and that the output feeds listIssues. It does not mention pagination behavior for limit/offset, but the output schema and read-only annotations lower the burden.

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

Conciseness5/5

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

Two sentences, each earning its place: the first defines the purpose/scope, the second clarifies the return type and the follow-up workflow. The key distinction from listIssues is front-loaded.

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

Completeness4/5

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

For a read-only, zero-required-parameter listing tool with an output schema, the description covers purpose, scope, return shape, and downstream use. The only real gap is that limit/offset remain semantically undocumented in both schema and prose, which is minor because they are optional and self-explanatory as pagination terms.

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

Parameters2/5

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

Schema description coverage is 0%, and the description provides no explanation of limit or offset. The parameter names weakly imply pagination controls, but the description neither confirms nor documents their meaning, defaults, or constraints, so it fails to compensate for the missing schema 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 names a specific verb and resource ('Discover saved Redmine issue queries (stored filters)') and distinguishes it from sibling list tools by stating that it returns query IDs and names, not issue results. It also explicitly routes to listIssues for the follow-up call, making the tool's role unambiguous.

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

Usage Guidelines5/5

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

It gives a clear when-to-use signal ('especially filters involving custom fields') and an explicit when-not/alternative: 'Returns query IDs and names rather than issue results; pass a selected queryId to listIssues.' An agent can decide between listQueries and listIssues without additional inference.

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

listStatuseslistStatusesA
Read-onlyIdempotent

Discover valid Redmine issue status IDs and names for structured issue filtering or mutation. Reuse the IDs as statusId in listIssues, createIssue or updateIssue.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNoEntity references.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the description does not need to restate those. It adds useful context about reusing IDs as statusId, but it does not describe other behavioral traits such as pagination, ordering, or response shape. No contradiction with annotations exists.

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 with no filler. The primary purpose is front-loaded in the first sentence, and the second sentence immediately explains practical downstream usage.

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 zero-parameter lookup tool with strong annotations and an output schema present, the description is fully sufficient. It explains what is returned, why it matters, and how the results should be used in sibling tools.

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 input schema provides no semantics to enhance. The description still adds value by clarifying that the tool returns IDs and names rather than requiring inputs. Baseline 4 is appropriate here.

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 identifies the tool's purpose: discovering Redmine issue status IDs and names. It also distinguishes itself from sibling list tools like listPriorities and listTrackers by explicitly limiting scope to issue statuses and positioning them as canonical inputs for statusId.

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 clear usage context: use this tool to discover valid status IDs for filtering or mutation, and reuse the IDs in listIssues, createIssue, or updateIssue. It does not explicitly state when not to use it or name exclusion conditions, so it stops 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.

listTimeEntrieslistTimeEntriesA
Read-onlyIdempotent

Browse actual Redmine time-entry records using project, issue, user and date-range filters. Use getMyTimeEntries for the API-key user without looking up an ID; getUserWorkload returns aggregates instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoYYYY-MM-DD
fromNoYYYY-MM-DD
limitNo
offsetNo
userIdNo
issueIdNo
projectIdNoProject identifier or numeric ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitYesMaximum number of entries that may appear on this page.
offsetYesZero-based offset of the first entry on this page.
totalCountYesTotal number of time entries across all pages.
timeEntriesNoTime entries on this page.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark this as read-only, idempotent, and non-destructive. The description adds useful behavioral context by emphasizing that it returns actual time-entry records rather than aggregates, and by specifying the available filter scopes. It does not cover pagination or default limits, but the annotations carry the safety profile.

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

Conciseness5/5

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

Two sentences with no filler. The core purpose is front-loaded, and the alternative routing is packed efficiently into the second sentence.

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

Completeness4/5

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

The description gives the essential selection criteria and explicitly routes to relevant siblings. It does not mention that all parameters are optional or how pagination behaves, but the empty required list and output schema reduce the need for that detail. Overall it is sufficient for correct tool selection and basic invocation.

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

Parameters3/5

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

Schema coverage is only 43%, so the description must compensate. It does add meaning for project, issue, user, and date-range parameters by naming them as filters, but it leaves limit and offset unexplained. The schema describes only to, from, and projectId, so those two pagination parameters remain underspecified.

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 a specific verb ('Browse') and resource ('actual Redmine time-entry records'), and names the filter dimensions. It also distinguishes itself from getMyTimeEntries and getUserWorkload, so an agent can tell them apart immediately.

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

Usage Guidelines5/5

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

It explicitly says to use getMyTimeEntries when targeting the API-key user without an ID lookup, and getUserWorkload when aggregates are needed. This gives concrete when-to-use and when-not-to-use guidance relative to siblings.

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

listTimeEntryActivitieslistTimeEntryActivitiesA
Read-onlyIdempotent

Discover valid time-entry activity IDs and names for interpreting logged hours or creating a time entry. Reuse an ID as activityId in createTimeEntry when the default activity is unsuitable.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNoEntity references.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds purpose and linkage to createTimeEntry but does not describe return format or pagination. It adds value but not rich behavioral detail beyond annotations.

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

Conciseness5/5

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

Two sentences, no fluff, and the core purpose is front-loaded. Every phrase earns its place, and the linkage to createTimeEntry is stated efficiently.

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 zero-parameter tool with an output schema, the description is complete. It explains what the tool returns (IDs and names), why it matters (interpreting hours, creating entries), and how to use the result. Nothing essential is missing.

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

Parameters4/5

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

The tool has zero parameters, so the schema description coverage is trivially 100%. The baseline of 4 applies because no parameter documentation is needed; the description appropriately focuses on output purpose and usage.

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

Purpose5/5

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

The description states a clear verb ('Discover') and a specific resource ('valid time-entry activity IDs and names'), and explicitly ties it to createTimeEntry, differentiating it from the many other list tools. The purpose is unambiguous and provides actionable context.

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 an explicit when-to-use scenario: interpreting logged hours or creating a time entry, and even specifies a condition ('when the default activity is unsuitable'). It lacks an explicit when-not-to-use statement, but the context is strong enough for an agent to route correctly.

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

listTrackerslistTrackersA
Read-onlyIdempotent

Discover valid tracker (issue type) IDs and names before filtering, creating or updating issues. Reuse the IDs as trackerId in listIssues, createIssue or updateIssue.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNoEntity references.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, covering safety. The description adds valuable context about the purpose (discovering reusable IDs) and clarifies terminology ('issue type'). Does not contradict annotations.

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

Conciseness5/5

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

Two concise sentences, no fluff. The core purpose is front-loaded, and the reuse guidance is clear. Every sentence earns its place.

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

Completeness5/5

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

With an output schema available and annotations covering safety, the description fully explains why and when to use the tool and how the result is consumed. Nothing an agent needs to decide on or call the tool is missing.

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

Parameters4/5

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

No parameters exist, so the baseline is 4. The description correctly notes that no inputs are needed and explains the output's purpose, though it doesn't detail output structure – but an output schema is present, so this is acceptable.

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

Purpose5/5

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

States a specific verb 'Discover' with a clear resource 'valid tracker (issue type) IDs and names' and its purpose for reuse. Clearly distinguishes from sibling tools like listIssueCategories and listPriorities by specifying trackerId usage.

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

Usage Guidelines5/5

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

Explicitly states when to use it: 'before filtering, creating or updating issues' and names the exact tools (listIssues, createIssue, updateIssue) that consume the IDs. No ambiguity about when this tool is relevant.

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

listVersionslistVersionsA
Read-onlyIdempotent

Discover versions/milestones of one project and the IDs used by issue filters and release analytics. Returns milestone metadata, not issue scope or risk; use getVersionChangelog or getReleaseRisks for those.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject identifier or numeric ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
versionsNoProject versions.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive, open-world hints. The description adds context about data scope (milestone metadata only, not issue scope/risk), which goes beyond annotations and informs the caller about expected results.

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

Conciseness5/5

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

Two tightly packed sentences with zero fluff: the first establishes purpose and key output, the second clarifies exclusions and routes to alternatives. Front-loaded and efficient.

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 one-parameter tool with a defined output schema and annotations covering safety and open-world semantics, the description fully covers purpose, exclusions, and alternatives. No missing critical information.

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

Parameters3/5

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

Schema coverage is 100% (projectId has a description), so baseline is 3. The description mentions 'of one project' but adds no extra syntax or parameter behavior beyond the schema's own documentation.

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

Purpose5/5

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

The description states a clear verb ('Discover') and resource ('versions/milestones of one project'), and explicitly notes what it returns (IDs for filters/analytics) and what it does not (scope or risk), distinguishing it from siblings by name.

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

Usage Guidelines5/5

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

It names the alternatives (getVersionChangelog, getReleaseRisks) and the conditions for choosing them, giving explicit when-to-use and when-not-to-use guidance without ambiguity.

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

listWikiPageslistWikiPagesA
Read-onlyIdempotent

Discover wiki page titles in one known project without loading every page body. Use getWikiPage to read a selected title or searchWikiPages when only content terms are known.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject identifier or numeric ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
pagesNoWiki pages.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint). The description adds a meaningful behavioral trait beyond annotations: it does not load every page body, implying it is a lightweight listing operation that returns only titles. This is useful context for an agent deciding between this and heavier alternatives.

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

Conciseness5/5

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

Two concise sentences, each earning its place. The first front-loads the core purpose and key limitation (no page bodies), and the second gives actionable routing to alternatives. No redundancy or 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?

For a simple listing tool with one parameter and an existing output schema, the description is complete. It covers what it returns (titles), the precondition (known project), and directs to alternatives when appropriate. Nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100% for the single parameter projectId, so the schema already fully documents it. The description adds no extra semantics about the parameter format or constraints, which is acceptable given full 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 states a specific action ('Discover wiki page titles') on a specific resource ('one known project') and adds a key distinguishing detail ('without loading every page body'). It also names the sibling tools that are NOT this one, making the purpose unambiguous even among 30+ siblings.

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

Usage Guidelines5/5

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

The description explicitly provides when-to-use and when-not-to-use guidance: it directs the agent to getWikiPage when a title is already known, and to searchWikiPages when only content terms are known. It also clarifies the precondition 'one known project', which implies projectId is required.

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

searchAllsearchAllA
Read-onlyIdempotent

Search by free text across mixed Redmine content such as issues, wiki pages, news, documents, changesets, messages and projects. Use searchIssues for richer issue-only results or searchWikiPages for wiki-only discovery.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
typesNoComma-separated content types to include: issues, wiki_pages, news, documents, changesets, messages, projects
offsetNo
projectIdNoProject identifier or numeric ID
searchQueryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitYesMaximum number of hits that may appear on this page.
offsetYesZero-based offset of the first hit on this page.
resultsNoHits on this page.
totalCountYesTotal number of hits across all pages.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is well covered. The description adds the mixed-content breadth but does not disclose pagination defaults, result ordering, or whether all content types are searched by default. For a simple read-only search tool this is acceptable, though not richly 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?

Two sentences with no filler. The core action and scope are front-loaded, and the sibling recommendations occupy the second sentence without bloating the description.

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

Completeness4/5

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

An output schema exists, so return-value details are not the description's job. Annotations cover read-only/idempotent behavior. The description provides scope, content types, and sibling routing. It could mention default type behavior or pagination, but for a mixed-content search tool the definition is fairly complete.

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

Parameters3/5

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

Schema description coverage is only 40%, so the description must compensate. It does add meaning for the required searchQuery as 'free text' and clarifies the content types in plain language, but it provides no additional guidance for limit, offset, or projectId beyond the schema. This is partial compensation rather than full.

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

Purpose5/5

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

The description uses a specific verb ('Search by free text') and a concrete resource ('mixed Redmine content'), enumerates the content types, and explicitly names sibling tools it is not (searchIssues, searchWikiPages). An agent can immediately tell what this tool does and how it differs from nearby alternatives.

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

Usage Guidelines5/5

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

The description gives clear routing guidance: use searchIssues for richer issue-only results and searchWikiPages for wiki-only discovery. This explicitly tells an agent when to prefer alternatives over searchAll, which is exactly the kind of decision support this dimension rewards.

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

searchIssuessearchIssuesA
Read-onlyIdempotent

Find issue summaries by full-text query, optionally within one project. Use listIssues for exact field, saved-query or custom-field filtering, then getIssue to inspect a selected result.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
projectIdNoProject identifier or numeric ID
searchQueryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitYesMaximum number of issues that may appear on this page.
issuesNoIssues on this page.
offsetYesZero-based offset of the first issue on this page.
totalCountYesTotal number of issues matching the query across all pages.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds minimal behavioral context beyond that—only the scoping to 'within one project' (already in schema) and the notion of returning summaries. No contradictions; it earns a baseline 3 because it adds little extra but doesn't need to.

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

Conciseness5/5

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

Two sentences with zero fluff. The primary purpose is front-loaded, and the routing guidance is appended as a separate, clearly scoped sentence. Every word earns its place.

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

Completeness4/5

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

For a 4-param tool with one required param and a low schema coverage, the description covers the core use case and routing but omits pagination semantics. However, an output schema exists, so return values are handled elsewhere. The missing param details are a minor gap given the explicit routing and annotations.

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

Parameters2/5

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

Schema description coverage is only 25% (only projectId is described). The description clarifies searchQuery as 'full-text query' but leaves limit and offset entirely unexplained. Since coverage is low, the description should compensate more; it only partially does, so a 2 is appropriate.

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

Purpose5/5

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

The description states a clear verb ('Find'), resource ('issue summaries'), and method ('full-text query'), plus an optional scope ('within one project'). It explicitly distinguishes itself from listIssues (exact-field/saved-query/custom-field filtering) and getIssue (inspect result), so an agent can select it correctly without opening schemas.

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

Usage Guidelines5/5

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

The description gives explicit routing: use listIssues for structured filters and getIssue for details, implying searchIssues is for full-text search. It names alternatives and conditions, leaving no ambiguity about when to invoke this tool.

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

searchWikiPagessearchWikiPagesA
Read-onlyIdempotent

Find project wiki pages by full-text content query, optionally across all accessible projects. Use getWikiPage to read a selected result or searchAll when non-wiki content should also match.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
projectIdNoProject identifier or numeric ID
searchQueryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitYesMaximum number of hits that may appear on this page.
offsetYesZero-based offset of the first hit on this page.
resultsNoHits on this page.
totalCountYesTotal number of hits across all pages.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, open-world, and non-destructive behavior, so the bar is lower. The description adds useful behavioral context: full-text content matching, optional cross-project scope, and the fact that it only returns wiki pages—without contradicting the annotations.

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

Conciseness5/5

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

Two compact sentences with no filler; the primary action is front-loaded and the alternative routing is stated immediately after. Every sentence earns its place.

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

Completeness5/5

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

For a read-only search tool with robust annotations and an output schema, the description covers what it searches, the optional scope, and how to follow up on results. Nothing essential is missing for correct invocation.

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

Parameters3/5

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

With schema description coverage at only 25%, the description must compensate. It clarifies searchQuery as a full-text content query and projectId as an optional scope control ('across all accessible projects'), but limit and offset receive no added semantics beyond their standard names.

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

Purpose5/5

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

Description opens with a specific verb and resource ('Find project wiki pages') and identifies the query mechanism as full-text content search. It further scopes the tool to wiki content and explicitly names getWikiPage and searchAll in the next sentence, making differentiation from siblings clear.

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

Usage Guidelines5/5

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

It gives explicit alternatives with conditions: use getWikiPage to read a selected result, and use searchAll when non-wiki content should also match. The 'optionally across all accessible projects' phrasing also clarifies project scoping behavior.

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

updateIssueupdateIssueA
DestructiveIdempotent

Modify only the supplied fields of one existing Redmine issue; omitted fields remain unchanged. Use addIssueNote for a comment-only change; this tool does not edit existing journal entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
dueDateNoYYYY-MM-DD; empty string clears
issueIdYes
subjectNo
statusIdNoFrom listStatuses
doneRatioNo0-100
isPrivateNo
projectIdNoProject identifier or numeric ID
startDateNoYYYY-MM-DD; empty string clears
trackerIdNoFrom listTrackers
categoryIdNoFrom listIssueCategories; 0 clears
priorityIdNoFrom listPriorities
descriptionNo
parentIssueIdNo0 clears
estimatedHoursNo
fixedVersionIdNoFrom listVersions; 0 clears
assignedToUserIdNo0 clears
customFieldsJsonNoJSON object: field ID to scalar or scalar array

Output Schema

ParametersJSON Schema
NameRequiredDescription
issueIdYes
journalIdNo
attachmentIdNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuine value by clarifying PATCH semantics ('omitted fields remain unchanged') and the journal-entry limitation, though it omits permission requirements and failure modes.

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

Conciseness5/5

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

Two sentences, both earning their place. The mutation contract is front-loaded and the sibling routing follows immediately with no filler.

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

Completeness4/5

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

Return values are covered by the output schema, and for a 17-parameter mutation the key semantic (partial update, one issue) is stated. It is slightly thin on caveats such as permission needs, validation errors, and the customFieldsJson encoding, which the schema only briefly hints at.

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

Parameters3/5

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

Schema coverage is 71% and the schema documents formats, clearing conventions, and lookup-tool provenance. The description contributes the important partial-update contract (omitted fields unchanged) but gives no per-parameter guidance beyond that, which matches the baseline when the schema does most of the work.

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

Purpose5/5

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

States a specific verb (Modify) and resource (one existing Redmine issue), and explicitly scopes behavior to 'only the supplied fields'. It also names a sibling (addIssueNote) and excludes journal editing, which disambiguates it from the write-oriented siblings.

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

Usage Guidelines4/5

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

Gives a clear routing rule: use addIssueNote for comment-only changes. It also states a when-not ('does not edit existing journal entries'). It stops short of covering other near neighbors like createIssue or getIssueJournal, so not a full 5.

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

updateWikiPageupdateWikiPageA
DestructiveIdempotent

Replace the complete text of one existing Redmine wiki page; this is not a patch or append operation. Pass the current version from getWikiPage for optimistic locking, and use createWikiPage if absent.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
versionYesFrom getWikiPage
commentsNo
pageTitleYes
projectIdYesProject identifier or numeric ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
versionYesCurrent wiki page revision after the operation.
pageTitleYesWiki page title used in the page path.
projectIdYesProject identifier or numeric ID used for the request.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, and the description reinforces this by clarifying the full-replacement semantics rather than a partial edit. It adds real value beyond annotations by disclosing the optimistic-locking/concurrency requirement, though it says nothing about permission needs or conflict-error behavior.

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

Conciseness5/5

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

Two dense sentences that are front-loaded with the operation semantics and then the preconditions/alternative. Every clause carries information; no filler.

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

Completeness4/5

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

An output schema exists so return values need no explanation, and annotations cover the safety profile, leaving the description to handle replacement scope and concurrency — both addressed. It stops short of covering the undocumented comments parameter or failure behavior, which is the only remaining gap.

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

Parameters4/5

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

Schema description coverage is only 40%, so the description must compensate, and it does for the two most consequential parameters: text is a complete replacement, and version is the current value from getWikiPage used for optimistic locking. It says nothing about comments, pageTitle, or projectId, so coverage is not complete.

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

Purpose5/5

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

States a precise verb and resource ('Replace the complete text of one existing Redmine wiki page') and immediately disambiguates the operation type ('not a patch or append'). It also names the sibling to use for the creation case, so an agent can distinguish it from createWikiPage without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit when-not guidance ('not a patch or append') and an explicit alternative with its triggering condition ('use createWikiPage if absent'). It also states the prerequisite for the version parameter, leaving little to inference.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.1.1
    • AddedaddIssueNote
    • AddedattachFileToIssue
    • AddedcreateIssue
    • AddedcreateTimeEntry
    • AddedcreateWikiPage
    • ChangedgetAttachment3 fields changed
      • changedInput schema / properties / partLimit / description
        Previous value: -"Per-part character cap for extracted text"New value: +"Per-part character cap, mainly for ZIP entries; defaults to maxChars when maxChars is set"
      • addedOutput schema / properties / limits
        Added value: +{
        +  "allOf": [
        +    {
        +      "description": "Effective extracted-text limits for this call: the caller's maxChars/partLimit capped by the server, or the server defaults.",
        +      "properties": {
        +        "maxChars": {
        +          "description": "Total extracted-text characters allowed across all parts.",
        +          "format": "int32",
        +          "type": "integer"
        +        },
        +        "note": {
        +          "description": "Present when a requested limit was reduced to the server ceiling.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "partLimit": {
        +          "description": "Extracted-text characters allowed per part.",
        +          "format": "int32",
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "maxChars",
        +        "partLimit"
        +      ],
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    {
        +      "description": "Text limits applied to this response."
        +    }
        +  ]
        +}
      • addedOutput schema / properties / parts / items / properties / totalChars
        Added value: +{
        +  "description": "Full length of this part's text in characters; present when the text was cut.",
        +  "format": "int32",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • ChangedgetIssueHistory9 fields changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Next page index from nextOffset",
        +  "format": "int32",
        +  "type": "integer"
        +}
      • changedOutput schema / description
        Previous value: -"Interpreted history timeline for an issue: human-readable field changes plus aggregated time spent in each status."New value: +"Interpreted issue history. Read pages until nextOffset is absent to cover every event."
      • addedOutput schema / properties / compressionNotes
        Added value: +{
        +  "description": "What text was shortened and how to retrieve it in full.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Pass this as offset to getIssueHistory for the next page; absent when complete.",
        +  "format": "int32",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Index of this page's first event.",
        +  "format": "int32",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / sourceUpdatedOn
        Added value: +{
        +  "description": "Issue update timestamp; compare across pages to detect intervening edits.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / statusDurations / description
        Previous value: -"How long the issue stayed in each status, derived from journal entries."New value: +"Status intervals beginning in this page's events."
      • addedOutput schema / properties / totalEvents
        Added value: +{
        +  "description": "Total creation and journal events available.",
        +  "format": "int32",
        +  "type": "integer"
        +}
      • addedOutput schema / required
        Added value: +[
        +  "offset",
        +  "totalEvents"
        +]
    • ChangedgetIssueJournal1 field changed
      • changedInput schema / properties / journalId / description
        Previous value: -"Journal entry ID; from getIssue journals"New value: +"Journal entry ID from getIssue or getIssueHistory"
    • ChangedgetIssueTree2 fields changed
      • changedOutput schema / properties / ancestors / description
        Previous value: -"Parent chain in order parent → grandparent → ... up to the root-most ancestor."New value: +"Compact parent chain in order parent → grandparent → ... up to the root-most ancestor."
      • changedOutput schema / properties / root / description
        Previous value: -"The issue the tree is centred around. Inspect its `related` field for cross-issue relations."New value: +"Compact context for the target issue; call getIssue for full details and relations."
    • AddedupdateIssue
    • AddedupdateWikiPage
  2. 32 tool updates
    • First observedcompareVersions
    • First observedgetAttachment
    • First observedgetBlockerChain
    • First observedgetCurrentUser
    • First observedgetIssue
    • First observedgetIssueHistory
    • First observedgetIssueJournal
    • First observedgetIssueTree
    • First observedgetMyIssues
    • First observedgetMyTimeEntries
    • First observedgetProject
    • First observedgetProjectSummary
    • First observedgetReleaseRisks
    • First observedgetStaleIssues
    • First observedgetUserWorkload
    • First observedgetVersionChangelog
    • First observedgetWikiPage
    • First observedlistIssueCategories
    • First observedlistIssues
    • First observedlistPriorities
    • First observedlistProjectMembers
    • First observedlistProjects
    • First observedlistQueries
    • First observedlistStatuses
    • First observedlistTimeEntries
    • First observedlistTimeEntryActivities
    • First observedlistTrackers
    • First observedlistVersions
    • First observedlistWikiPages
    • First observedsearchAll
    • First observedsearchIssues
    • First observedsearchWikiPages

TDQS

A4.1/5.0

Scored across 39 tools

Disambiguation5/5

Each tool targets a distinct resource and action, and descriptions explicitly cross-reference alternatives (e.g., listIssues vs searchIssues vs getMyIssues, getIssue vs getIssueHistory). The surface is large but boundaries are clearly documented, leaving little true ambiguity.

Naming Consistency5/5

Consistent camelCase verb_noun pattern throughout (listIssues, getIssue, createWikiPage, searchAll). Minor 'My' variants (getMyIssues, getMyTimeEntries) remain predictable and readable.

Tool Count2/5

39 tools is excessive for a single MCP server; many list* metadata tools and specialized read tools could be consolidated or dynamically discovered, increasing selection burden.

Completeness3/5

Issue tracking and analytics are well covered, but notable gaps exist: no delete operations for issues, wiki pages, or time entries; no update/delete for time entries; no create/update for projects or versions.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers