Redmine MCP Server
Provides tools for interacting with a self-hosted Redmine instance, enabling search, creation, update, and upsert of issues; user detection and auto-assignment; status and date tracking; and time tracking through timers or manual hour logging.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Redmine MCP Serverlog 2 hours on issue #1234 for fixing the login bug"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@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_datewhen work begins,due_datewhen 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
Node.js 18+
Redmine REST API enabled:
Administration β Settings β API β Enable REST web serviceAPI 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-serverUse
-s userfor all projects or-s localfor current project only.
Google Antigravity
Open the Agent panel β click "..." β MCP Servers
Click "Manage MCP Servers" β "View raw config"
This opens
mcp_config.jsonat:macOS/Linux:
~/.gemini/antigravity/mcp_config.jsonWindows:
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 -gInstall 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"
}
}
}
}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-levelopencode.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.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.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 all accessible projects |
| List issue statuses with IDs |
| List trackers (Bug, Feature, Taskβ¦) |
| Search by project, subject, status, assignee |
| Get full issue details by ID |
| Create a new issue (auto-assigns user, auto-sets dates) |
| Update status, done%, notes, assignee (auto-sets dates) |
| Smart upsert β find by subject, update or create |
| Upload a local file (screenshot, log, HAR, PDFβ¦) and attach it to an issue |
User Detection
Tool | Description |
| Detect local user and show matched Redmine account |
Time Tracking
Tool | Description |
| Start a timer when beginning work on an issue |
| Stop the timer and log elapsed time to Redmine (optional |
| Discard a running timer without logging anything |
| Manually log hours spent on an issue |
| List time entries filtered by issue, project, user ( |
| Change hours, activity, comment, date, or issue of a time entry |
| Delete a time entry |
| 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 ownerIssues 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) |
|
β Resolved (status 3) |
|
β Closed (status 5) |
|
New issue created |
|
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 |
| β | Base URL of your Redmine (e.g., |
| β | API key from My Account page |
| β | Default project ID (saves you from specifying it every time) |
| β | Override: directly set the Redmine user ID |
| β | Override: match by email instead of auto-detection |
| β | Auto-set start/due dates on status change (default: |
| β | Activity ID for time entries logged without |
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 priorityUser 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 timeTime tracking with manual hours
Log 2.5 hours on issue #142 for implementing authenticationSmart 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_userto verify the mapping is correct.
Date Tracking (Automatic):
start_dateis auto-set to today when an issue moves to In Progress (status 2).due_dateis auto-set to today when an issue moves to Resolved (status 3) or Closed (status 5).New issues get today as
start_dateby default.You can override dates by passing
start_dateordue_dateexplicitly.
Time Tracking:
Always call
start_timerwhen beginning work on an issue.Always call
stop_timerwhen the task is completed β this logs the elapsed time to Redmine automatically.If you forget to start a timer, use
log_timewith an estimated duration.Time is attributed to the detected user automatically.
Rules:
Before starting a task: Search Redmine for a matching issue. If it exists, update its status to
In Progress(status_id: 2). Thestart_datewill be set automatically. Then callstart_timer.If no issue exists: Create one using
create_issuewith the appropriate subject, description, tracker, andestimated_hours(estimate how long the task will take). Thestart_dateis set automatically. Then callstart_timer.When a task is completed: Call
stop_timerto log the time. Then update the issue toResolved(status_id: 3) withdone_ratio: 100. Thedue_datewill be set automatically.Always add a note describing what was done, including relevant file names or changes.
Partial progress: If a task is partially done, update
done_ratioto reflect the percentage (e.g., 30, 50, 70). Do NOT stop the timer β leave it running. Do NOT change the status.Bug fixes: Use
update_issueto add a note explaining the fix and set status toResolved.
Required fields checklist (every task must have):
β
start_timercalled at the beginning β logs spent timeβ
stop_timercalled at the end β logs spent timeβ
estimated_hoursset on create (your best estimate)β
done_ratioset to 100 when completeβ
status_id: 2(In Progress) when starting β auto-setsstart_dateβ
status_id: 3(Resolved) when done β auto-setsdue_dateβ
noteswith 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 |
| Use full paths to |
| Check API key. Ensure REST API is enabled in Redmine admin settings. |
| Verify status_id, tracker_id, project_id are valid. Use |
| Your Redmine user may lack permissions for that project/action. |
User not detected | Run |
Time not logging | Check that time tracking is enabled in Redmine. Run |
Dates not updating | Ensure |
Server not connecting | Run |
License
MIT
Available Tools
18 toolscancel_timerA
Cancel the running timer for an issue WITHOUT logging any time to Redmine. The elapsed time is discarded.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_id | Yes | The Redmine issue ID whose timer to cancel |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| subject | Yes | Issue subject/title (required) | |
| due_date | No | Due/end date (YYYY-MM-DD). Auto-set if status is Resolved/Closed. | |
| status_id | No | Status ID. Use list_statuses to see options. | |
| done_ratio | No | Completion percentage (0-100) | |
| project_id | No | Project ID or identifier (required) | |
| start_date | No | Start date (YYYY-MM-DD). Auto-set if status is In Progress. | |
| tracker_id | No | Tracker ID (e.g., 1=Bug, 2=Feature, 3=Task). Use list_trackers to see options. | |
| auto_assign | No | Auto-assign to detected local user (default: true) | |
| description | No | Issue description | |
| priority_id | No | Priority ID (typically 1=Low, 2=Normal, 3=High, 4=Urgent) | |
| assigned_to_id | No | User ID to assign. Auto-detects if not set. | |
| estimated_hours | No | Estimated hours for the task | |
| parent_issue_id | No | Parent issue ID for sub-tasks |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Notes/comment to add | |
| subject | Yes | Issue subject to search for (exact or partial match) | |
| due_date | No | Due date (YYYY-MM-DD). Auto-set on Resolved/Closed. | |
| status_id | No | Status ID to set | |
| done_ratio | No | Completion percentage (0-100) | |
| project_id | No | Project ID or identifier | |
| start_date | No | Start date (YYYY-MM-DD). Auto-set on In Progress. | |
| tracker_id | No | Tracker ID (used on create, e.g. 3=Task) | |
| description | No | Description (used on create) | |
| hours_spent | No | Hours spent on this task. Logs a time entry if provided. | |
| priority_id | No | Priority ID (used on create) | |
| assigned_to_id | No | Assignee user ID (auto-detected if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The time entry ID to delete |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated associations to include: children,attachments,relations,changesets,journals,watchers | |
| issue_id | Yes | The Redmine issue ID |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date (YYYY-MM-DD), inclusive | |
| from | No | Start date (YYYY-MM-DD), inclusive | |
| limit | No | Max results (default 25, max 100) | |
| user_id | No | Filter by user ID, or "me" for the API key owner | |
| issue_id | No | Filter by issue ID | |
| project_id | No | Filter by project ID or identifier |
TDQS
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.
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.
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.
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.
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.
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.)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. '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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | Yes | Hours spent (e.g., 0.5 for 30 minutes, 1.5 for 1h30m) | |
| issue_id | Yes | The Redmine issue ID | |
| spent_on | No | Date the time was spent (YYYY-MM-DD). Defaults to today. | |
| activity_id | No | Activity ID. Use list_time_entry_activities to see options. | |
| description | No | What was done |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return (default 25, max 100) | |
| status | No | Status filter: 'open', 'closed', '*' for all, or a specific status_id | |
| subject | No | Text to search for in issue subjects | |
| project_id | No | Project ID or identifier | |
| tracker_id | No | Filter by tracker ID | |
| assigned_to_id | No | Filter by assignee user ID, or 'me' for current user |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_id | Yes | The Redmine issue ID to track time for | |
| description | No | What you are working on (will appear in the time entry) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | Hours to log instead of the elapsed time (e.g., 1.5). The timer is still cleared. | |
| issue_id | Yes | The Redmine issue ID to stop the timer for | |
| activity_id | No | Time entry activity ID (e.g., Development, Design). Use list_time_entry_activities to see options. | |
| description | No | Override the description for the time entry |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Comment/notes to add to the issue | |
| subject | No | New subject | |
| due_date | No | Due/end date (YYYY-MM-DD). Auto-set when status changes to Resolved/Closed. | |
| issue_id | Yes | The Redmine issue ID to update | |
| status_id | No | New status ID. Use list_statuses to see available statuses. | |
| done_ratio | No | New completion percentage (0-100) | |
| start_date | No | Start date (YYYY-MM-DD). Auto-set when status changes to In Progress. | |
| description | No | New description | |
| priority_id | No | New priority ID | |
| assigned_to_id | No | New assignee user ID | |
| estimated_hours | No | New estimated hours |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The time entry ID | |
| hours | No | New hours value | |
| comments | No | New comment | |
| issue_id | No | Move the entry to another issue | |
| spent_on | No | New date (YYYY-MM-DD) | |
| activity_id | No | New activity ID |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | No | Filename shown in Redmine (default: the file's basename) | |
| issue_id | Yes | The Redmine issue ID to attach the file to | |
| file_path | Yes | Path of the local file to upload | |
| description | No | Attachment description |
TDQS
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.
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.
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.
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.
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.
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.
18 tool updates
v1.3.0- First observed
cancel_timer - First observed
create_issue - First observed
create_or_update_issue - First observed
delete_time_entry - First observed
detect_user - First observed
get_issue - First observed
list_projects - First observed
list_statuses - First observed
list_time_entries - First observed
list_time_entry_activities - First observed
list_trackers - First observed
log_time - First observed
search_issues - First observed
start_timer - First observed
stop_timer - First observed
update_issue - First observed
update_time_entry - First observed
upload_attachment
TDQS
Scored across 18 tools
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.
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.
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.
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
Related MCP Connectors
Connects AI assistants to TrackingTime for querying time entries, projects, tasks, customers, and team data using natural language.
- RedboothOAuthcom.redbooth
Manage Redbooth tasks, task lists, comments, tags and files from Claude and other AI assistants.
Manage Orangescrum projects, tasks, users, sprints, test cases, releases, and risks from AI tools.
Issue tracking for software projects: issues, epics, releases, docs and boards, from your AI.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables AI assistants to interact with Redmine project management systems, providing comprehensive access to issues, projects, time tracking, users, and wiki pages through natural language commands.3357 npmApache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI applications to interact with Redmine project management systems for issue tracking, time logging, and project management through natural language.8 npmMIT
- AlicenseCqualityDmaintenanceEnables AI assistants to interact with Redmine instances, managing issues, projects, and metadata through natural language commands.127 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to create, update, and query Redmine issues and projects directly from conversations.263 npm1MIT