Skip to main content
Glama
igorolv

redmine-mcp-server

Redmine MCP Server

CI Release License Java 25 MCP

A local MCP server for accessing a corporate Redmine instance. By default the server is fully read-only; an optional flag enables a limited set of write operations for issues and time entries. 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

By default the server exports 32 read-only MCP tools. When REDMINE_MCP_WRITE_ENABLED=true is set, 7 more write tools are added.

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

Dependency tree: parent chain upward, subtasks downward, relations. Parameters: issueId, depth (default 2, max 5)

Issue, Time Entry, and Wiki Writes (optional)

These tools appear in tools/list only when REDMINE_MCP_WRITE_ENABLED=true:

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 changes recognizable, created-issue descriptions, updated descriptions, new notes, and time-entry comments are prefixed with AI_EDIT:. For wiki pages this prefix goes into the revision comment, without changing the page markup. Uploaded file names are prefixed with AI_EDIT__.

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. Parameters: issueId, attachmentId, maxChars, partLimit

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

Without REDMINE_MCP_WRITE_ENABLED=true 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 (incident-*) are not affected by these flags.

MCP Prompts

The server also exports MCP prompts for typical incident-handling scenarios:

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, loads relevant attachments, and produces requirements, evidence per revision, and a verification checklist

incident-timeline

Incident chronology: fetches the issue with focus=timeline, pulls complete journal entries via getIssueJournal when needed, and builds a timeline of who did what and when

Tech Stack

  • Java 25, Spring Boot 4.0.0, Spring AI MCP 2.0.0-M6 (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; defaults to false

REDMINE_MCP_DATA_DIR

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

REDMINE_MCP_ATTACHMENT_PER_PART_CHARS

Text limit per single part (e.g., one file inside a ZIP) for getAttachment; defaults to 30000 characters. The tool's partLimit parameter overrides this value.

REDMINE_MCP_ATTACHMENT_PER_ATTACHMENT_CHARS

Total limit of extracted text per attachment in getAttachment; defaults to 50000 characters. The tool's maxChars parameter overrides this value.

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

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; defaults to 10000 characters

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.

  • By default all MCP tools are read-only. With REDMINE_MCP_WRITE_ENABLED=true seven explicitly listed write tools for issues, time entries, and wiki become available; 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 AI_EDIT marker is a search label, 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. In write mode 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. Do not run integrationTest with write enabled against 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 50,000 characters by default

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

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.

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           — MCP prompt for incident 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

32 tools
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.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
issueIdYes
maxCharsNoTotal character budget for extracted text across all parts
partLimitNoPer-part character cap for extracted text
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.
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.3/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. The description adds valuable behavior beyond that: downloading to the server's local snapshot, extracting text from supported documents/archives, and returning metadata/local path for images or unsupported binaries. 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 core purpose is front-loaded and the fallback behavior is stated efficiently. Every clause adds information.

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

Completeness5/5

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

Given rich annotations, an output schema, and moderate complexity, the description covers the key behavioral nuances: local snapshot download, text extraction, the getIssue prerequisite, and the unsupported-file fallback. Nothing essential for correct invocation is missing.

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

Parameters3/5

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

The schema describes maxChars and partLimit but not issueId or attachmentId. The description adds meaningful context for attachmentId ('Use getIssue to discover attachment IDs'), but it doesn't clarify the two required integer parameters or explicitly tie maxChars/partLimit to the extraction behavior. With 50% schema coverage, the description only partially compensates.

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+resource ('Retrieve and inspect one known issue attachment') and clearly distinguishes itself from getIssue, which is for discovering attachment IDs. The scope is unambiguous: one known attachment, with text extraction for supported types and metadata/path fallback for unsupported ones.

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 to use getIssue to discover attachment IDs, providing a clear prerequisite and routing hint. It doesn't enumerate all alternatives or say 'when not to use', but the context is clear enough for selection.

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

Build an interpreted change-history timeline for one issue, including field changes, notes and time aggregated per status. Use for history or status-duration analysis; getIssue returns the full issue context and journals instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
issueIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
timelineNoChronological timeline of creation and update events.
statusDurationsNoHow long the issue stayed in each status, derived from journal entries.

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 safety burden is covered. The description adds useful behavioral context by explaining that the timeline is interpreted and aggregates time per status, which goes beyond the schema and 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 core purpose is front-loaded in the first sentence, and the alternative is given only after the main behavior is established.

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 simple parameter, the presence of an output schema, and annotations covering read-only/idempotent behavior, the description is complete. It provides the use case, content of the result, and the sibling alternative, so an agent has everything needed to call it correctly.

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

Parameters4/5

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

Schema description coverage is 0%, but the description compensates by clarifying that the tool operates on one issuecars. The single parameter issueId is an integer and the description's repeated 'one issue' makes its role clear enough for an agent to invoke correctly.

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 it builds an interpreted change-history timeline for a single issue, listing the contents (field changes, notes, time aggregated per status). It also distinguishes itself from getIssue, which returns the full issue context and journals.

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 history or status-duration analysis') and names the alternative (getIssue) with what that alternative provides instead. This removes ambiguity about tool selection.

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 after getIssue when its compression notes report a dropped or shortened journal and provide the journal ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
issueIdYes
journalIdYesJournal entry ID; from getIssue journals

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/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds valuable context beyond those by disclosing the 'without response compression' behavior and explaining that getIssue may return dropped or shortened journals that this tool retrieves in full.

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

Conciseness5/5

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

Two tight sentences: the first states the tool's core behavior and key distinction, the second gives the precise usage condition. Every word contributes value, and 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.

Completeness5/5

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

For a simple two-parameter read-only tool with an output schema and rich annotations, the description is complete. It tells the agent what the tool does, when to use it, and where the required IDs come from, with no meaningful 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?

Schema description coverage is only 50%, with journalId already documented as coming from getIssue journals. The description adds some context for issueId by implying it comes from the getIssue result, but it does not fully explain the relationship or format beyond what can be inferred from the tool name and 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 opens with a specific verb and resource: 'Retrieve one known issue journal entry in full'. It also distinguishes itself from the related getIssue tool by addressing the compression behavior and journal ID requirement, making the tool's 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?

The description explicitly states when to use this tool: 'Use after getIssue when its compression notes report a dropped or shortened journal'. This provides a clear condition and workflow context, leaving no ambiguity about how it relates to getIssue.

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 structural context around one known issue: its parent chain to the root, subtasks down to the requested depth and direct relations. Use getBlockerChain for recursively traced blockers, or getIssue when only the single issue's full details are needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoHow deep to traverse children
issueIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
rootNoThe issue the tree is centred around. Inspect its `related` field for cross-issue relations.
subtreeNoThe root issue plus its descendant subtree, expanded up to the requested depth.
ancestorsNoParent 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 mark the operation read-only, open-world, idempotent, and non-destructive, so the description need not repeat safety. It adds useful behavior: the response is a tree containing parent chain to root and depth-limited subtasks, plus direct relations. This goes beyond annotations without contradicting them.

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: the first packs the tool's purpose and scope, the second routes to alternatives. Every clause earns its place, and no information 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?

For a read-only tree explorer with an output schema, the description covers purpose, scope, depth semantics, and alternatives. The only minor gap is the unspecified default/effect of omitting the optional depth parameter, which an agent might need to know before invoking. Overall it is sufficient for correct selection and 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 covers depth ('How deep to traverse children') but leaves issueId undocumented; the description partly compensates by framing it as 'one known issue' whose tree is explored. It doesn't explain default behavior when depth is omitted or define issueId format beyond the schema's integer type. At 50% schema coverage, the description adds some meaning but not complete parameter semantics.

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

Purpose5/5

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

Description opens with a specific action and object: 'Explore structural context around one known issue' and enumerates the tree's contents (parent chain to root, subtasks to depth, direct relations). It also names sibling tools, making its unique scope 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?

Explicitly states when to prefer getBlockerChain ('recursively traced blockers') and getIssue ('only the single issue's full details'), and the description's own 'around one known issue' establishes the starting context. This is direct routing guidance, not just a vague use case.

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 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 32 tools

Disambiguation5/5

Every tool targets a distinct resource or analytical use case. Overlapping areas such as getIssue versus getIssueTree, searchIssues versus searchAll, and version summary versus release risk are clearly differentiated by their descriptions.

Naming Consistency5/5

All tool names follow a consistent lower_snake_case verb_noun pattern using get, list, search, or compare. There are no mixed casing conventions or vague generic verbs.

Tool Count2/5

With 32 tools, this exceeds the 25+ threshold and feels heavy even for a broad Redmine integration. Several metadata-discovery tools such as listPriorities, listStatuses, listTrackers, and listTimeEntryActivities could be consolidated or grouped.

Completeness2/5

The read and analytics surface is extensive, but the tool descriptions repeatedly reference createIssue, updateIssue, createTimeEntry, and updateWikiPage, none of which are actually exposed. This creates significant dead ends and leaves the server without any write lifecycle coverage.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers