Skip to main content
Glama
IOSolutions-IT

Redmine MCP Server

@oaxapps/redmine-mcp-server

MCP (Model Context Protocol) server for self-hosted Redmine. Connect your AI coding tools to Redmine to search, create, and update issues directly from your IDE.

Features:

  • πŸ” Search, create, update, and upsert issues

  • πŸ‘€ Auto-detect local user β†’ maps to Redmine account (via git config, system user)

  • ⏱ Time tracking β€” start/stop timers or log hours, automatically recorded in Redmine

  • πŸ“… Automatic date tracking β€” sets start_date when work begins, due_date when resolved

  • πŸ“‹ Auto-assign issues to the detected user

Works with: Claude Code Β· Google Antigravity Β· Cursor Β· Windsurf Β· OpenCode Β· Claude Desktop Β· VS Code Copilot Β· and any MCP-compatible client.


Prerequisites

  1. Node.js 18+

  2. Redmine REST API enabled: Administration β†’ Settings β†’ API β†’ Enable REST web service

  3. API key: My Account β†’ API access key (right sidebar)


Related MCP server: Redmine MCP Server

Installation & Setup

Claude Code

claude mcp add redmine -s user \
  -e REDMINE_URL=https://your-redmine.com \
  -e REDMINE_API_KEY=your_key \
  -e REDMINE_PROJECT_ID=40 \
  -- npx -y @oaxapps/redmine-mcp-server

Use -s user for all projects or -s local for current project only.


Google Antigravity

  1. Open the Agent panel β†’ click "..." β†’ MCP Servers

  2. Click "Manage MCP Servers" β†’ "View raw config"

  3. This opens mcp_config.json at:

    • macOS/Linux: ~/.gemini/antigravity/mcp_config.json

    • Windows: C:\Users\<USERNAME>\.gemini\antigravity\mcp_config.json

Method 1 β€” Using npx:

{
  "mcpServers": {
    "redmine": {
      "command": "npx",
      "args": ["-y", "@oaxapps/redmine-mcp-server"],
      "env": {
        "REDMINE_URL": "https://your-redmine.com",
        "REDMINE_API_KEY": "your_key",
        "REDMINE_PROJECT_ID": "40"
      }
    }
  }
}

Method 2 β€” If you get npx not found in $PATH error:

Find your full paths:

which node
npm root -g

Install globally and use full paths:

npm install -g @oaxapps/redmine-mcp-server
{
  "mcpServers": {
    "redmine": {
      "command": "/full/path/to/node",
      "args": ["/full/path/to/global/node_modules/@oaxapps/redmine-mcp-server/index.js"],
      "env": {
        "REDMINE_URL": "https://your-redmine.com",
        "REDMINE_API_KEY": "your_key",
        "REDMINE_PROJECT_ID": "40"
      }
    }
  }
}
  1. Click Refresh on the Manage MCPs page


Cursor / Windsurf

Add to .cursor/mcp.json or your Windsurf MCP config:

{
  "mcpServers": {
    "redmine": {
      "command": "npx",
      "args": ["-y", "@oaxapps/redmine-mcp-server"],
      "env": {
        "REDMINE_URL": "https://your-redmine.com",
        "REDMINE_API_KEY": "your_key",
        "REDMINE_PROJECT_ID": "40"
      }
    }
  }
}

If you get a PATH error, use the full path method described in the Antigravity section above.


OpenCode

Project-level β€” add to opencode.json in your project root:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "redmine": {
      "type": "local",
      "command": ["npx", "-y", "@oaxapps/redmine-mcp-server"],
      "environment": {
        "REDMINE_URL": "https://your-redmine.com",
        "REDMINE_API_KEY": "your_key",
        "REDMINE_PROJECT_ID": "40"
      },
      "enabled": true
    }
  }
}

Global (all projects) β€” add to ~/.config/opencode/opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "redmine": {
      "type": "local",
      "command": ["npx", "-y", "@oaxapps/redmine-mcp-server"],
      "environment": {
        "REDMINE_URL": "https://your-redmine.com",
        "REDMINE_API_KEY": "your_key"
      },
      "enabled": true
    }
  }
}

When installed globally, omit REDMINE_PROJECT_ID β€” the agent will specify the project per task, or you can set it per-project in the project-level opencode.json.

If you get a PATH error, use full paths:

which node
npm root -g
npm install -g @oaxapps/redmine-mcp-server
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "redmine": {
      "type": "local",
      "command": ["/full/path/to/node", "/full/path/to/global/node_modules/@oaxapps/redmine-mcp-server/index.js"],
      "environment": {
        "REDMINE_URL": "https://your-redmine.com",
        "REDMINE_API_KEY": "your_key",
        "REDMINE_PROJECT_ID": "40"
      },
      "enabled": true
    }
  }
}

Verify with opencode mcp list. Optionally add to your AGENTS.md:

When working on tasks, use the `redmine` tools to track progress in Redmine.

Claude Desktop

Add to claude_desktop_config.json:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "redmine": {
      "command": "npx",
      "args": ["-y", "@oaxapps/redmine-mcp-server"],
      "env": {
        "REDMINE_URL": "https://your-redmine.com",
        "REDMINE_API_KEY": "your_key",
        "REDMINE_PROJECT_ID": "40"
      }
    }
  }
}

Available Tools

Issue Management

Tool

Description

list_projects

List all accessible projects

list_statuses

List issue statuses with IDs

list_trackers

List trackers (Bug, Feature, Task…)

search_issues

Search by project, subject, status, assignee

get_issue

Get full issue details by ID

create_issue

Create a new issue (auto-assigns user, auto-sets dates)

update_issue

Update status, done%, notes, assignee (auto-sets dates)

create_or_update_issue

Smart upsert β€” find by subject, update or create

upload_attachment

Upload a local file (screenshot, log, HAR, PDF…) and attach it to an issue

User Detection

Tool

Description

detect_user

Detect local user and show matched Redmine account

Time Tracking

Tool

Description

start_timer

Start a timer when beginning work on an issue

stop_timer

Stop the timer and log elapsed time to Redmine (optional hours overrides the elapsed time)

cancel_timer

Discard a running timer without logging anything

log_time

Manually log hours spent on an issue

list_time_entries

List time entries filtered by issue, project, user ("me"), and date range

update_time_entry

Change hours, activity, comment, date, or issue of a time entry

delete_time_entry

Delete a time entry

list_time_entry_activities

List available activity types (Development, Design…)


How Automatic Features Work

πŸ‘€ User Detection

The server identifies the local user through this priority chain:

1. REDMINE_USER_ID env var        β†’ direct match by ID
2. REDMINE_USER_EMAIL env var     β†’ match by email
3. git config user.email          β†’ match by email in Redmine
4. git config user.name           β†’ match by name in Redmine
5. $USER / $USERNAME              β†’ match by login in Redmine
6. Fallback                       β†’ current API key owner

Issues are auto-assigned to the matched user when created. Time entries are automatically attributed to the detected user.

πŸ“… Automatic Date Tracking

The server manages start_date and due_date based on status changes:

When status changes to...

What happens

β†’ In Progress (status 2)

start_date set to today (only if not already set)

β†’ Resolved (status 3)

due_date set to today

β†’ Closed (status 5)

due_date set to today

New issue created

start_date set to today

You can override by passing explicit start_date or due_date values. Disable with REDMINE_AUTO_DATES=false.

⏱ Time Tracking

Call start_timer when work begins and stop_timer when done. The elapsed time is calculated automatically and logged as a Redmine time entry with the correct user and date.


Environment Variables

Variable

Required

Description

REDMINE_URL

βœ…

Base URL of your Redmine (e.g., https://redmine.example.com)

REDMINE_API_KEY

βœ…

API key from My Account page

REDMINE_PROJECT_ID

❌

Default project ID (saves you from specifying it every time)

REDMINE_USER_ID

❌

Override: directly set the Redmine user ID

REDMINE_USER_EMAIL

❌

Override: match by email instead of auto-detection

REDMINE_AUTO_DATES

❌

Auto-set start/due dates on status change (default: "true")

REDMINE_DEFAULT_ACTIVITY_ID

❌

Activity ID for time entries logged without activity_id. If unset, Redmine's default activity is used; if there is none, the tool returns an error listing the available activities


Usage Examples

Basic issue management

Show me all open issues in project 40
Update Redmine issue #142 to Resolved with 100% done
Create a bug: "Fix timeout on /users endpoint" with high priority

User detection

Who am I in Redmine?

Time tracking with timer

Start a timer for issue #142, I'm working on the login feature
... (AI works on the task) ...
Stop the timer for issue #142 and log the time

Time tracking with manual hours

Log 2.5 hours on issue #142 for implementing authentication

Smart upsert with time and dates

Mark "User authentication" as done in project 40. Log 1.5 hours spent.
If it doesn't exist, create it.

AI Agent Integration (PRD / CLAUDE.md / Skills)

Copy this section into your project's CLAUDE.md (Claude Code), Skills (Antigravity), or PRD file so the AI agent automatically follows the Redmine workflow:


Redmine Integration

This project is tracked in Redmine. All AI agents working on this codebase must keep Redmine in sync.

Connection:

  • Project ID: 40 (change to your project)

  • MCP Server: @oaxapps/redmine-mcp-server

Status IDs:

ID

Status

1

New

2

In Progress

3

Resolved

5

Closed

User Assignment:

  • Issues are auto-assigned to the current developer via git config detection.

  • Do NOT hardcode user IDs β€” the MCP server detects the correct Redmine user automatically.

  • Run detect_user to verify the mapping is correct.

Date Tracking (Automatic):

  • start_date is auto-set to today when an issue moves to In Progress (status 2).

  • due_date is auto-set to today when an issue moves to Resolved (status 3) or Closed (status 5).

  • New issues get today as start_date by default.

  • You can override dates by passing start_date or due_date explicitly.

Time Tracking:

  • Always call start_timer when beginning work on an issue.

  • Always call stop_timer when the task is completed β€” this logs the elapsed time to Redmine automatically.

  • If you forget to start a timer, use log_time with an estimated duration.

  • Time is attributed to the detected user automatically.

Rules:

  1. Before starting a task: Search Redmine for a matching issue. If it exists, update its status to In Progress (status_id: 2). The start_date will be set automatically. Then call start_timer.

  2. If no issue exists: Create one using create_issue with the appropriate subject, description, tracker, and estimated_hours (estimate how long the task will take). The start_date is set automatically. Then call start_timer.

  3. When a task is completed: Call stop_timer to log the time. Then update the issue to Resolved (status_id: 3) with done_ratio: 100. The due_date will be set automatically.

  4. Always add a note describing what was done, including relevant file names or changes.

  5. Partial progress: If a task is partially done, update done_ratio to reflect the percentage (e.g., 30, 50, 70). Do NOT stop the timer β€” leave it running. Do NOT change the status.

  6. Bug fixes: Use update_issue to add a note explaining the fix and set status to Resolved.

Required fields checklist (every task must have):

  • βœ… start_timer called at the beginning β†’ logs spent time

  • βœ… stop_timer called at the end β†’ logs spent time

  • βœ… estimated_hours set on create (your best estimate)

  • βœ… done_ratio set to 100 when complete

  • βœ… status_id: 2 (In Progress) when starting β†’ auto-sets start_date

  • βœ… status_id: 3 (Resolved) when done β†’ auto-sets due_date

  • βœ… notes with description of changes and files modified

Example Workflow:

1. User says: "Add password reset feature"

2. Agent searches Redmine:
   search_issues(project_id: "40", subject: "password reset")

3. If found β†’ update to In Progress (start_date auto-set):
   update_issue(issue_id: 142, status_id: 2, notes: "Starting implementation")

4. If not found β†’ create (start_date auto-set):
   create_issue(project_id: "40", subject: "Add password reset feature",
     tracker_id: 2, status_id: 2, estimated_hours: 2)

5. Start timer:
   start_timer(issue_id: 142, description: "Implementing password reset")

6. Agent implements the feature...

7. Stop timer (logs elapsed time):
   stop_timer(issue_id: 142) β†’ logs 0.35h

8. Mark as resolved (due_date auto-set):
   update_issue(issue_id: 142, status_id: 3, done_ratio: 100,
     notes: "Implemented password reset via email token.
     Files: src/auth/reset.ts, src/email/templates/reset.html")

Result in Redmine:
  Issue #142: "Add password reset feature"
  Status:         Resolved
  Assigned to:    Carlos O. (auto-detected)
  Start date:     2026-02-20 (auto-set)
  Due date:       2026-02-20 (auto-set)
  Estimated time: 2h
  Spent time:     0.35h (from stop_timer)
  Done:           100%

Troubleshooting

Problem

Solution

npx not found in $PATH

Use full paths to node and the package. See Antigravity section above.

401 Unauthorized

Check API key. Ensure REST API is enabled in Redmine admin settings.

422 Unprocessable Entity

Verify status_id, tracker_id, project_id are valid. Use list_statuses.

403 Forbidden

Your Redmine user may lack permissions for that project/action.

User not detected

Run detect_user to debug. Set REDMINE_USER_EMAIL as override.

Time not logging

Check that time tracking is enabled in Redmine. Run list_time_entry_activities.

Dates not updating

Ensure REDMINE_AUTO_DATES is not set to "false". Check Redmine workflow allows the status transition.

Server not connecting

Run REDMINE_URL=... REDMINE_API_KEY=... npx @oaxapps/redmine-mcp-server in terminal to check for errors.

License

MIT

Available Tools

18 tools
cancel_timerA

Cancel the running timer for an issue WITHOUT logging any time to Redmine. The elapsed time is discarded.

NameRequiredDescriptionDefault
issue_idYesThe Redmine issue ID whose timer to cancel

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose the critical side effect: elapsed time is discarded and nothing is written to Redmine. It does not cover what happens if no timer is running, whether the cancel is reversible, or permission requirements, leaving some gaps for a mutation.

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, with the no-logging consequence front-loaded in the first. Zero filler; every clause carries information an agent needs before invoking.

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 one-parameter mutation with no output schema, the definition covers purpose, the parameter, and the key destructive effect (time discarded). Edge cases like canceling when no timer is active are unaddressed, which keeps it just short of 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 coverage is 100% and the single issue_id parameter is fully documented in the schema, so the description adds no parameter detail. Baseline 3 applies since the schema does the work.

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

Purpose4/5

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

States a specific verb and resource ('Cancel the running timer for an issue') with the crucial qualifier that no time is logged. This functionally separates it from stop_timer, though the sibling is never named, so an agent must infer the pairing rather than be told it.

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

Usage Guidelines3/5

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

The 'WITHOUT logging any time ... elapsed time is discarded' framing strongly implies when to choose this over a stop-and-log path, but it never explicitly says 'use stop_timer instead if you want to record the time.' Usage is inferable rather than stated.

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

create_issueB

Create a new issue in Redmine. Auto-assigns to detected user. Auto-sets start_date if status is In Progress, due_date if Resolved/Closed.

NameRequiredDescriptionDefault
subjectYesIssue subject/title (required)
due_dateNoDue/end date (YYYY-MM-DD). Auto-set if status is Resolved/Closed.
status_idNoStatus ID. Use list_statuses to see options.
done_ratioNoCompletion percentage (0-100)
project_idNoProject ID or identifier (required)
start_dateNoStart date (YYYY-MM-DD). Auto-set if status is In Progress.
tracker_idNoTracker ID (e.g., 1=Bug, 2=Feature, 3=Task). Use list_trackers to see options.
auto_assignNoAuto-assign to detected local user (default: true)
descriptionNoIssue description
priority_idNoPriority ID (typically 1=Low, 2=Normal, 3=High, 4=Urgent)
assigned_to_idNoUser ID to assign. Auto-detects if not set.
estimated_hoursNoEstimated hours for the task
parent_issue_idNoParent issue ID for sub-tasks

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description does disclose real side effects: auto-assignment to the detected local user and automatic start/due date population keyed to status. However, much of this is duplicated from the schema's parameter descriptions, and it omits permission requirements, failure modes, and what the call returns (issue ID) for a mutation tool.

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

Conciseness4/5

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

Three short sentences, front-loaded with the core action, then the two automatic behaviors. No filler, though the auto-behavior sentence could be folded into the schema-covered content it repeats.

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

Completeness3/5

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

For a 13-parameter mutation tool with no annotations and no output schema, the description covers the notable automatic behaviors but leaves gaps: it never says project_id is effectively required (the schema's required array lists only subject), does not describe the response, and does not clarify its boundary with create_or_update_issue.

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 every one of the 13 parameters is already documented in the schema, including the auto-assign default and date formats. The description adds no parameter-level meaning beyond what the schema provides, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb+resource ("Create a new issue in Redmine"), which clearly separates it from read/mutation siblings like get_issue or update_issue. It does not explicitly distinguish itself from the close sibling create_or_update_issue, leaving that ambiguity for the agent to resolve.

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

Usage Guidelines3/5

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

Usage is only implied by the verb and the auto-behavior notes; there is no explicit when-to-use guidance, no mention of when to prefer create_or_update_issue, and no stated prerequisites (project must exist, tracker/status IDs must be valid).

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

create_or_update_issueB

Find an issue by subject in a project. If it exists, update it. If not, create it. Auto-assigns user, auto-sets dates, and can log time.

NameRequiredDescriptionDefault
notesNoNotes/comment to add
subjectYesIssue subject to search for (exact or partial match)
due_dateNoDue date (YYYY-MM-DD). Auto-set on Resolved/Closed.
status_idNoStatus ID to set
done_ratioNoCompletion percentage (0-100)
project_idNoProject ID or identifier
start_dateNoStart date (YYYY-MM-DD). Auto-set on In Progress.
tracker_idNoTracker ID (used on create, e.g. 3=Task)
descriptionNoDescription (used on create)
hours_spentNoHours spent on this task. Logs a time entry if provided.
priority_idNoPriority ID (used on create)
assigned_to_idNoAssignee user ID (auto-detected if not set)

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose real behavioral traits beyond the schema: auto-assignment of the user and auto-setting of dates. However, it omits important behavior such as how ambiguous partial matches are resolved, whether unmentioned fields are overwritten on update, and any permission requirements for a tool that can mutate existing records.

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?

Four short sentences with the find/update/create logic front-loaded and no filler. The trailing 'auto-assigns user, auto-sets dates, and can log time' is slightly compressed but still earns its place.

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

Completeness3/5

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

For a 12-parameter mutation tool with no annotations and no output schema, the description covers the core upsert flow and key side effects. It leaves notable gaps on match ambiguity, overwrite semantics, and return behavior that an agent would need before calling it safely.

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 all 12 parameters are already documented. The description adds marginal value by noting auto-assignment when assigned_to_id is absent and automatic date handling, but it doesn't clarify ambiguous inputs like partial-match subjects. Baseline 3 is appropriate.

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

Purpose4/5

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

The description states a specific compound verb (find/update/create) on a specific resource (issue), and the upsert semantics inherently distinguish it from the sibling create_issue and update_issue tools. It doesn't explicitly name those siblings, so it stops short of a 5.

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

Usage Guidelines3/5

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

It explains the internal logic (exists β†’ update, not exists β†’ create) but gives no guidance on when an agent should pick this over create_issue, update_issue, or search_issues. Usage is implied by the upsert flow rather than stated as a selection rule.

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

delete_time_entryB

Permanently delete a time entry.

NameRequiredDescriptionDefault
idYesThe time entry ID to delete

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the full behavioral burden. The word 'Permanently' is valuable β€” it discloses irreversibility, the single most important trait of a delete β€” but it omits permissions required, whether deletion is confirmed or can be undone, and any side effects on reported totals.

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

Conciseness5/5

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

A single front-loaded sentence with zero waste; the most consequential word, 'Permanently', appears first.

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

Completeness3/5

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

For a one-parameter destructive tool with no annotations and no output schema, irreversibility is covered but confirmation behavior, error cases, and effects on aggregates are not. It is minimally sufficient to call correctly but thin for a permanent deletion.

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%, with `id` documented as 'The time entry ID to delete', so the baseline of 3 applies. The description adds no format or sourcing detail (e.g., where to obtain the ID) beyond the schema.

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

Purpose4/5

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

States a specific verb and resource ('Permanently delete a time entry') that maps directly to the single `id` parameter. It is clearly distinct from siblings like update_time_entry or cancel_timer, though it never names an alternative explicitly.

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

Usage Guidelines2/5

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

There is no guidance on when to delete versus cancel a timer or update an entry, and no mention of preconditions. The agent must infer usage entirely from the verb.

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

detect_userA

Detect the current local user and find their matching Redmine account. Uses git config, system username, and environment variables to identify the user.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

No annotations exist, so the description carries the full burden. It helpfully discloses the detection mechanism (git config, system username, environment variables), which implies a read-only local lookup with no server mutation. However, it does not say what happens when detection fails or when no matching Redmine account is found, nor whether anything is cached or written.

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

Conciseness5/5

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

Two sentences, front-loaded with the action and resource, followed by the mechanism. Every clause earns its place and there is no filler.

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

Completeness3/5

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

With no parameters, no annotations, and no output schema, the description is the only source of truth. It explains the inputs to detection but not the outcome shape β€” whether it returns a user object, a name string, or an error when no match exists β€” which is the main thing an agent needs before relying on it.

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 takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the description correctly conveys that detection is fully automatic with no caller-supplied input.

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

Purpose4/5

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

The description gives a specific verb and resource: 'Detect the current local user and find their matching Redmine account.' That is far more informative than the bare name, and none of the siblings (issue, timer, project, attachment tools) overlap with this capability. It stops short of an explicit contrast with siblings, but the purpose is unambiguous.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is the tool to call when it needs to know which Redmine account the local machine belongs to. There is no explicit 'call this before X' guidance, no statement about when not to use it, and no alternative tool named.

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

get_issueA

Get full details of a specific Redmine issue by ID

NameRequiredDescriptionDefault
includeNoComma-separated associations to include: children,attachments,relations,changesets,journals,watchers
issue_idYesThe Redmine issue ID

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. 'Get' implies a non-mutating read and 'full details' hints at response completeness, but there is no mention of permission requirements, default included associations, or not-found behavior. Adequate but thin for an unannotated tool.

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

Conciseness5/5

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

A single front-loaded sentence with zero filler. The verb, resource, scope, and identifier requirement all appear immediately.

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

Completeness4/5

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

For a two-parameter read-by-ID tool with fully documented schema and no output schema, the description is nearly sufficient. It lacks only minor behavioral notes such as default includes or error conditions, which keeps it short of a 5.

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 issue_id and the include association list are fully documented in the schema. The description adds no parameter meaning beyond that, which is the expected baseline when the schema does the work.

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

Purpose4/5

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

States a specific verb (Get) and resource (Redmine issue) with scope (full details, by ID). The 'by ID' qualifier implicitly separates it from search_issues, but it never names that sibling explicitly, so differentiation is inferred rather than stated.

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

Usage Guidelines3/5

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

The phrase 'by ID' implies this is the lookup path when an identifier is known, contrasting with search_issues, but the description never says when to prefer one over the other or what happens with invalid IDs. Usage is implied, not guided.

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

list_projectsB

List all Redmine projects accessible with your API key

NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, but "accessible with your API key" does disclose a real behavioral trait: results are permission-scoped, not a global listing. It stops short of covering pagination, result size, or failure behavior for an invalid key.

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?

A single front-loaded sentence with no filler, and the scoping qualifier sits where it matters. It is efficient, though at this length it leaves room to add one clause of usage context without becoming bloated.

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

Completeness3/5

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

For a zero-parameter read tool this is close to sufficient, but there is no output schema, so the description could have named the returned fields (id, name, identifier) that other tools require. That omission is the main gap for an agent trying to chain calls.

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 takes zero parameters, so there is nothing for the description to document; baseline 4 applies. The only semantic note (API-key scoping) is already present and correctly framed as a filter rather than a parameter.

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

Purpose4/5

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

States a specific verb and resource ("List all Redmine projects") and adds a scope qualifier ("accessible with your API key"), so the agent knows exactly what comes back. It does not, however, differentiate itself from the other listing siblings (list_trackers, list_statuses, list_time_entry_activities), which follow the same pattern.

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

Usage Guidelines2/5

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

There is no guidance on when to call this versus the sibling list tools, and no statement of prerequisites or follow-up use (e.g. that the returned project identifiers feed into search_issues or create_issue). The agent must infer the call context entirely.

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

list_statusesA

List all available issue statuses in Redmine (useful to get status IDs)

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. 'List all available' does communicate that the enumeration is complete (no filtering or pagination concerns), which is useful behavioral context. However, it says nothing about permissions, auth, or whether the list is project-scoped, leaving gaps for a no-annotation tool.

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

Conciseness5/5

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

A single tight sentence with the resource front-loaded and the practical hint appended. No filler or redundancy.

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 trivial zero-parameter read tool with no output schema, the description covers what it does and why it matters (obtaining status IDs). Only minor gap is that it doesn't characterize the returned shape (e.g., id/name fields).

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 takes zero parameters, so the baseline is 4. The description correctly implies no input is required, consistent with the empty schema.

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

Purpose4/5

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

States a specific verb and resource ('List all available issue statuses in Redmine'), which is unambiguous and distinguishable from siblings like list_trackers or list_projects. It doesn't explicitly name an alternative, but the resource is distinct enough that confusion is unlikely.

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

Usage Guidelines3/5

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

The parenthetical '(useful to get status IDs)' implies the intended use case – resolving status IDs before calling create_issue or update_issue – but never states when to use this versus siblings or any prerequisites. Usage is implied rather than instructed.

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

list_time_entriesB

List time entries, optionally filtered by issue, project, user, and date range.

NameRequiredDescriptionDefault
toNoEnd date (YYYY-MM-DD), inclusive
fromNoStart date (YYYY-MM-DD), inclusive
limitNoMax results (default 25, max 100)
user_idNoFilter by user ID, or "me" for the API key owner
issue_idNoFilter by issue ID
project_idNoFilter by project ID or identifier

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations at all, the description carries the full behavioral burden, yet it only signals implicitly that this is a read operation. It says nothing about pagination defaults, result ordering, permissions needed, or what happens when limit is exceeded β€” all relevant for a list tool with 6 optional params.

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?

A single front-loaded sentence with no filler; every word earns its place. It is arguably too terse given the missing behavioral detail, but it is not padded or disorganized.

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

Completeness2/5

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

For a list tool with no annotations and no output schema, the description should explain default result scope, pagination behavior, and rough return shape. None of that is present, leaving significant gaps for an agent to infer.

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 every parameter (from/to, limit, user_id, issue_id, project_id) is already documented in the schema including formats and defaults. The description only restates the filter dimensions without adding format, default, or interaction details beyond the schema.

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

Purpose4/5

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

States a clear verb and resource (list time entries) and names the filterable dimensions. It implicitly distinguishes the read operation from siblings like log_time, update_time_entry, and delete_time_entry, though it doesn't call out the contrast explicitly.

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

Usage Guidelines3/5

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

The word 'optionally' implies all entries are returned when no filters are given, which is useful usage context. However, there is no explicit when-to-use guidance, no mention of alternatives (e.g., for a single entry or for aggregations), and no stated prerequisites.

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

list_time_entry_activitiesA

List available time entry activities (Development, Design, etc.)

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden; 'List' implies a safe read, but it doesn't state that results are unfiltered, whether the list is workspace-wide, or whether pagination applies. For a zero-parameter read-only lookup the risk is low, so a 3 is fair but there is room to say more.

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?

A single short sentence, front-loaded with the verb and resource, with the examples earning their place by clarifying the item type. No filler.

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

Completeness3/5

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

There is no output schema and no annotations, so the description should ideally say roughly what comes back (names? IDs? counts?) and whether the list is exhaustive. For a trivial zero-param lookup the gap is small, but it isn't fully closed.

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

Parameters4/5

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

The schema has zero parameters, so there is nothing to document; the baseline of 4 applies. The description's examples add a bit of meaning about what the returned values look like.

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

Purpose4/5

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

States a specific verb (List) and resource (time entry activities), and the parenthetical examples ('Development, Design, etc.') clarify what an activity actually is. It doesn't explicitly differentiate from siblings like list_trackers or list_projects, but the resource is unambiguous.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is the lookup to call before logging time with an activity, but the description never says when to use it, that it takes no filters, or that it is a prerequisite-ish lookup for log_time/start_timer.

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

list_trackersA

List all available trackers in Redmine (Bug, Feature, Task, etc.)

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. 'List all available' implies a complete, non-mutating read, but nothing states read-only safety, whether results are global vs project-scoped, or whether an authenticated Redmine session is required. The parenthetical examples are the only added context.

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

Conciseness5/5

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

A single, front-loaded sentence with no filler. The resource and scope lead, and the examples add value rather than padding.

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 trivial zero-parameter, read-only enumeration tool with no output schema, the description covers what it is and roughly what it returns (tracker names/types). Only scoping (global vs project-specific) is left unstated, a minor gap at this complexity level.

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 takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate, and it correctly signals that no filtering input is expected.

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

Purpose4/5

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

Specific verb ('List') plus resource ('trackers in Redmine') with example values (Bug, Feature, Task), so the agent knows exactly what comes back. It is distinguishable from siblings like list_statuses and list_projects only by the resource noun; there is no explicit differentiation statement.

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

Usage Guidelines3/5

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

No explicit when-to-use, prerequisites, or alternatives are stated. Usage is implied by the nature of the tool (fetching tracker IDs/labels before creating or filtering issues), which an agent can infer, but the description does none of that work.

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

log_timeA

Manually log a time entry for an issue (without using start/stop timer). Automatically assigns to the detected user.

NameRequiredDescriptionDefault
hoursYesHours spent (e.g., 0.5 for 30 minutes, 1.5 for 1h30m)
issue_idYesThe Redmine issue ID
spent_onNoDate the time was spent (YYYY-MM-DD). Defaults to today.
activity_idNoActivity ID. Use list_time_entry_activities to see options.
descriptionNoWhat was done

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full disclosure burden. It does add one genuinely useful behavioral fact beyond the schema β€” that the entry is automatically assigned to the detected user β€” but says nothing about permissions, whether the entry is created immediately, or what the response contains.

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, the key differentiator (manual vs. timer) front-loaded, and the auto-assignment side effect stated up front. No filler.

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

Completeness3/5

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

Covers what it does and one side effect, but with no annotations and no output schema the description should say what a successful call returns (e.g., the created entry) and whether the issue must exist. It is adequate but leaves real gaps for a mutation tool.

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

Parameters3/5

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

Schema coverage is 100%, so hours format, date defaults, and the activity_id lookup route are already documented in the schema. The description adds no parameter meaning beyond that, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb ('log') and resource ('time entry for an issue') and explicitly contrasts with the timer-based path, which separates it from start_timer/stop_timer siblings. It does not distinguish itself from update_time_entry, but the create-vs-modify split is reasonably inferable from 'log'.

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

Usage Guidelines3/5

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

The parenthetical 'without using start/stop timer' implies the condition for choosing this over the timer tools, but it never names them or states when-not to use it (e.g., correcting an existing entry should go to update_time_entry). Usage is implied rather than spelled out.

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

search_issuesC

Search Redmine issues by subject, project, status, or assignee. Returns matching issues.

NameRequiredDescriptionDefault
limitNoMax results to return (default 25, max 100)
statusNoStatus filter: 'open', 'closed', '*' for all, or a specific status_id
subjectNoText to search for in issue subjects
project_idNoProject ID or identifier
tracker_idNoFilter by tracker ID
assigned_to_idNoFilter by assignee user ID, or 'me' for current user

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden but discloses almost nothing: no note that all parameters are optional (so an unfiltered call returns a broad result set), no pagination/limit behavior, no permission or scope requirements. "Returns matching issues" is the only behavioral claim and it is essentially tautological.

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?

Two short sentences with the capability front-loaded. The second sentence adds little value over the first, but there is no filler or padding overall.

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

Completeness3/5

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

For a 6-parameter search with no annotations and no output schema, the parameter layer is fully covered by the schema, but the description should say more about result shape, ordering, and default behavior when no filters are supplied. It is adequate but incomplete.

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 the schema already documents defaults, limits, status values, and the 'me' assignee token. The description names four of the six fields (subject, project, status, assignee) but adds no syntax or semantics beyond the schema, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb ("Search") and resource ("Redmine issues") plus the searchable dimensions, so the agent can tell it apart from get_issue or create_issue. It doesn't explicitly name a sibling or contrast with get_issue for a known ID, so it falls short of a 5.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus get_issue (fetch a known issue) or the list_* tools, and no mention of what happens when all filters are omitted. Usage is only implied by the verb.

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

start_timerA

Start a timer for an issue. Call this when you BEGIN working on a task. The elapsed time will be logged to Redmine when you call stop_timer.

NameRequiredDescriptionDefault
issue_idYesThe Redmine issue ID to track time for
descriptionNoWhat you are working on (will appear in the time entry)

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose one important trait: the time is not logged on start but on stop_timer. It does not say whether starting a second timer stops or duplicates the first, whether the timer is per-user or per-issue, or what the call returns.

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?

Three short sentences, front-loaded with the action, then the trigger, then the downstream effect. Every sentence carries distinct information and none restates the tool name or title.

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 two-parameter tool with no output schema and no annotations, this covers purpose, timing, and the side effect that matters. The remaining gap is edge-case behavior β€” repeated starts and error handling for an invalid issue_id β€” which a longer description could have covered.

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%, with issue_id and description both documented inline, so the baseline of 3 applies. The description adds no parameter-level meaning beyond the schema β€” it never mentions that issue_id refers to a Redmine issue or how the description text surfaces in the time entry.

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 ("Start a timer for an issue") and immediately frames it against the sibling stop_timer, which is what actually logs the time. An agent can tell what this does and how it pairs with the rest of the timer trio without opening the schema.

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

Usage Guidelines4/5

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

"Call this when you BEGIN working on a task" gives an explicit trigger condition, and naming stop_timer clarifies the expected lifecycle. It stops short of exclusions β€” nothing says what to do if a timer is already running or when cancel_timer should be used instead.

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

stop_timerB

Stop the timer for an issue and log the elapsed time to Redmine as a time entry. Automatically detects the current user for the time entry.

NameRequiredDescriptionDefault
hoursNoHours to log instead of the elapsed time (e.g., 1.5). The timer is still cleared.
issue_idYesThe Redmine issue ID to stop the timer for
activity_idNoTime entry activity ID (e.g., Development, Design). Use list_time_entry_activities to see options.
descriptionNoOverride the description for the time entry

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose two real behaviors: a Redmine time entry is created and the current user is auto-detected. It omits what happens when no timer is running, whether an activity defaults, and whether failure leaves the timer intact β€” significant for a mutation.

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, zero filler, with the primary action and its side effect front-loaded.

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

Completeness3/5

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

For a mutation with no annotations and no output schema, an agent still lacks the failure semantics (no active timer), permission requirements, and any sense of what is returned. The core happy path is covered, but the edge behavior an agent needs before calling is not.

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 all four parameters are already documented, including the hours override and the list_time_entry_activities pointer for activity_id. The description adds only the implicit fact that no user parameter is needed because the user is detected automatically.

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

Purpose4/5

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

States a specific verb+resource ('Stop the timer for an issue') plus the consequential side effect ('log the elapsed time to Redmine as a time entry'). It does not distinguish itself from the sibling cancel_timer, which is the critical ambiguity for an agent choosing between stopping-and-logging versus discarding.

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

Usage Guidelines2/5

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

No when-to-use or when-not-to-use guidance is given. The description never says the timer must already be running, never mentions cancel_timer as the non-logging alternative, and never contrasts with log_time for manually entering time, leaving the agent to infer the selection rule.

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

update_issueB

Update an existing Redmine issue. Auto-sets start_date when moving to In Progress, due_date when moving to Resolved/Closed.

NameRequiredDescriptionDefault
notesNoComment/notes to add to the issue
subjectNoNew subject
due_dateNoDue/end date (YYYY-MM-DD). Auto-set when status changes to Resolved/Closed.
issue_idYesThe Redmine issue ID to update
status_idNoNew status ID. Use list_statuses to see available statuses.
done_ratioNoNew completion percentage (0-100)
start_dateNoStart date (YYYY-MM-DD). Auto-set when status changes to In Progress.
descriptionNoNew description
priority_idNoNew priority ID
assigned_to_idNoNew assignee user ID
estimated_hoursNoNew estimated hours

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations at all, the description carries the full behavioral burden. It does disclose a genuinely non-obvious side effect (auto-setting start_date and due_date on status transitions), which is valuable, but it says nothing about partial-update semantics (are omitted fields preserved?), permission requirements, or whether the update triggers notifications.

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

Conciseness5/5

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

Two sentences, zero filler, with the side-effect warning placed second so the core action lands first. Nothing could be cut without losing information.

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

Completeness3/5

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

For an 11-parameter unannotated mutation tool, the description covers the core action and one important side effect, and the schema is fully documented. It is still thin on partial-update semantics and sibling disambiguation, which are the two things an agent most needs 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 auto-set behavior the description mentions is already spelled out in the start_date and due_date schema descriptions, so it adds no meaning beyond the schema; nothing is said about how notes, done_ratio, or status_id interact.

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

Purpose4/5

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

States a specific verb and resource ('Update an existing Redmine issue'), which is clearer than a tautology. It does not differentiate from the overlapping siblings create_or_update_issue and update_time_entry, leaving the agent to infer that this tool is for partial edits of an existing issue.

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

Usage Guidelines2/5

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

The word 'existing' hints at create-vs-update, but there is no explicit when-to-use statement, no exclusion, and no guidance on the meaningful choice between update_issue and create_or_update_issue, both of which appear in the sibling list.

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

update_time_entryB

Update an existing time entry. Pass at least one field to change.

NameRequiredDescriptionDefault
idYesThe time entry ID
hoursNoNew hours value
commentsNoNew comment
issue_idNoMove the entry to another issue
spent_onNoNew date (YYYY-MM-DD)
activity_idNoNew activity ID

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full disclosure burden, yet it says nothing about required permissions, whether unlisted fields are preserved, what happens if the entry does not exist or is locked/approved, or whether the change is reversible. Only the bare fact of mutation is conveyed.

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, zero waste, with the action stated first and the invocation constraint second. Nothing is padded or restated from the name.

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

Completeness2/5

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

For a six-parameter mutation tool with no annotations and no output schema, the description omits error behavior, permission requirements, and partial-update semantics. An agent can form a call, but not predict the consequences or failure modes.

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 100%, so the baseline is 3, but the description adds a genuine constraint not encoded in the schema: the schema requires only `id`, while the description tells the agent at least one optional field must also be supplied. That is meaningful semantic value beyond the structured fields.

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

Purpose4/5

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

States a specific verb and resource ("Update an existing time entry") that an agent can distinguish from log_time (create) and delete_time_entry (remove) without opening the schema. It does not explicitly name a sibling or a boundary condition, so it falls short of 5.

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

Usage Guidelines3/5

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

"Pass at least one field to change" gives a real precondition for invocation, but there is no guidance on when to use this versus log_time or delete_time_entry, nor on prerequisites such as ownership or entry state. Usage is implied rather than explained.

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

upload_attachmentA

Upload a local file (screenshot, log, HAR, PDF…) and attach it to an issue.

NameRequiredDescriptionDefault
filenameNoFilename shown in Redmine (default: the file's basename)
issue_idYesThe Redmine issue ID to attach the file to
file_pathYesPath of the local file to upload
descriptionNoAttachment description

TDQS

A3.7/5.0
Behavior2/5

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

Since no annotations are provided, the description must carry the full burden of behavioral context. It fails to disclose crucial behavioral traits such as file size limits, required authentication/permissions for mutation, or expected failure modes.

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

Conciseness5/5

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

It is a single, concise sentence that is front-loaded with the core functionality. It avoids filler while providing sufficient operational context.

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

Completeness3/5

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

While the description clearly states the goal, it lacks depth necessary for a mutation tool, especially without annotations. It does not address potential limitations or behavioral constraints (like upload limits) that a sophisticated agent would require before execution.

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 description adds value by listing common examples of acceptable file types (screenshot, log, HAR, PDF), guiding the agent on what kind of input it expects for the 'file_path' parameter.

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 action (upload and attach) and the resource (a local file) tied to a specific entity (an issue). It distinguishes itself as an attachment action among several issue management siblings.

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

Usage Guidelines3/5

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

The usage is impliedβ€”when a file needs attaching to an issue. However, it does not explicitly state any necessary prerequisites, permissions, or scenarios where this tool should or should not be used compared to other tools.

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. 18 tool updatesv1.3.0
    • First observedcancel_timer
    • First observedcreate_issue
    • First observedcreate_or_update_issue
    • First observeddelete_time_entry
    • First observeddetect_user
    • First observedget_issue
    • First observedlist_projects
    • First observedlist_statuses
    • First observedlist_time_entries
    • First observedlist_time_entry_activities
    • First observedlist_trackers
    • First observedlog_time
    • First observedsearch_issues
    • First observedstart_timer
    • First observedstop_timer
    • First observedupdate_issue
    • First observedupdate_time_entry
    • First observedupload_attachment

TDQS

A3.5/5.0

Scored across 18 tools

Disambiguation4/5

Most tools target clearly distinct actions (timer controls, time-entry CRUD, issue search/read/create/update, metadata lists). The main ambiguity is between create_issue, update_issue, and create_or_update_issue, which could cause misselection when an agent is unsure whether an issue already exists.

Naming Consistency5/5

All tool names use snake_case with a leading verb and a clear object, including compound names like create_or_update_issue and list_time_entry_activities. The convention is predictable throughout the set.

Tool Count4/5

Eighteen tools is slightly above the typical sweet spot, but the server covers two related domainsβ€”issue tracking and time trackingβ€”plus supporting metadata and attachments. The tools are reasonably scoped rather than redundant.

Completeness3/5

Core issue and time-entry workflows are covered, including timer-based and manual logging plus time-entry update/delete. However, the issue surface lacks delete_issue, issue comment/journal operations, and richer project/user retrieval, which are notable gaps for a Redmine integration.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers