MantisBT MCP Server
MantisBT MCP Server
A Model Context Protocol (MCP) server that integrates the MantisBT REST API into Claude Code and other MCP-capable clients. Read, create, and update issues directly from your editor.
Requirements
Node.js ≥ 18
MantisBT installation with REST API enabled (version 2.23+)
MantisBT API token (create under My Account → API Tokens)
Related MCP server: MantisBT MCP Server
Installation
Via npx (recommended):
Add to ~/.claude/claude_desktop_config.json (Claude Desktop) or your local
claude_desktop_config.json (Claude Code):
{
"mcpServers": {
"mantisbt": {
"command": "npx",
"args": ["-y", "@dpesch/mantisbt-mcp-server"],
"env": {
"MANTIS_BASE_URL": "https://your-mantis.example.com/api/rest",
"MANTIS_API_KEY": "your-api-token"
}
}
}
}Local build:
git clone https://codeberg.org/dpesch/mantisbt-mcp-server
cd mantisbt-mcp-server
npm run init
npm run build{
"mcpServers": {
"mantisbt": {
"command": "node",
"args": ["/path/to/mantisbt-mcp-server/dist/index.js"],
"env": {
"MANTIS_BASE_URL": "https://your-mantis.example.com/api/rest",
"MANTIS_API_KEY": "your-api-token"
}
}
}
}Configuration
Environment variables
Variable | Required | Default | Description |
| ✅ | – | Base URL of your MantisBT installation. Both |
| ✅ | – | API token for authentication |
| – |
| Directory for the metadata cache |
| – |
| Cache lifetime in seconds |
| – |
| Transport mode: |
| – |
| Port for HTTP mode |
| – |
| Bind address for HTTP mode. Changed from |
| – | – | When set, the |
| – |
| Set to |
| – |
| Vector store backend: |
| – |
| Directory for the search index |
| – |
| Embedding model name (downloaded once on first use, ~80 MB) |
| – |
| Number of ONNX intra-op threads for the embedding model. Default is 1 to prevent CPU saturation on multi-core machines and WSL. Increase only if index rebuild speed matters and the host is dedicated to this workload. |
| – | – | Restrict |
Available tools
Issues
Tool | Description |
| Retrieve an issue by its numeric ID |
| Retrieve multiple issues by ID in one call (1–50 IDs); missing or inaccessible IDs return |
| Filter issues by project, status, author, and more; optional |
| Create a new issue; |
| Update an existing issue; enum fields ( |
| Delete an issue |
Notes
Tool | Description |
| List all notes of an issue |
| Add a note to an issue |
| Delete a note |
Attachments
Tool | Description |
| List attachments of an issue |
| Upload a file to an issue — either by local |
Relationships
Tool | Description |
| Create a relationship between two issues; optional |
| Remove a relationship from an issue (use the |
Monitors
Tool | Description |
| Add a user as a monitor of an issue |
| Remove a user as a monitor of an issue |
Tags
Tool | Description |
| List all available tags; falls back to the metadata cache when |
| Attach tags to an issue |
| Remove a tag from an issue |
Projects
Tool | Description |
| List all accessible projects; returns normalized project data (consistent with |
| Get versions of a project; optional |
| Get categories of a project |
| Get users of a project |
| Search project members by name, real name, or email (case-insensitive substring match); optional |
Semantic search (optional)
Instead of exact keyword matching, semantic search understands the meaning behind a query. Ask in plain language — the search engine finds conceptually related issues even when the wording doesn't match:
"login fails after password reset" — finds issues about authentication edge cases
"performance problems on the checkout page" — surfaces related reports regardless of the exact terminology used
"duplicate entries in the invoice list" — catches issues described as "shown twice", "double records", etc.
The embedding model (~80 MB) runs entirely offline — no OpenAI key, no external API. It is downloaded once on first start and cached locally. Issues are indexed incrementally on every server start (only new and updated issues are re-indexed).
Activate with MANTIS_SEARCH_ENABLED=true.
Tool | Description |
| Natural language search over all indexed issues — returns top-N results with cosine similarity score; optional |
| Build or update the search index; |
| Return the current fill level of the search index: how many issues are indexed vs. total, and the timestamp of the last sync |
Which backend to choose?
|
| |
Dependencies | None (pure JS) | Requires native build tools |
Install | Included |
|
Best for | Up to ~10,000 issues | 10,000+ issues |
Performance | Fast enough for most setups | Faster for large corpora |
Start with vectra. Switch to sqlite-vec if indexing or query times become noticeably slow.
npm install sqlite-vec better-sqlite3
# then set MANTIS_SEARCH_BACKEND=sqlite-vecMetadata & system
Tool | Description |
| Return all field names valid for the |
| Retrieve a compact metadata summary: project/tag counts and per-project user/version/category counts; use |
| Return the full raw metadata cache as minified JSON (all projects with complete fields, users/versions/categories per project, all tags) |
| Refresh the metadata cache |
| List saved filters |
| Retrieve your own user profile |
| List available languages |
| Show server configuration (base URL, cache TTL) |
| Return valid ID/name pairs for all issue enum fields (severity, status, priority, resolution, reproducibility) — use before |
| Get MantisBT version and check for updates |
| Return the version of this mantisbt-mcp-server instance |
Available resources
MCP Resources are URI-addressable, read-only data that clients can fetch directly without calling a tool. They are the third MCP primitive alongside Tools and Prompts. Note that Resource support is less widely implemented in MCP clients than Tools — check your client's documentation.
Resource URI | Description |
| Profile of the authenticated API user (live fetch) |
| All accessible MantisBT projects as a compact list (cache-backed, refreshed via |
| Combined project view: project fields + users + versions + categories in one call; cache-first, list-support for enumerating all available project URIs |
| Valid values for all issue enum fields: severity, priority, status, resolution, reproducibility (live fetch) |
Available prompts
MCP prompt templates are conversation starters that instruct the LLM to collect structured input and then call the appropriate tool. They are not tools themselves — they initiate a guided workflow.
Prompt | Required args | Optional args | Description |
|
|
| Guides through a structured bug report and calls |
|
|
| Guides through a feature request and calls |
|
| – | Fetches an issue via |
|
| – | Lists issues via |
HTTP mode
For use as a standalone server (e.g. in remote setups):
MANTIS_BASE_URL=... MANTIS_API_KEY=... TRANSPORT=http PORT=3456 node dist/index.js
# With token authentication and explicit bind address (required for Docker/remote):
# MCP_HTTP_TOKEN=secret MANTIS_BASE_URL=... MANTIS_API_KEY=... \
# TRANSPORT=http PORT=3456 MCP_HTTP_HOST=0.0.0.0 node dist/index.jsHealth check: GET http://localhost:3456/health (always public, no token required)
Documentation
Cookbook — tool-oriented recipes with copy-paste-ready parameter examples for all registered tools
Usage Examples — natural language prompt examples for everyday use cases (no tool names required)
Development
npm run init # First-time setup: install deps, git hooks, typecheck
npm run build # Compile TypeScript → dist/
npm run typecheck # Type check without output
npm run dev # Watch mode for development
npm test # Run tests (vitest)
npm run test:watch # Run tests in watch mode
npm run test:coverage # Coverage reportLicense
MIT – see LICENSE
Contributing
Contributions welcome! Please read CONTRIBUTING.md. Repository: codeberg.org/dpesch/mantisbt-mcp-server
Available Tools
38 toolsadd_monitorAdd Issue MonitorA
Add a user as a monitor (watcher) of a MantisBT issue. Monitors receive email notifications whenever the issue is updated. Returns a success confirmation object.
Use add_monitor to subscribe team members to issue updates without assigning them as the handler. To unsubscribe a user, call remove_monitor with the same parameters.
Adding a user who is already a monitor is a no-op — the operation succeeds without creating duplicates.
Prerequisites: obtain issue_id from list_issues or get_issue; use find_project_member or get_project_users to look up valid MantisBT login names.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_id | Yes | Numeric issue ID — use list_issues or get_issue to obtain issue IDs | |
| username | Yes | MantisBT login name (not the display name) of the user to add as monitor. Use find_project_member or get_project_users to discover valid login names for a project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'Adding a user who is already a monitor is a no-op — the operation succeeds without creating duplicates,' which asserts idempotent behavior, while the annotations declare idempotentHint=false. Repeated identical calls produce no additional environmental effect per the description, directly contradicting the structured hint.
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?
Front-loads the core action and its effect in the first sentence, then layers behavior, alternative routing, and prerequisites in short scannable paragraphs. No filler; every sentence (notifications, remove_monitor, no-op, prerequisites) carries operational value.
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 2-parameter mutation with no output schema, the description covers the effect of the call, the return shape ('success confirmation object'), duplicate handling, the inverse operation, and how to source both required values. Nothing an agent needs to invoke it correctly is missing.
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 parameters (issue_id, username) are already fully documented in the schema, including the login-name vs display-name distinction and the discovery tools. The description's prerequisite section restates the same guidance without adding new semantics, 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+resource ('Add a user as a monitor (watcher) of a MantisBT issue') and immediately explains the consequence (email notifications on updates). It is clearly distinguishable from sibling remove_monitor, which it names 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?
Gives explicit when-to-use ('subscribe team members to issue updates without assigning them as the handler'), names the inverse operation with its routing condition ('To unsubscribe a user, call remove_monitor with the same parameters'), and lists prerequisites for obtaining valid issue_id and username values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_noteAdd Note to IssueA
Add a note (comment) to an existing MantisBT issue. Returns the created note object including id, created_at, reporter, text, view_state, and a view_url linking directly to the note in the MantisBT web UI.
Full UTF-8 text is supported. Markdown syntax is stored as-is — rendering depends on the MantisBT instance's configured text renderer.
Use view_state="private" to restrict the note to users with reporter-level access or higher; public notes are visible to all users who can view the issue.
Prerequisites: obtain issue_id from list_issues, get_issue, or search_issues.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Note text (minimum 1 character). Full UTF-8 including emoji is supported. Markdown is stored as-is. | |
| issue_id | Yes | Numeric issue ID — use list_issues or get_issue to obtain issue IDs | |
| view_state | No | Visibility of the note: "public" (visible to all, default) or "private" (visible only to users with sufficient access level). | public |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and the description does not contradict them. It adds genuine context beyond annotations: the returned note fields, UTF-8 support, markdown stored as-is with renderer-dependent output, and the access-level semantics of view_state.
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?
Purpose is front-loaded, followed by return shape, format caveats, visibility rules, and prerequisites in a logical order. Slightly dense but every sentence carries 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?
With no output schema, the description compensates by enumerating the returned fields (id, created_at, reporter, text, view_state, view_url). It covers prerequisites, format handling, and visibility, leaving only minor gaps such as failure behavior and notification side effects.
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 baseline is 3, but the description adds meaning beyond the schema by explaining that private restricts to reporter-level access or higher while public is visible to all issue viewers, and by restating the UTF-8/markdown contract for text.
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 ('Add a note (comment) to an existing MantisBT issue') and immediately distinguishes itself from sibling write/read note tools (list_notes, delete_note). An agent knows exactly what this does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete prerequisite chain (obtain issue_id from list_issues, get_issue, or search_issues), which is real usage guidance. It does not, however, state when to prefer this over alternatives or any exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_relationshipAdd Issue RelationshipA
Add a relationship between two MantisBT issues.
Relationship types — use either type_id (numeric) or type_name (string):
0 / "duplicate_of" — this issue is a duplicate of target
1 / "related_to" — this issue is related to target
2 / "parent_of" — this issue depends on target (target must be done first); alias: "depends_on"
3 / "child_of" — this issue blocks target (target can't proceed until this is done); alias: "blocks"
4 / "has_duplicate" — this issue has target as a duplicate
Directionality note: "A child_of B" means A blocks B. "A parent_of B" means A depends on B.
Dash variants (e.g. "related-to") are also accepted for type_name.
| Name | Required | Description | Default |
|---|---|---|---|
| type_id | No | Relationship type ID: 0=duplicate_of, 1=related_to, 2=parent_of (depends on), 3=child_of (blocks), 4=has_duplicate. Use either type_id or type_name. | |
| issue_id | Yes | The source issue ID (the one the relationship is added to) | |
| target_id | Yes | The target issue ID | |
| type_name | No | Relationship type name as alternative to type_id. Accepted: "duplicate_of", "related_to", "parent_of" (or "depends_on"), "child_of" (or "blocks"), "has_duplicate". Dash variants (e.g. "related-to") also work. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, and the description goes well beyond that by defining what each relationship type means and how directionality works (A child_of B means A blocks B). It does not disclose failure modes such as duplicate-relationship handling, which is notable given idempotentHint=false, but the added semantic context is substantial.
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?
Front-loaded purpose sentence followed by a scannable type table and two short clarifying notes. Every line carries decision-relevant content; the dash-variant note is a minor nicety but not wasteful.
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 tool with no output schema and full schema description coverage, the description supplies everything an agent needs: type mapping, directionality, and parameter alternatives. Nothing material to correct invocation is missing.
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 real meaning beyond the schema: the explicit directionality mapping and the alias/parent/child semantics clarify what the numeric type IDs actually do to the two issues, which the schema only lists tersely.
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 ('Add') and resource ('relationship between two MantisBT issues'), and the sibling list contains remove_relationship, which this is clearly the inverse of. An agent can distinguish it from every other sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context for performing the add, including the choice between type_id and type_name and the directionality semantics. It stops short of explicitly stating when to prefer this over remove_relationship or how to handle an already-existing relationship, so it is clear context but not full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attach_tagsAttach Tags to IssueA
Attach one or more tags to a MantisBT issue.
Each tag can be specified either by ID or by name. If a tag name is provided that does not exist yet, MantisBT will create it automatically (requires tag_create_threshold permission, default: REPORTER).
Requires tag_attach_threshold permission (default: REPORTER).
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | Tags to attach — each entry needs at least id or name | |
| issue_id | Yes | Numeric issue ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag readOnly=false, idempotent=false, destructive=false. The description adds real value beyond them: the auto-creation side effect for unknown tag names, the permission that governs it (tag_create_threshold, default REPORTER), and the tag_attach_threshold gate. It leaves open what happens on re-attaching an existing tag, which matters given idempotentHint=false.
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 compact paragraphs, front-loaded with the core action, then the id/name rule, then the permission requirements. No filler sentences.
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 mutation with no output schema, the description covers the key operational facts: input forms, creation side effect, and both permission gates. The only gap is duplicate-handling behavior on an already-attached tag.
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 description goes beyond the schema by clarifying that each tag may be given by id OR name — a disjunction the schema merely lists as two optional-looking properties — and that a non-existent name triggers creation.
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 (attach) plus resource (tags on a specific MantisBT issue), and its scope is immediately separable from the sibling detach_tag. No schema opening required to know what it does.
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?
Gives clear trigger context (attaching one or more tags to an issue, by id or name) and states the permission thresholds that gate the call. It does not explicitly name alternatives or when-not-to-use, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_issueCreate IssueA
Create a new MantisBT issue. Returns the full created issue object including the assigned id, summary, status, priority, severity, category, reporter, created_at, and view_url.
Required fields: summary, description, project_id, category. All other fields are optional with sensible defaults (priority: "normal", severity: "minor").
Recommended workflow:
Call get_project_categories to obtain a valid category name
Optionally call get_project_versions to obtain version names
Optionally call find_project_member to resolve the assignee's username
Both priority and severity accept canonical English names or localized labels from the connected MantisBT instance — call get_issue_enums to see all available values.
For the handler, prefer the username field (resolved server-side) over handler_id when working interactively.
| Name | Required | Description | Default |
|---|---|---|---|
| handler | No | MantisBT login name of the assignee. The server resolves the name to a user ID from the project member list. Use find_project_member or get_project_users to look up valid login names. | |
| summary | Yes | Issue summary/title (required) | |
| version | No | Affected product version name. Use get_project_versions to list available version names for the project. | |
| category | Yes | Category name (required). Use get_project_categories to list available categories for the project. | |
| priority | No | Priority level. Canonical English names: none, low, normal, high, urgent, immediate. Default: "normal". Use get_issue_enums to see localized labels. | normal |
| severity | No | Severity level. Canonical English names: feature, trivial, text, tweak, minor, major, crash, block. Default: "minor". Use get_issue_enums to see localized labels. | minor |
| handler_id | No | Numeric user ID of the assignee. Alternative to the handler field — use one or the other, not both. | |
| project_id | Yes | Project ID the issue belongs to — use list_projects to discover project IDs | |
| view_state | No | Visibility of the issue: "public" (visible to all, default) or "private" (restricted to higher-access users). | |
| description | Yes | Detailed issue description (required). Do not create issues without a description. Plain text or Markdown. | |
| custom_fields | No | Custom field values: [{field: {id|name}, value: "<string>"}]. Use get_issue_fields or get_metadata to discover available custom fields per project. | |
| target_version | No | Target fix version — version in which the issue is planned to be resolved. Use get_project_versions to list available version names. | |
| reproducibility | No | How reliably the issue reproduces. Canonical English names: always, sometimes, random, have not tried, unable to reproduce, N/A. Use get_issue_enums to see localized labels. | |
| fixed_in_version | No | Version in which the issue was fixed. Use get_project_versions to list available version names. | |
| steps_to_reproduce | No | Step-by-step instructions to reproduce the issue. Plain text or Markdown. | |
| additional_information | No | Additional context or notes about the issue. Plain text or Markdown. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the write semantics (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the description only needs to add context, which it does: required vs optional fields, defaults for priority/severity, and the server-side resolution of handler. It stops short of describing failure modes (e.g. invalid category or duplicate issues), so not a full 5.
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?
Front-loads purpose and return shape, then organizes the workflow as a short numbered list and the field rules as compressed sentences. Slightly long overall, but no sentence is filler given the 16-parameter surface.
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 16-parameter creation tool with no output schema, the description covers the essentials: required fields, defaults, return payload contents, dependency tools for resolving foreign keys, and assignee field preference. Nothing an agent needs to call it correctly is missing.
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 already 100%, so the baseline would be 3; the description adds real value by noting that priority/severity accept canonical English names or localized labels and by steering the agent to prefer handler over handler_id. It does not add syntax beyond the schema for the remaining fields, so it is good but not exhaustive.
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 ('Create a new MantisBT issue') and immediately enumerates what the returned object contains, distinguishing it clearly from read/update/delete siblings like get_issue, update_issue, and delete_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?
Gives an explicit numbered workflow (resolve category via get_project_categories, versions via get_project_versions, assignee via find_project_member) and a concrete preference rule for handler vs handler_id when working interactively. Also names get_issue_enums for localized enum values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_versionCreate VersionA
Create a new version in a MantisBT project. Returns the created version object (id, name, description, released, obsolete, timestamp).
Version names must be unique within the project. Without timestamp, MantisBT uses the current date.
Requires the manage_project_threshold access level in the project (MantisBT default: manager).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Version name, e.g. "1.2.0" | |
| obsolete | No | Mark the version as obsolete. MantisBT default: false | |
| released | No | Mark the version as released. MantisBT default: false | |
| timestamp | No | Version date as ISO 8601 string, e.g. "2026-09-27" or "2026-09-27T10:00:00+02:00". Determines the order in roadmap and changelog. | |
| project_id | Yes | Numeric ID of the project the version belongs to — use list_projects to discover project IDs | |
| description | No | Optional version description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, non-destructive. The description goes further by disclosing the required access level (manage_project_threshold / manager) and the uniqueness side effect, which the annotations do not convey. It does not cover error behavior on name collisions or rate limits.
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 paragraphs, front-loaded with the action, then constraints, then permission requirement. Every sentence carries information; nothing is repeated from the schema or annotations.
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 mutation tool with no output schema, the description names the returned fields inline, states the auth requirement, and flags the uniqueness constraint and default. Nothing essential to correct invocation is missing.
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 the cross-parameter constraint that names must be unique within the project and explains the timestamp default behavior — meaning beyond what the schema documents.
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 version in a MantisBT project') and immediately distinguishes itself from siblings like update_version, release_version, and delete_version by naming the created object and its scope.
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?
Gives prerequisites (manage_project_threshold, MantisBT default: manager) and a constraint (unique names per project), which implies when this tool applies. However, it never explicitly contrasts creation with update_version/release_version or states when not to use it, so routing guidance stays implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_issueDelete IssueBDestructiveIdempotent
Permanently delete a MantisBT issue. This action is irreversible.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Numeric issue ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is structured data. The description reinforces permanence/irreversibility, which adds emphasis but no new behavioral facts such as permission requirements or side effects on attached notes/files.
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 destructive nature front-loaded. Nothing extraneous.
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 single-parameter destructive tool with annotations covering safety and no output schema, the essentials are present. However, it omits error/permission behavior and what happens to dependent data (notes, relationships), which would be valuable for a delete operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single parameter, so the baseline is 3. The description adds nothing about the id parameter beyond what the schema already documents.
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 ('delete') and resource ('MantisBT issue') with a clear scope modifier ('permanently'). It is distinguishable from siblings like delete_note or delete_version by resource, though it doesn't explicitly contrast with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given, and no alternative is named. The 'irreversible' note is a warning, not routing guidance, so an agent must infer context on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_noteDelete NoteADestructiveIdempotent
Permanently delete a note from a MantisBT issue. This action is irreversible — deleted notes cannot be recovered.
Returns a plain-text confirmation message on success. Returns an error if the note does not exist or the current user lacks permission to delete it (MantisBT enforces access control: users can typically only delete their own notes unless they have manager-level access or higher).
Prerequisites: obtain note_id from list_notes or from get_issue (notes[].id); obtain issue_id from the same source.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | Numeric note ID to delete — obtain from get_issue (notes[].id) or list_notes | |
| issue_id | Yes | Numeric issue ID that owns the note — use get_issue or list_notes to identify this value |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation by stating irreversibility ('cannot be recovered'), the access-control model (own notes only unless manager-level or higher), and both success and failure return behavior. These are exactly the operational facts an agent needs before a destructive call.
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?
Front-loaded with the destructive action and irreversibility warning, then error behavior and prerequisites. Slightly redundant in restating ID-sourcing already in the schema, but no sentence is wasted.
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 output schema, the description compensates by describing the return value ('plain-text confirmation message') and error cases. Combined with 100% schema coverage, nothing needed to invoke this destructive tool correctly is missing.
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 both parameters are fully documented there, including their sourcing guidance, which the description largely repeats. Baseline 3 applies since the description adds no syntax, format, or constraint detail 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?
The description opens with a specific verb and resource ('Permanently delete a note from a MantisBT issue'), which cleanly separates it from delete_issue, add_note, and update_issue. An agent can identify the operation 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?
It states a clear prerequisite chain (obtain note_id from list_notes or get_issue notes[].id; issue_id from the same source) and error conditions. It does not explicitly contrast with a named alternative, but the context for when to call it is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_versionDelete VersionADestructiveIdempotent
Permanently delete a version of a MantisBT project. This action is irreversible.
MantisBT clears the version, target_version and fixed_in_version fields of all issues that reference the deleted version (including subprojects if versions are inherited). To retire a version without touching issues, set obsolete=true via update_version instead.
The version must belong to project_id itself: versions inherited from a parent project can only be changed via the parent's project_id (otherwise MantisBT answers "Version not found"). get_project_versions with inherit=false (the default) lists the project's own versions.
Requires the manage_project_threshold access level in the project (MantisBT default: manager).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Numeric ID of the project the version belongs to — use list_projects to discover project IDs | |
| version_id | Yes | Numeric version ID — use get_project_versions to discover version IDs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive, idempotent, and non-readOnly, but the description adds critical undisclosed behavior: irreversibility, clearing version/target_version/fixed_in_version fields on referencing issues including subprojects, the manage_project_threshold permission requirement, and the 'Version not found' error for inherited versions. This goes well beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads permanence and irreversibility, then side effects, alternative, constraint, and authorization in tightly structured sentences. Every clause earns its place by informing a destructive decision or preventing a misuse.
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 destructive tool with no output schema, the description covers side effects, prerequisites, permission threshold, and an alternative route. An agent has everything needed to invoke it correctly and 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 description coverage is 100% and both parameters have inline descriptions with discovery hints. The description adds a usage-level constraint about project_id needing to own the version, but no syntax or format detail beyond what the schema provides, 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 the specific verb 'Permanently delete' and resource 'a version of a MantisBT project,' and distinguishes itself from alternatives like update_version. The sibling tools include create_version, update_version, and get_project_versions, and the description makes the distinction explicit.
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?
Explicitly names update_version with obsolete=true as the non-destructive alternative, explains the inherited-version constraint, and points to get_project_versions with inherit=false for listing eligible versions. Provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detach_tagDetach Tag from IssueAIdempotent
Remove a tag from a MantisBT issue.
Requires tag_detach_own_threshold (default: REPORTER) for own tags, or tag_detach_threshold (default: DEVELOPER) for tags attached by others.
| Name | Required | Description | Default |
|---|---|---|---|
| tag_id | Yes | Numeric tag ID to remove | |
| issue_id | Yes | Numeric issue ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose readOnly=false, idempotent=true, and destructive=false. The description adds useful authorization context, specifying the threshold constants and defaults for own versus others' tags, which goes beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loading the action and then the permission requirements. Every sentence earns its place with 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?
For a simple two-parameter mutation tool with annotations and no output schema, the description provides enough context: the action, platform, and permission conditions are all covered. Nothing critical for correct invocation is missing.
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 tag_id are already documented in the schema. The description does not add parameter-level syntax or format details beyond what the schema provides, making the baseline 3 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 verb and resource: remove a tag from a MantisBT issue. This clearly distinguishes it from sibling tools like attach_tags and list_tags without ambiguity.
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 clearly states the permission thresholds required for detaching one's own tags versus tags attached by others. It does not explicitly name alternative tools or when not to use this one, but the usage context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_project_memberFind Project MemberARead-onlyIdempotent
Search for users with access to a MantisBT project by name, display name, or email.
Returns up to limit matching users (default: 10, max: 100). Matching is case-insensitive substring search across name, real_name, and email fields. Omit query to list the first limit users.
Data is served from the local metadata cache when fresh; falls back to a live API call otherwise.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default: 10, max: 100) | |
| query | No | Case-insensitive substring to match against name, real_name, or email | |
| project_id | Yes | Numeric project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description goes beyond them by disclosing the caching behavior (local metadata cache when fresh, live API fallback) and the result-count bound, which is genuinely useful context for an agent reasoning about latency and freshness.
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, front-loaded sentences with no filler: purpose first, then result bounds and matching semantics, then data-source behavior. Slight redundancy with the schema's own parameter descriptions keeps it from being maximally tight.
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 low-complexity, 3-parameter read tool with a fully covered schema and no output schema, the description covers scope, matching rules, result limits and cache behavior. Only the relationship to the similar get_project_users sibling is unaddressed.
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 limit, query and project_id are already fully documented by the schema. The description largely restates those semantics (limit default/max, case-insensitive substring matching) rather than adding new meaning, which matches the baseline 3 when the schema does the heavy lifting.
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 -- search for users with access to a MantisBT project -- plus the three matchable fields (name, real_name, email). The search-by-attribute framing differentiates it from the bulk listing sibling get_project_users even though that sibling is not named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides operational guidance ('omit query to list the first limit users'), which tells the agent one valid mode of use. However, it never states when to prefer this over the closely related get_project_users, nor any prerequisites or exclusions, so the when-to-use reasoning is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_configGet MantisBT ConfigurationARead-onlyIdempotent
Retrieve one or more MantisBT configuration options.
Common option names:
"status_enum_string" — issue status values and their IDs
"priority_enum_string" — priority values
"severity_enum_string" — severity values
"resolution_enum_string" — resolution values
"reproducibility_enum_string" — reproducibility values
"view_state_enum_string" — view state values
"access_levels_enum_string" — access level values
| Name | Required | Description | Default |
|---|---|---|---|
| options | Yes | Array of configuration option names to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint, so the safety profile is covered. The description adds the useful fact that multiple options can be fetched at once and what kinds of options exist, but says nothing about permissions, error behavior for unknown option names, or return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in one clean sentence, followed by a scannable list of example values. Every line earns its place; the list is slightly long but each entry carries distinct 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 a simple annotated read tool this is largely adequate, but with no output schema the description leaves the returned structure unexplained (e.g. whether values come back as a name-to-value map or raw strings). That gap is minor but real.
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 parameter is documented, so the baseline is 3. The description goes beyond the schema by enumerating concrete valid option names, which is genuinely valuable because the schema declares no enum and would otherwise leave the agent guessing at legal values.
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: 'Retrieve one or more MantisBT configuration options.' An agent can tell this apart from issue-oriented siblings at a glance. It does not explicitly distinguish itself from nearby metadata siblings like get_issue_enums or get_metadata, which keeps it below 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?
Usage is implied by the enumerated option names, giving the agent a sense of what this tool is good for. However, it never says when to prefer this over get_issue_enums, get_metadata, or get_mantis_version, nor does it state any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_userGet Current UserARead-onlyIdempotent
Retrieve the profile of the user associated with the current API key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so safety is covered. The description adds meaningful context the annotations don't: the target identity is derived from the API key rather than a parameter, which explains why the call takes no input.
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 (verb, resource, scoping condition) 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 zero-parameter, read-only call with annotations covering the safety profile and no output schema, this is essentially complete. The only unaddressed detail is what the returned profile contains, which is minor given the tool's simplicity.
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 beyond reinforcing that identity comes from the API key. Baseline of 4 applies for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Retrieve) and resource (profile of the user), and uniquely scopes it to 'the current API key', which separates it from sibling user-oriented tools like get_project_users or find_project_member. It does not explicitly name those siblings, 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?
Usage is implied rather than stated: an agent can infer this is the tool for 'who am I' queries, but the description gives no when/when-not guidance and no alternatives for looking up other users.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issueGet IssueARead-onlyIdempotent
Retrieve a single MantisBT issue by its numeric ID. Returns all issue fields including notes, attachments, and relationships (unless "select" is given). Notes are always included — no separate list_notes call needed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Numeric issue ID | |
| select | No | Comma-separated list of fields to include in the response (server-side projection, same as list_issues). Significantly reduces response size. Example: "id,summary,status,notes" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive. The description adds genuinely useful behavior: notes, attachments, and relationships are included in the payload, and the select parameter can drop those fields. It doesn't mention pagination or response shape, but for a read tool this is solid 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?
Three short sentences, front-loaded with the core purpose, then the notable return behavior. Every sentence carries information with no waste.
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?
No output schema exists, so the description compensates by describing the returned contents (notes, attachments, relationships) and the effect of select. An agent has what it needs to call and interpret the 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 both id and select are already fully documented, including that select is a server-side projection reducing response size. The description only restates that select suppresses fields, adding little beyond the schema. Baseline 3.
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 (Retrieve) and resource (a single MantisBT issue by numeric ID), and clarifies it is the singular counterpart to the list_issues/get_issues siblings. An agent can distinguish it from list_issues and list_notes without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly implies the fetch-one-issue context and explicitly routes the agent away from a separate list_notes call. It does not state exclusions or when to prefer get_issues over this tool, but the single-vs-list distinction is evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issue_enumsGet Issue Enum ValuesARead-onlyIdempotent
Return valid ID, name, and (if available) localized label for all issue enum fields.
Use this tool before creating or updating issues to look up the correct value for severity, status, priority, resolution, or reproducibility.
Example response (English installation): { "severity": [{"id": 10, "name": "feature"}, {"id": 50, "name": "minor"}, ...], "status": [{"id": 10, "name": "new"}, {"id": 20, "name": "feedback"}, ...], "priority": [{"id": 10, "name": "none"}, {"id": 30, "name": "normal"}, ...], "resolution": [{"id": 10, "name": "open"}, {"id": 20, "name": "fixed"}, ...], "reproducibility": [{"id": 10, "name": "always"}, {"id": 70, "name": "have not tried"}, ...] }
Example response (localized installation, e.g. German): { "status": [ {"id": 10, "name": "new", "label": "Neu"}, {"id": 20, "name": "feedback", "label": "Feedback"}, {"id": 30, "name": "acknowledged", "label": "Bestätigt"}, ... ], ... }
Fields:
"id" — numeric ID accepted by the API
"name" — localized or canonical name from the MantisBT database
"label" — UI display label (only present when it differs from "name")
"canonical_name" — English canonical name (only present on localized installs)
For create_issue (severity, priority, reproducibility): pass the canonical English name, the localized "name", or the "label" — all are accepted. The server resolves them to the correct ID.
For update_issue: pass either "id" or "name" in the field reference object.
Note: on some installations enum values are customized at the database level. In that case "name" itself may be localized (e.g. "kleinerer Fehler" instead of "minor") and no "label" will be present because there is no separate English original.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial context: the exact response shape, the meaning of id/name/label/canonical_name, which value forms create_issue vs update_issue accept, and the edge case where DB-level customization makes 'name' localized with no 'label'. This is rich disclosure well beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose and usage, then structured field notes. The two full example responses are lengthy, but they earn their place by contrasting English vs localized output, which is the tool's main subtlety. Slightly verbose but not wasteful.
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?
No output schema exists, so the description must carry the return contract — and it does fully: definitions of all fields, example responses, and the customization edge case. An agent has everything needed to call it and interpret results 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?
Zero parameters, so the schema carries no burden and the baseline is 4. The description instead documents the semantic contract of the returned values (which forms are accepted by downstream tools), which is the relevant guidance for a no-argument lookup tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Return valid ID, name, and (if available) localized label for all issue enum fields.' An agent can clearly distinguish this lookup tool from siblings like get_issue, get_issue_fields, and get_metadata without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('before creating or updating issues') and which fields it covers (severity, status, priority, resolution, reproducibility), and names the downstream tools create_issue and update_issue with how to pass values to each. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issue_fieldsGet Issue FieldsARead-onlyIdempotent
Return all field names that are valid for the "select" parameter of list_issues and get_issue.
Fields are discovered by fetching a sample issue from MantisBT (which reflects the server's active configuration — e.g. whether eta, projection, or profile fields are enabled) and merging the result with fields that MantisBT omits when empty (notes, attachments, relationships, etc.). The result is cached with the same TTL as the metadata cache.
Use this tool before constructing a "select" string to ensure you only request fields that exist on this server.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | Optional project ID to scope the sample issue fetch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses the discovery mechanism (fetching a sample issue reflecting the server's active configuration), the merge step with fields MantisBT omits when empty, and the cache TTL behavior. These are non-obvious operational traits an agent cannot infer from the schema or annotations.
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 sentences, front-loaded with the return value, then mechanism, then imperative usage instruction. No filler; every sentence carries distinct 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?
There is no output schema, but the description states what is returned (field names) and the imperative guidance tells the agent how to use the result. For a one-parameter read-only discovery tool, nothing material is missing.
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% and the single parameter project_id is already documented there as 'scope the sample issue fetch'. The description only alludes to this indirectly ('sample issue fetch') and adds no format, default, or scoping semantics beyond the schema, so 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?
The description names a specific artifact ('all field names valid for the "select" parameter') and the exact sibling tools that consume it (list_issues, get_issue), so an agent can immediately tell what it returns and why it exists. This distinguishes it cleanly from get_issue/list_issues, which fetch actual issue data rather than schema metadata.
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 gives explicit when-to-use guidance: 'Use this tool before constructing a "select" string.' That is a clear trigger condition tied to a concrete workflow. It lacks explicit when-not / negative guidance, but the positive routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issuesGet Multiple IssuesARead-onlyIdempotent
Retrieve multiple MantisBT issues by their numeric IDs in a single MCP call. Requests run in parallel (max 5 concurrent). Missing or inaccessible IDs return null at their array position — the call never fails due to individual missing IDs. Response includes "requested", "found", and "failed" counters for quick validation.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of numeric issue IDs to fetch (1–50). null is returned per ID on 404/403/error instead of failing the whole call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, idempotent, non-destructive); the description adds real operational traits: parallel execution capped at 5 concurrent, per-position null on 404/403/error, and the guarantee that the call never fails on individual misses. This is exactly the extra context an agent needs before selecting it.
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 tightly packed sentences, front-loaded with what the tool does, then execution model, then failure semantics, then response shape. 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 output schema, the description correctly compensates by naming the requested/found/failed counters and the null-per-position convention. Nothing an agent needs to invoke or interpret the result is missing.
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 includes the 1–50 range and null-on-error note, so the baseline is 3. The description reinforces the array-position-to-null correspondence and the concurrency cap, adding a little meaning beyond the raw 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 (retrieve), resource (MantisBT issues), and scope (multiple, by numeric IDs, single call), which cleanly distinguishes it from the singular sibling get_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 phrase 'in a single MCP call' clearly signals batch-fetch context, and the 1–50 ID cap plus per-position null behavior implies when this is preferable over repeated get_issue calls. It stops short of an explicit 'use get_issue for a single ID' routing statement, so no full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mantis_versionGet MantisBT VersionARead-onlyIdempotent
Returns the version of the connected MantisBT installation and optionally compares it against the latest official release on GitHub.
The version is read from the X-Mantis-Version response header sent by every API call. The GitHub comparison requires an outbound HTTPS request to the GitHub API.
| Name | Required | Description | Default |
|---|---|---|---|
| check_latest | No | Whether to fetch the latest release from GitHub and compare (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint and no destructiveness, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the version comes from the X-Mantis-Version response header, and the comparison performs an outbound HTTPS request to the GitHub API — an external-network side effect worth flagging for a nominally read-only 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 with zero filler: the core purpose is front-loaded, then the data source, then the network caveat. Every sentence 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 zero-required-parameter, single-flag tool with no output schema, the description adequately conveys what comes back (a version, optionally with a latest-release comparison) and where it is sourced. Only the exact shape of the comparison result is unspecified, which is a minor gap given the absence of an output schema.
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% and the single check_latest parameter is already fully documented in the schema. The description restates that the comparison is optional and notes the outbound GitHub request, but adds no syntax or default nuance beyond what the schema provides, 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?
The description gives a specific verb and resource ('Returns the version of the connected MantisBT installation') plus its optional comparison behavior. It is clearly distinguishable from the version-shaped sibling get_mcp_version because the resource is explicitly named (MantisBT vs MCP), though the description never names that sibling directly.
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 would call this to discover the connected server's version, and the optional GitHub comparison hints at a 'is my instance current?' use case. There is no explicit when-to-use/when-not guidance and no routing against the similar get_mcp_version sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mcp_versionGet MCP Server VersionBRead-onlyIdempotent
Returns the version of this mantisbt-mcp-server instance.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint, so the agent knows this is a safe, repeatable read. The description adds only the scoping word 'this instance' and nothing about return format or failure behavior; with a zero-parameter, side-effect-free tool there is little else to disclose.
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 wasted words. It is appropriately sized for a trivial accessor, though it could have spent one clause separating itself from get_mantis_version.
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 informational tool with no output schema, the description is adequate; the return value (a server version string) is self-evident. The only real omission is disambiguation from the sibling get_mantis_version.
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 no parameters, so the baseline of 4 applies. There is nothing for the description to clarify beyond what the empty schema already conveys.
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: returns the version of this mantisbt-mcp-server instance. The qualifier 'this mantisbt-mcp-server instance' implicitly distinguishes it from the sibling get_mantis_version, but the differentiation is left for the agent to infer 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?
No explicit guidance on when to use this over get_mantis_version, the closely-named sibling that returns the MantisBT application version. An agent must guess which version it actually wants; the description never routes between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metadataGet Cached MetadataARead-onlyIdempotent
Return a compact summary of cached MantisBT metadata: project count, tag count, and per-project counts of users, versions, and categories.
If the cache does not exist or has expired (default TTL: 24 hours), it will automatically sync first. Use sync_metadata to force a refresh. For full lists use: list_projects (projects), get_project_users / get_project_versions / get_project_categories (per-project data), list_tags (tags).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the caching layer, the 24-hour TTL, and the fact that a read may trigger an implicit sync. It does not describe the exact response shape, but the counts are enumerated.
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?
Front-loaded with the primary purpose in the first sentence, then cache semantics, then the routing list. Every sentence carries information an agent needs; 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 output schema, the description compensates by naming the returned fields (project/tag counts and per-project counts), and it covers the cache-miss behavior and alternatives. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4; there is no parameter syntax the description needs to supply. Nothing in the description misleads about inputs.
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 (returns a compact summary of cached MantisBT metadata) and enumerates exactly what the summary contains: project count, tag count, and per-project user/version/category counts. This clearly distinguishes it from get_metadata_full and the individual list_* 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?
Explicitly states the automatic-sync behavior when the cache is missing/expired (TTL 24h), names sync_metadata as the tool to force a refresh, and routes the agent to the specific alternatives (list_projects, get_project_users/versions/categories, list_tags) for full data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metadata_fullGet Full Cached MetadataARead-onlyIdempotent
Return the complete raw MantisBT metadata cache: all projects with full fields, and per-project lists of users, versions, categories, plus all tags.
If the cache does not exist or has expired (default TTL: 24 hours), it will automatically sync first. Use sync_metadata to force a refresh. For a lightweight overview use get_metadata instead.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds genuinely useful behavioral context beyond that: the caching model, the 24-hour default TTL, and the automatic sync-on-miss/expiry behavior. It stops short of return-format details, but with annotations carrying the safety profile and no output schema, a 4 is warranted.
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 tight sentences, front-loaded with what the tool returns, then caching behavior, then routing to siblings. No redundant restatement of the title or annotations.
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 with no output schema, the description fully covers what is returned, the caching/TTL semantics, and how it relates to sibling tools. Nothing an agent needs to select or invoke it correctly is missing.
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 per the rubric the baseline is 4. There are no parameters to add meaning to, and the description correctly does not invent parameter semantics.
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 (Return) and resource (complete raw MantisBT metadata cache) and enumerates exactly what is included: all projects, per-project users/versions/categories, and all tags. The scope is clearly distinguishable from get_metadata (lightweight) and sync_metadata (force refresh).
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?
Explicitly routes the agent: 'Use sync_metadata to force a refresh. For a lightweight overview use get_metadata instead.' Both alternatives and their selecting conditions are named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_categoriesGet Project CategoriesARead-onlyIdempotent
List all categories available for a MantisBT project.
Note: The MantisBT API returns global (cross-project) categories with a "[All Projects] " prefix. This tool strips that prefix so the returned names can be used directly when creating issues.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Numeric project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real behavioral value by disclosing that global categories carry a '[All Projects] ' prefix which this tool strips. That transformation is non-obvious and affects what the caller receives. It stops short of pagination or ordering behavior, hence 4 not 5.
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, purpose front-loaded, and the second sentence is a genuine note about output normalization rather than filler. No 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?
A simple single-parameter read tool with no output schema and annotations covering the safety profile; the description is nearly complete for that surface. The prefix-stripping note is especially valuable given there is no output schema to reveal it, though ordering/empty-result behavior remains unstated.
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 a single fully-described project_id parameter, so the schema carries the semantics. The description adds no format or constraint detail beyond what the schema provides, making 3 the correct baseline.
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 ('categories') scoped to a MantisBT project. The mention of 'all categories available for a project' clearly distinguishes it from sibling tools like get_project_versions, get_project_users, or get_issue_enums.
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 implied rather than stated: the note that returned names 'can be used directly when creating issues' hints at the create_issue workflow, but there is no explicit when-to-use, when-not, or named alternative. Adequate but with a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_usersGet Project UsersARead-onlyIdempotent
List all users with access to a specific MantisBT project. Returns an array of user objects, each containing id, name (login name), real_name, email, and access_level fields.
Use get_project_users when you need the complete user list for a project — for example, to verify who has access or to build a handler list. For name-based lookup of a single user, prefer find_project_member which supports case-insensitive substring search and is significantly faster on large projects.
Access level IDs: 10=viewer, 25=reporter, 40=updater, 55=developer, 70=manager, 90=administrator.
Prerequisites: obtain project_id from list_projects.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Numeric project ID — use list_projects to discover project IDs | |
| access_level | No | Return only users at or above this access level. Common values: 10=viewer, 25=reporter, 40=updater, 55=developer, 70=manager, 90=administrator. Omit to return all users. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds the return shape and a prerequisite (project_id from list_projects), which is useful context beyond the annotations, though it says nothing about ordering or pagination behavior for large projects.
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?
Front-loaded with purpose and return fields, then usage routing, then the access-level table and prerequisite. Slightly redundant in repeating the access-level IDs that the schema already contains, but every block is scannable and 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?
No output schema exists, so the description correctly lists the returned fields (id, name, real_name, email, access_level) and supplies the prerequisite for obtaining project_id. For a two-parameter read tool this is 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 description coverage is 100%, and both parameters are already fully documented including the access-level ID mapping and the "omit to return all users" behavior. The description restates the access-level IDs rather than adding format or edge-case detail, so it does little 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?
The description opens with a specific verb+resource ("List all users with access to a specific MantisBT project") and immediately enumerates the returned fields. It explicitly distinguishes itself from the sibling find_project_member, so an agent can route correctly 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?
It states exactly when to use this tool (complete user list, verifying access, building a handler list) and names the alternative for single-user lookup, including why that alternative is preferable (case-insensitive substring search, faster on large projects).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_versionsGet Project VersionsARead-onlyIdempotent
List all versions defined for a MantisBT project. Returns an array of version objects, each containing id, name, released (boolean), obsolete (boolean), and timestamp (version date). To create, change, release or delete versions use create_version, update_version, release_version and delete_version.
Use the returned version names directly when creating or updating issues via create_issue and update_issue (version, target_version, fixed_in_version fields).
By default, obsolete and inherited parent-project versions are excluded. Set obsolete=true to include deprecated versions; set inherit=true to also return versions from parent projects.
Prerequisites: obtain project_id from list_projects.
| Name | Required | Description | Default |
|---|---|---|---|
| inherit | No | Include versions inherited from parent projects. Default: false. Set to true for sub-projects that share versions with a parent project. | |
| obsolete | No | Include obsolete (deprecated) versions in the response. Default: false. Set to true to see all versions including those no longer actively used. | |
| project_id | Yes | Numeric project ID — use list_projects to discover project IDs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description goes beyond them by disclosing non-obvious default filtering behavior (obsolete and inherited parent versions excluded unless obsolete=true/inherit=true) and the shape of the returned objects. Lacks pagination/size notes, so not a full 5.
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 paragraphs, front-loaded with the core action and scope before alternatives, flag behavior, and prerequisites. Every sentence carries new information; nothing is redundant 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?
For a read-only list tool with full schema coverage and annotations, this is complete: scope, default filtering, sibling routing, prerequisites, and return fields are all covered. No output schema exists, and the description compensates by naming the returned 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?
Schema description coverage is 100%, so the defaults and meanings of obsolete/inherit/project_id are already documented. The description restates the default-filtering semantics and adds usage context for the returned names, but adds no syntax or format detail 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?
Specific verb+resource ('List all versions defined for a MantisBT project') with the scope made explicit, and it names the create/change/release/delete sibling tools it is not. An agent can distinguish it from get_project_categories or list_projects without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: use create_version/update_version/release_version/delete_version for mutations, and a stated downstream use case (feed version names into create_issue/update_issue fields). It also states prerequisites (project_id from list_projects) and the flag conditions that change scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filtersList Saved FiltersARead-onlyIdempotent
List all saved MantisBT issue filters accessible to the current user. Filter IDs can be used with list_issues.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the user-scoping constraint, which is genuinely useful, but says nothing about ordering, pagination, or what an empty result means. With annotations carrying the safety burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the scope constraint front-loaded and the downstream usage note last. Every sentence 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 parameterless read-only list tool with no output schema and annotations covering safety, the description supplies what matters: what is listed, whose view it reflects, and how the IDs are consumed. Minor omissions (ordering, empty-result behavior) are not blocking.
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 schema has nothing to document and the baseline is 4. The description correctly adds no parameter discussion, which is the right call.
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 saved MantisBT issue filters') plus the scope ('accessible to the current user'). No sibling tool lists filters, so there is no ambiguity about which tool to select.
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 second sentence routes the agent forward: 'Filter IDs can be used with list_issues,' which implicitly tells the agent why to call this tool. It lacks any explicit when-not guidance, but for a no-arg enumeration tool the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_issue_filesList Issue File AttachmentsARead-onlyIdempotent
List all file attachments of a MantisBT issue. Returns an array of attachment objects, each containing id, filename, size in bytes, content_type, and download_url. Returns an empty array if the issue has no attachments.
Use this tool when you need to inspect or enumerate files attached to an issue. To add a new attachment, use upload_file instead. To retrieve full issue details that include attachments alongside other fields, use get_issue instead.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_id | Yes | Numeric issue ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so safety is covered. The description adds genuine behavioral detail the annotations cannot: the exact returned object shape (id, filename, size, content_type, download_url) and the empty-array edge case. It omits auth/permission notes, which is a minor gap.
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?
Front-loaded with the core action, followed by the return contract, then routing guidance. Each sentence carries distinct information with 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 the description compensates by specifying the return structure and empty-case behavior. With the one required parameter documented and annotations covering safety, nothing an agent needs to call this correctly is missing.
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% and the single parameter (issue_id) is already documented in the schema with type and bounds. The description adds no format or constraint detail beyond that, 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 and resource ('List all file attachments of a MantisBT issue') with clear scope. It distinguishes itself from siblings upload_file (adding) and get_issue (full issue details) without the agent needing to open another 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?
Explicitly says when to use it ('inspect or enumerate files attached to an issue') and names two alternatives with the conditions that select them (upload_file to add, get_issue for full details). Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_issuesList IssuesARead-onlyIdempotent
List MantisBT issues with optional filtering. Returns a paginated list of issues. Use the "select" parameter to limit returned fields and reduce response size significantly.
Note: "assigned_to", "reporter_id", "status", and date filters are applied client-side (the MantisBT REST API does not support these as server-side filters). When any of these filters are active the tool automatically fetches multiple pages internally until enough matching results are found (up to 500 issues scanned). The "page" and "page_size" parameters refer to the resulting filtered list.
Tip for date queries: fetching with select="id,updated_at,created_at" plus a date filter is very compact and efficient.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| sort | No | Sort field (e.g. "last_updated", "id") | |
| select | No | Comma-separated list of fields to include in the response (server-side projection). Significantly reduces response size. Example: "id,summary,status,priority,handler,updated_at" | |
| status | No | Filter issues by status name (e.g. "new", "feedback", "acknowledged", "confirmed", "assigned", "resolved", "closed") or use "open" as shorthand for all statuses with id < 80 (i.e. not yet resolved or closed). Applied client-side after fetching — when combined with pagination, a page may contain fewer results than page_size. | |
| direction | No | Sort direction | |
| filter_id | No | Use a saved MantisBT filter ID | |
| page_size | No | Issues per page (default: 50, max: 50) | |
| project_id | No | Filter by project ID | |
| assigned_to | No | Filter by handler/assignee user ID | |
| reporter_id | No | Filter by reporter user ID | |
| created_after | No | ISO-8601 timestamp — only return issues created after this date (exclusive). Example: "2026-03-01T00:00:00Z" | |
| updated_after | No | ISO-8601 timestamp — only return issues updated after this date (exclusive). Example: "2026-03-25T00:00:00Z" | |
| created_before | No | ISO-8601 timestamp — only return issues created before this date (exclusive). Example: "2026-03-15T00:00:00Z" | |
| updated_before | No | ISO-8601 timestamp — only return issues updated before this date (exclusive). Example: "2026-03-28T00:00:00Z" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnly, idempotent, non-destructive), but the description adds genuinely important behavior: four filters are applied client-side, the tool silently auto-fetches up to 500 issues across pages, and client-side filtering can make a page yield fewer than page_size results. That is context the annotations cannot convey.
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?
Front-loaded with purpose and return shape, then the caveat paragraph, then a tip. Each block earns its place, though the note paragraph and tip could be tightened slightly.
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 14-param read/list tool with no output schema, the description covers return shape, pagination semantics, the non-obvious client-side filtering behavior, and an efficiency tip. An agent has what it needs to call this correctly; only the sibling overlap remains unaddressed.
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 baseline is 3, but the description adds meaning beyond the schema: it explains why "select" matters (significant response-size reduction), notes that page/page_size refer to the post-filter list, and pairs select with date filters for efficiency. It does not, however, resolve semantics for sort, filter_id, or client-vs-server filter interactions in detail.
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 MantisBT issues") with scope ("with optional filtering") and return shape ("paginated list"). However, it does not differentiate itself from the sibling get_issues, which appears to be an overlapping listing tool, leaving ambiguity an agent must resolve by opening schemas.
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 gives useful in-tool guidance (use "select" to shrink responses, a date-query tip), but never states when to choose this over get_issue or get_issues, nor any prerequisites. Usage is implied rather than contrasted with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_languagesList Supported LanguagesARead-onlyIdempotent
List all languages supported by the MantisBT installation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the agent knows this is a safe, repeatable read. The description adds nothing beyond that — no pagination, caching, or scope caveats — but for a zero-argument read of an installation-level constant there is little behavior left to disclose.
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 sentence that front-loads the verb and resource with zero filler. Nothing to trim and nothing buried.
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 nested objects, and no output schema, the description covers everything an agent needs to decide and invoke. Only a brief note on the shape of the returned list (e.g., language codes vs. display names) would improve 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 no parameters, so the schema-coverage baseline of 4 applies. Nothing in the description is needed to explain inputs, and nothing is missing.
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 languages supported by the MantisBT installation'), so the agent knows exactly what it returns. It doesn't differentiate from siblings, but no sibling plausibly overlaps with this enumeration, so the omission is low-cost.
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 explicit when-to-use or when-not-to-use statement, and no alternatives are named. However, the purpose is self-selecting: a zero-parameter, read-only enumeration has no plausible competing tool, so usage is implied rather than ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notesList Issue NotesARead-onlyIdempotent
List all notes (comments) attached to a MantisBT issue. Note: get_issue already includes notes in its response — use list_notes only when you need notes without fetching the full issue.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_id | Yes | Numeric issue ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Read-only, idempotent, non-destructive behavior is already covered by annotations, so the description doesn't need to repeat it. It does add a non-obvious data-overlap trait: notes are already embedded in get_issue's response, which prevents a redundant call. It stops short of describing ordering, pagination, or return shape.
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, no filler. The purpose comes first and the routing caveat second, which is the right order for an agent scanning for a tool to call.
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 single-parameter, read-only list tool with no output schema, the description covers what is returned (notes/comments for one issue) and when to reach for it. Output format and ordering remain unspecified, a minor gap for a tool this simple.
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% for the single issue_id parameter ('Numeric issue ID'), so the schema carries the parameter burden. The description adds nothing beyond that, which is the expected baseline when the schema is complete.
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 'notes (comments) attached to a MantisBT issue', with the parenthetical disambiguating the domain term. It also explicitly separates itself from the sibling get_issue, so an agent can pick between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the exact condition that selects this tool ('only when you need notes without fetching the full issue') and names the alternative (get_issue) that already returns the same data. This is a complete when-to-use / when-not-to-use routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList ProjectsARead-onlyIdempotent
List all MantisBT projects accessible to the current API user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint, so the safety profile is covered. The description adds the useful behavioral detail that results are scoped to the current API user's accessibility, but says nothing about ordering, pagination, or output shape.
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 purpose and scope arrive immediately with zero waste.
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-only listing tool whose annotations carry the safety profile, the description covers what an agent needs to select it. A brief note on the returned fields (id/name) would close the remaining gap, but it is minor.
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 schema cannot be richer and the baseline for a no-param tool is 4. The description adds nothing param-related, but there is nothing to add.
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 ('List all MantisBT projects') and adds a meaningful scope qualifier ('accessible to the current API user'). It is clear what the tool does, though it does not explicitly contrast itself with the project-scoped siblings (get_project_users, get_project_versions, get_project_categories).
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 when-to-use, when-not-to-use, or alternative guidance. The description implies the natural use case of enumerating projects (e.g., to obtain IDs consumed by the project-scoped siblings) but never states it, leaving the agent to infer everything.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsList TagsARead-onlyIdempotent
List all tags defined in the MantisBT installation.
The MantisBT REST API exposes a GET /tags endpoint on some installations. If that endpoint is not available, this tool falls back to the local metadata cache populated by sync_metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| page_size | No | Tags per page (default: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds real value beyond that: it discloses a fallback path (GET /tags may not exist) and that results can come from a local metadata cache populated by sync_metadata, which affects freshness/staleness expectations.
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?
Front-loads the purpose, then a single short paragraph on the endpoint/cache duality. No filler, though the second sentence could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with no output schema, the description covers purpose, source-of-truth caveat, and dependency. Combined with the fully documented schema and annotations, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both pagination parameters are fully documented in the schema, including defaults and max, so the description adds nothing here. 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 and resource ('List all tags defined in the MantisBT installation') with clear scope. It is trivially distinguishable from the tag-mutation siblings attach_tags and detach_tag, which use different verbs.
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 implied by the read-only listing purpose, but there is no explicit guidance on when to call this versus get_metadata / sync_metadata, which surface overlapping tag data. The fallback sentence gestures at a relationship with sync_metadata without stating which to prefer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_versionRelease VersionA
Mark a version as released and set its date (default: now). Optionally create a follow-up version in the same step.
The follow-up version is only created when next_version is given; its name is used as-is — no automatic numbering.
Returns { released: } plus either next_version: or next_version_error: . The two steps are separate API calls: if creating the follow-up version fails, the release itself stays in effect and the error is reported in next_version_error.
The version must belong to project_id itself: versions inherited from a parent project can only be changed via the parent's project_id (otherwise MantisBT answers "Version not found"). get_project_versions with inherit=false (the default) lists the project's own versions.
Requires the manage_project_threshold access level in the project (MantisBT default: manager).
| Name | Required | Description | Default |
|---|---|---|---|
| timestamp | No | Release date as ISO 8601 string. Default: now. | |
| project_id | Yes | Numeric ID of the project the version belongs to — use list_projects to discover project IDs | |
| version_id | Yes | Numeric version ID — use get_project_versions to discover version IDs | |
| next_version | No | Name of a follow-up version to create as unreleased placeholder, e.g. "1.2.1". Omit to only release. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it explains the two-step API call semantics, the partial-failure contract (release persists even if the follow-up fails, error surfaced in next_version_error), the required access level (manage_project_threshold, default manager), and the inheritance restriction with the exact MantisBT error. This is rich behavioral disclosure an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and optional behavior, then layers failure semantics, constraints, and permissions in order. It is longer than average but every paragraph carries distinct, actionable information; no restated boilerplate.
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 the description compensates fully by documenting the return shape ({ released } plus next_version/next_version_error). Combined with the failure semantics and permission requirement, an agent has everything needed to invoke and interpret the result.
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 real meaning: next_version's name is used as-is with no automatic numbering, and timestamp defaults to now. These semantics go beyond what the schema states even though the schema already documents the parameters.
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?
Opens with a specific verb+resource: 'Mark a version as released and set its date,' plus the optional follow-up creation. This clearly separates it from sibling tools like update_version, create_version, and delete_version, which all operate on the same resource with different effects.
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?
States the conditional that governs the optional behavior ('The follow-up version is only created when next_version is given') and gives a concrete rule for when this tool is and isn't applicable (inherited versions must go through the parent's project_id). It does not directly contrast against update_version, but the usage context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_monitorRemove Issue MonitorBDestructive
Remove a user from the monitor list of a MantisBT issue. The user will no longer receive email notifications for updates to this issue.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_id | Yes | Numeric issue ID | |
| username | Yes | Username of the monitor to remove |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and idempotentHint=false, so the mutation/irreversibility profile is covered. The description adds the useful consequence that the user stops receiving email notifications, but it does not mention permission/auth requirements or whether the monitor must first exist, so it goes modestly beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the action front-loaded and the consequence second; nothing is redundant. It is appropriately sized for a simple two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation whose safety profile is fully covered by annotations and whose parameters are fully documented in the schema, the description gives enough to call it correctly. Only the absence of sibling routing and permission details keeps it from being fully 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 description coverage is 100% – issue_id and username are both documented in the schema with types and constraints. The description adds no format or edge-case detail about the parameters, 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 (Remove) and resource (user from the monitor list of a MantisBT issue), and the second sentence clarifies the effect. It is clearly distinguishable from read-oriented siblings, though it never names its natural counterpart add_monitor to sharpen the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the tool does but provides no when-to-use or when-not guidance and no reference to the sibling add_monitor that is its direct inverse. An agent must infer the triggering context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_relationshipRemove Issue RelationshipADestructive
Remove a relationship from a MantisBT issue.
Use get_issue first to retrieve the relationship IDs. The relationship_id is the numeric id field of a relationship object in the issue's relationships array (not the type ID).
| Name | Required | Description | Default |
|---|---|---|---|
| issue_id | Yes | The issue ID the relationship belongs to | |
| relationship_id | Yes | The numeric ID of the relationship to remove (from the relationships array in get_issue) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and readOnlyHint=false, so the safety profile is covered. The description adds a workflow requirement (fetch via get_issue first) beyond the structured data, though it doesn't state whether removal is permanent or requires permissions on top of the hints.
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, front-loaded with the operation and followed by the prerequisite and the disambiguation. Nothing extraneous.
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 destructive tool with full schema coverage and annotations carrying the safety profile, the description supplies the missing workflow and ID-source context. Only a note on permanence or required permissions is absent, which is minor here.
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 baseline is 3, but the description adds genuine meaning by clarifying that relationship_id is the numeric id field of a relationship object and explicitly is NOT the type ID — a distinction the schema wording alone does not make.
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 — 'Remove a relationship from a MantisBT issue' — leaving no ambiguity about the operation. The action is clearly the inverse of the add_relationship sibling, and the MantisBT scope is explicit.
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?
'Use get_issue first to retrieve the relationship IDs' gives an explicit prerequisite workflow, which is exactly the guidance an agent needs before invoking. It stops short of naming exclusions or the alternative add_relationship, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_metadataSync Metadata CacheA
Fetch all projects and their associated users, versions, categories, and tags from MantisBT and store them in the local metadata cache.
Tags are fetched via the dedicated GET /tags endpoint when available. On installations where that endpoint is missing (MantisBT < 2.26), tags are collected by scanning all issues across all projects.
This is useful for getting a complete overview of your MantisBT installation. The cache is valid for 24 hours by default (configurable via MANTIS_CACHE_TTL env var). Use this tool to refresh stale data.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as a non-readOnly, non-idempotent write, and the description corroborates by explaining it populates a local cache, that the cache lives 24h by default (MANTIS_CACHE_TTL), and the fallback tag-scanning strategy for MantisBT < 2.26. That is meaningful behavioral context beyond the annotations, though it never states that the cache is overwritten or that concurrent runs may interleave.
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?
Front-loaded with the core action, then layered with the fallback behavior and cache TTL. Every sentence carries information the agent would otherwise have to guess; 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?
For a zero-parameter, no-output-schema mutation tool, the description covers what is fetched, where it goes, how tags are handled, TTL, and when to invoke it. The missing piece is orientation relative to the sibling metadata/list tools, which an agent needs to route correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to document and the baseline is 4. The description correctly adds no phantom parameter behavior.
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: fetch projects/users/versions/categories/tags from MantisBT and write them into the local metadata cache. The read-then-store semantics are unambiguous. It does not differentiate itself from the sibling get_metadata / get_metadata_full tools, which is the only thing keeping it below 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?
"Use this tool to refresh stale data" and "useful for getting a complete overview" give clear positive usage context, and the 24-hour cache validity implies the refresh cadence. No alternatives or when-not-to-use conditions are named, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_issueUpdate IssueA
Update one or more fields of an existing MantisBT issue using a partial PATCH.
The "fields" object accepts any combination of:
summary (string)
description (string)
steps_to_reproduce (string)
additional_information (string)
status: { name: "new"|"feedback"|"acknowledged"|"confirmed"|"assigned"|"resolved"|"closed" }
resolution: { id: 20 } (20 = fixed/resolved)
handler: { id: } or { name: "" }
priority: { name: "" }
severity: { name: "" }
reproducibility: { name: "" }
category: { name: "" }
version: { name: "" } (affected version)
target_version: { name: "" }
fixed_in_version: { name: "" }
view_state: { name: "public"|"private" }
custom_fields: [{field: {id|name}, value: ""}] (only the listed custom fields are changed, others stay untouched; use get_issue_fields to discover fields)
Important: when resolving an issue, always set BOTH status and resolution to avoid leaving resolution as "open".
Use the optional "note" parameter to append a note in the same call (e.g. the reason for a status change) — no separate add_note call needed. For a note without field changes use add_note.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Numeric issue ID to update | |
| note | No | Optional note text appended after a successful update (e.g. reason for a status change). Replaces a separate add_note call. | |
| fields | Yes | Fields to update (partial update — only provided fields are changed; unknown keys are rejected) | |
| dry_run | No | If true, return the patch payload that would be sent without actually updating the issue. Useful for previewing changes before committing them. | |
| note_view_state | No | Visibility of the appended note: "public" (default) or "private". Only used when "note" is set. | public |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark it as non-read-only, non-idempotent, and non-destructive, so the safety floor is covered. The description goes well beyond that: partial-update semantics (only provided fields change, unknown keys rejected), the fact that only listed custom_fields are touched, the status+resolution coupling rule, and behavior of the optional note and dry_run preview. These are non-obvious behavioral traits an agent cannot infer from annotations alone.
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?
Front-loaded with the purpose before the field enumeration, and each section (accepted fields, resolution rule, note handling) carries actionable information. It is long and the field list partly restates the schema's key names, but the added format/enum detail keeps it largely justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers what gets changed, validation behavior (unknown keys rejected), the status/resolution coupling, note appending, and dry_run preview. An agent has everything needed to invoke it correctly without consulting other tools.
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 baseline would be 3, but the description adds real meaning: it enumerates the allowed field names, gives the status enum values, maps resolution id 20 to fixed/resolved, and clarifies custom_fields only modify listed fields. The dry_run and note_view_state semantics are duplicated from the schema, so it lands just below a 5.
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 first sentence states a specific verb (update), resource (MantisBT issue), and mechanism (partial PATCH), and the wording clearly distinguishes it from create_issue, delete_issue, and add_note in the sibling set. An agent can identify the tool 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?
It gives explicit operational rules ("when resolving an issue, always set BOTH status and resolution") and routes to alternatives: use the `note` parameter to avoid a separate add_note call, and use add_note for a note with no field changes. It also points to get_issue_fields for discovery. This is when-to-use and when-to-use-otherwise guidance, not just context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_versionUpdate VersionAIdempotent
Update an existing version of a MantisBT project. Only the fields you pass are changed. Returns the updated version object.
Renaming a version also rewrites the version, target_version and fixed_in_version fields of all issues that reference it (including subprojects if versions are inherited).
Setting released=true does not change the version date — pass timestamp as well, or use release_version, which does both.
The version must belong to project_id itself: versions inherited from a parent project can only be changed via the parent's project_id (otherwise MantisBT answers "Version not found"). get_project_versions with inherit=false (the default) lists the project's own versions.
Requires the manage_project_threshold access level in the project (MantisBT default: manager).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New version name (must be unique within the project) | |
| obsolete | No | Obsolete flag | |
| released | No | Released flag | |
| timestamp | No | Version date as ISO 8601 string, e.g. "2026-09-27" or "2026-09-27T10:00:00+02:00". Determines the order in roadmap and changelog. | |
| project_id | Yes | Numeric ID of the project the version belongs to — use list_projects to discover project IDs | |
| version_id | Yes | Numeric version ID — use get_project_versions to discover version IDs | |
| description | No | New version description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly=false, idempotent=true, destructive=false), and the description adds substantial non-structured behavior: partial-update semantics, the cascading rewrite of version/target_version/fixed_in_version on referencing issues, the released/timestamp coupling, and the exact 'Version not found' error condition for inherited versions.
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 paragraphs, each front-loaded and dedicated to one concern (core semantics, rename side effect, released/timestamp interaction, ownership/access). No filler sentences despite the density of 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?
Even without an output schema, the description tells the agent the call returns the updated version object, and it covers permissions, inheritance constraints, and cross-field traps. Nothing needed to invoke it correctly is missing.
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 parameter docs already carry the baseline. The description adds genuine cross-field semantics the schema cannot express — that name changes cascade to issues and that setting released=true leaves the date untouched unless timestamp is also passed.
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 version of a MantisBT project') and immediately scopes it as a partial update. It also distinguishes itself from the sibling release_version tool by contrasting their behavior.
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?
Gives explicit when/when-not routing: use release_version if you want released=true plus the date set, use get_project_versions with inherit=false to list alterable versions, and call through the parent project_id for inherited versions. It also names the required access level (manage_project_threshold, default manager).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileUpload File AttachmentA
Upload a file as an attachment to a MantisBT issue. Adds the file to the issue without modifying any issue fields or status. Returns the created attachment metadata on success.
Provide exactly one of the two input modes:
file_path (preferred): absolute path to a local file — use this whenever the file exists on disk; the server reads and encodes it automatically; filename is derived from the path. Note: file_path reads from the server's filesystem and is disabled over the HTTP transport unless MANTIS_UPLOAD_DIR is configured — HTTP clients should use content instead.
content: Base64-encoded file content — only use this when the file is not accessible via a path (e.g. in-memory data); filename must be supplied explicitly via the filename parameter
The optional content_type sets the MIME type (e.g. "image/png"); defaults to "application/octet-stream". Use the optional description to annotate the attachment.
Use this tool to attach files such as logs, screenshots, or patches to an existing issue. To list existing attachments, use list_issue_files. To retrieve issue details, use get_issue.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | Fallback: Base64-encoded file content — only use when file_path is not available (mutually exclusive with file_path) | |
| filename | No | File name for the attachment (required when using content; overrides the derived name when using file_path) | |
| issue_id | Yes | Numeric issue ID | |
| file_path | No | Preferred: absolute path to the local file to upload — use this whenever the file exists on disk (mutually exclusive with content) | |
| description | No | Optional description for the attachment | |
| content_type | No | MIME type of the file, e.g. "image/png" (default: "application/octet-stream") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare write/idempotent/destructive hints; the description adds substantially more: it discloses that no issue fields or status are touched, that it returns created attachment metadata, and that file_path reads from the server filesystem and is disabled over HTTP unless MANTIS_UPLOAD_DIR is set. This transport/permission context goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose first, then the two input modes as structured bullets, then optional fields, then routing to siblings. Slightly long, and filename derivation is stated in both the file_path bullet and the filename param, but the length is justified by the mode-selection complexity.
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-param write tool with no output schema, the description covers the critical unknowns: mode selection, defaults, server-vs-HTTP transport limitations, and confirmation that attachment metadata is returned. Nothing an agent needs to call it correctly is missing.
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 still adds real meaning: mutual exclusivity of file_path vs content, when content_type defaults, how filename is derived or overridden, and that content is base64. This maps modes and defaults that the schema only states declaratively.
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?
Starts with a specific verb+resource (upload/attach a file to a MantisBT issue) and immediately scopes behavior, stating it adds the file without modifying issue fields or status. Distinguishes itself from siblings list_issue_files and get_issue explicitly by name.
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?
Gives explicit, actionable selection rules: 'Provide exactly one of the two input modes,' marks file_path as preferred when the file is on disk, and restricts content to in-memory cases. Names the alternatives (list_issue_files, get_issue) for adjacent tasks.
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.
38 tool updates
v1.14.0- Changed
add_monitor2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / issue_id / maximumAdded value: +9007199254740991
- Changed
add_note2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / issue_id / maximumAdded value: +9007199254740991
- Changed
add_relationship3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / issue_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / target_id / maximumAdded value: +9007199254740991
- Changed
attach_tags4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / issue_id / maximumAdded value: +9007199254740991 - removed
Input schema / properties / tags / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / tags / items / properties / id / maximumAdded value: +9007199254740991
- Changed
create_issue6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / custom_fields / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / custom_fields / items / properties / field / additionalPropertiesRemoved value: -false - changed
Input schema / properties / custom_fields / items / requiredPrevious value: -[ - "field" -]New value: +[ + "field", + "value" +] - added
Input schema / properties / handler_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / project_id / maximumAdded value: +9007199254740991
- Added
create_version - Changed
delete_issue2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / id / maximumAdded value: +9007199254740991
- Changed
delete_note3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / issue_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / note_id / maximumAdded value: +9007199254740991
- Added
delete_version - Changed
detach_tag3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / issue_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / tag_id / maximumAdded value: +9007199254740991
- Changed
find_project_member2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / project_id / maximumAdded value: +9007199254740991
- Changed
get_config1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_current_user1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_issue2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / id / maximumAdded value: +9007199254740991
- Changed
get_issue_enums1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_issue_fields2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / project_id / maximumAdded value: +9007199254740991
- Changed
get_issues2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / ids / items / maximumAdded value: +9007199254740991
- Changed
get_mantis_version1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_mcp_version1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_metadata1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_metadata_full1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_project_categories2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / project_id / maximumAdded value: +9007199254740991
- Changed
get_project_users4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / access_level / maximumAdded value: +9007199254740991 - added
Input schema / properties / access_level / minimumAdded value: +-9007199254740991 - added
Input schema / properties / project_id / maximumAdded value: +9007199254740991
- Changed
get_project_versions2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / project_id / maximumAdded value: +9007199254740991
- Changed
list_filters1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_issue_files2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / issue_id / maximumAdded value: +9007199254740991
- Changed
list_issues6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / assigned_to / maximumAdded value: +9007199254740991 - added
Input schema / properties / filter_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - added
Input schema / properties / project_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / reporter_id / maximumAdded value: +9007199254740991
- Changed
list_languages1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_notes2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / issue_id / maximumAdded value: +9007199254740991
- Changed
list_projects1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_tags2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / page / maximumAdded value: +9007199254740991
- Added
release_version - Changed
remove_monitor2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / issue_id / maximumAdded value: +9007199254740991
- Changed
remove_relationship3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / issue_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / relationship_id / maximumAdded value: +9007199254740991
- Changed
sync_metadata1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
update_issue38 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / fields / properties / category / $refRemoved value: -"#/properties/fields/properties/status" - added
Input schema / properties / fields / properties / category / propertiesAdded value: +{ + "id": { + "type": "number" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / fields / properties / category / typeAdded value: +"object" - removed
Input schema / properties / fields / properties / custom_fields / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / fields / properties / custom_fields / items / properties / field / $refRemoved value: -"#/properties/fields/properties/status" - added
Input schema / properties / fields / properties / custom_fields / items / properties / field / propertiesAdded value: +{ + "id": { + "type": "number" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / fields / properties / custom_fields / items / properties / field / typeAdded value: +"object" - changed
Input schema / properties / fields / properties / custom_fields / items / requiredPrevious value: -[ - "field" -]New value: +[ + "field", + "value" +] - removed
Input schema / properties / fields / properties / fixed_in_version / $refRemoved value: -"#/properties/fields/properties/status" - added
Input schema / properties / fields / properties / fixed_in_version / propertiesAdded value: +{ + "id": { + "type": "number" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / fields / properties / fixed_in_version / typeAdded value: +"object" - removed
Input schema / properties / fields / properties / handler / $refRemoved value: -"#/properties/fields/properties/status" - added
Input schema / properties / fields / properties / handler / propertiesAdded value: +{ + "id": { + "type": "number" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / fields / properties / handler / typeAdded value: +"object" - removed
Input schema / properties / fields / properties / priority / $refRemoved value: -"#/properties/fields/properties/status" - added
Input schema / properties / fields / properties / priority / propertiesAdded value: +{ + "id": { + "type": "number" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / fields / properties / priority / typeAdded value: +"object" - removed
Input schema / properties / fields / properties / reproducibility / $refRemoved value: -"#/properties/fields/properties/status" - added
Input schema / properties / fields / properties / reproducibility / propertiesAdded value: +{ + "id": { + "type": "number" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / fields / properties / reproducibility / typeAdded value: +"object" - removed
Input schema / properties / fields / properties / resolution / $refRemoved value: -"#/properties/fields/properties/status" - added
Input schema / properties / fields / properties / resolution / propertiesAdded value: +{ + "id": { + "type": "number" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / fields / properties / resolution / typeAdded value: +"object" - removed
Input schema / properties / fields / properties / severity / $refRemoved value: -"#/properties/fields/properties/status" - added
Input schema / properties / fields / properties / severity / propertiesAdded value: +{ + "id": { + "type": "number" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / fields / properties / severity / typeAdded value: +"object" - removed
Input schema / properties / fields / properties / status / additionalPropertiesRemoved value: -false - removed
Input schema / properties / fields / properties / target_version / $refRemoved value: -"#/properties/fields/properties/status" - added
Input schema / properties / fields / properties / target_version / propertiesAdded value: +{ + "id": { + "type": "number" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / fields / properties / target_version / typeAdded value: +"object" - removed
Input schema / properties / fields / properties / version / $refRemoved value: -"#/properties/fields/properties/status" - added
Input schema / properties / fields / properties / version / propertiesAdded value: +{ + "id": { + "type": "number" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / fields / properties / version / typeAdded value: +"object" - removed
Input schema / properties / fields / properties / view_state / $refRemoved value: -"#/properties/fields/properties/status" - added
Input schema / properties / fields / properties / view_state / propertiesAdded value: +{ + "id": { + "type": "number" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / fields / properties / view_state / typeAdded value: +"object" - added
Input schema / properties / id / maximumAdded value: +9007199254740991
- Added
update_version - Changed
upload_file2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / issue_id / maximumAdded value: +9007199254740991
3 tool updates
v1.10.5- Changed
create_issue1 field changed- added
Input schema / properties / custom_fieldsAdded value: +{ + "description": "Custom field values: [{field: {id|name}, value: \"<string>\"}]. Use get_issue_fields or get_metadata to discover available custom fields per project.", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "additionalProperties": false, + "description": "Custom field reference: { id } or { name }", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "value": { + "description": "Field value as string", + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "type": "array" +}
- Changed
get_issue1 field changed- added
Input schema / properties / selectAdded value: +{ + "description": "Comma-separated list of fields to include in the response (server-side projection, same as list_issues). Significantly reduces response size. Example: \"id,summary,status,notes\"", + "type": "string" +}
- Changed
update_issue3 fields changed- added
Input schema / properties / fields / properties / custom_fieldsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "field": { + "$ref": "#/properties/fields/properties/status", + "description": "Custom field reference: { id } or { name }" + }, + "value": { + "description": "Field value as string", + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / noteAdded value: +{ + "description": "Optional note text appended after a successful update (e.g. reason for a status change). Replaces a separate add_note call.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / note_view_stateAdded value: +{ + "default": "public", + "description": "Visibility of the appended note: \"public\" (default) or \"private\". Only used when \"note\" is set.", + "enum": [ + "public", + "private" + ], + "type": "string" +}
34 tool updates
v1.10.4- Added
add_monitor - Added
add_note - Added
add_relationship - Added
attach_tags - Added
create_issue - Added
delete_issue - Added
delete_note - Added
detach_tag - Added
find_project_member - Added
get_config - Added
get_current_user - Added
get_issue - Added
get_issue_enums - Added
get_issue_fields - Added
get_issues - Added
get_mantis_version - Added
get_mcp_version - Added
get_metadata - Added
get_metadata_full - Added
get_project_categories - Added
get_project_users - Added
get_project_versions - Added
list_filters - Added
list_issue_files - Added
list_issues - Added
list_languages - Added
list_notes - Added
list_projects - Added
list_tags - Added
remove_monitor - Added
remove_relationship - Added
sync_metadata - Added
update_issue - Added
upload_file
34 tool updates
- Removed
add_monitor - Removed
add_note - Removed
add_relationship - Removed
attach_tags - Removed
create_issue - Removed
delete_issue - Removed
delete_note - Removed
detach_tag - Removed
find_project_member - Removed
get_config - Removed
get_current_user - Removed
get_issue - Removed
get_issue_enums - Removed
get_issue_fields - Removed
get_issues - Removed
get_mantis_version - Removed
get_mcp_version - Removed
get_metadata - Removed
get_metadata_full - Removed
get_project_categories - Removed
get_project_users - Removed
get_project_versions - Removed
list_filters - Removed
list_issue_files - Removed
list_issues - Removed
list_languages - Removed
list_notes - Removed
list_projects - Removed
list_tags - Removed
remove_monitor - Removed
remove_relationship - Removed
sync_metadata - Removed
update_issue - Removed
upload_file
6 tool updates
v1.10.3- Changed
add_monitor2 fields changed- changed
Input schema / properties / issue_id / descriptionPrevious value: -"Numeric issue ID"New value: +"Numeric issue ID — use list_issues or get_issue to obtain issue IDs" - changed
Input schema / properties / username / descriptionPrevious value: -"Username of the user to add as monitor"New value: +"MantisBT login name (not the display name) of the user to add as monitor. Use find_project_member or get_project_users to discover valid login names for a project."
- Changed
add_note3 fields changed- changed
Input schema / properties / issue_id / descriptionPrevious value: -"Numeric issue ID"New value: +"Numeric issue ID — use list_issues or get_issue to obtain issue IDs" - changed
Input schema / properties / text / descriptionPrevious value: -"Note text (supports full UTF-8, markdown will be stored as-is)"New value: +"Note text (minimum 1 character). Full UTF-8 including emoji is supported. Markdown is stored as-is." - changed
Input schema / properties / view_state / descriptionPrevious value: -"Visibility of the note (default: public)"New value: +"Visibility of the note: \"public\" (visible to all, default) or \"private\" (visible only to users with sufficient access level)."
- Changed
create_issue15 fields changed- changed
Input schema / properties / additional_information / descriptionPrevious value: -"Additional information about the issue. Plain text or Markdown."New value: +"Additional context or notes about the issue. Plain text or Markdown." - changed
Input schema / properties / category / descriptionPrevious value: -"Category name (use get_project_categories to list available categories)"New value: +"Category name (required). Use get_project_categories to list available categories for the project." - changed
Input schema / properties / description / descriptionPrevious value: -"Detailed issue description. Required — do not create issues without a description. Plain text or Markdown."New value: +"Detailed issue description (required). Do not create issues without a description. Plain text or Markdown." - changed
Input schema / properties / fixed_in_version / descriptionPrevious value: -"Version name in which the issue was fixed (use get_project_versions to list available versions)"New value: +"Version in which the issue was fixed. Use get_project_versions to list available version names." - changed
Input schema / properties / handler / descriptionPrevious value: -"Username (login name) of the person to assign the issue to. Alternative to handler_id — the server resolves the name to a user ID from the project members. Use get_project_users to see available users."New value: +"MantisBT login name of the assignee. The server resolves the name to a user ID from the project member list. Use find_project_member or get_project_users to look up valid login names." - changed
Input schema / properties / handler_id / descriptionPrevious value: -"User ID of the person to assign the issue to"New value: +"Numeric user ID of the assignee. Alternative to the handler field — use one or the other, not both." - changed
Input schema / properties / priority / descriptionPrevious value: -"Priority: canonical English name (none, low, normal, high, urgent, immediate) or localized label. Default: \"normal\". Use get_issue_enums to see all available values."New value: +"Priority level. Canonical English names: none, low, normal, high, urgent, immediate. Default: \"normal\". Use get_issue_enums to see localized labels." - changed
Input schema / properties / project_id / descriptionPrevious value: -"Project ID the issue belongs to"New value: +"Project ID the issue belongs to — use list_projects to discover project IDs" - changed
Input schema / properties / reproducibility / descriptionPrevious value: -"Reproducibility: canonical English name or localized label (always, sometimes, random, have not tried, unable to reproduce, N/A). Use get_issue_enums to see all available values."New value: +"How reliably the issue reproduces. Canonical English names: always, sometimes, random, have not tried, unable to reproduce, N/A. Use get_issue_enums to see localized labels." - changed
Input schema / properties / severity / descriptionPrevious value: -"Severity: canonical English name (feature, trivial, text, tweak, minor, major, crash, block) or localized label. Default: \"minor\". Use get_issue_enums to see all available values."New value: +"Severity level. Canonical English names: feature, trivial, text, tweak, minor, major, crash, block. Default: \"minor\". Use get_issue_enums to see localized labels." - changed
Input schema / properties / steps_to_reproduce / descriptionPrevious value: -"Steps to reproduce the issue. Plain text or Markdown."New value: +"Step-by-step instructions to reproduce the issue. Plain text or Markdown." - changed
Input schema / properties / summary / descriptionPrevious value: -"Issue summary/title"New value: +"Issue summary/title (required)" - changed
Input schema / properties / target_version / descriptionPrevious value: -"Target version name — version in which the issue is planned to be fixed (use get_project_versions to list available versions)"New value: +"Target fix version — version in which the issue is planned to be resolved. Use get_project_versions to list available version names." - changed
Input schema / properties / version / descriptionPrevious value: -"Affected product version name (use get_project_versions to list available versions)"New value: +"Affected product version name. Use get_project_versions to list available version names for the project." - changed
Input schema / properties / view_state / descriptionPrevious value: -"Visibility of the issue: \"public\" (default) or \"private\""New value: +"Visibility of the issue: \"public\" (visible to all, default) or \"private\" (restricted to higher-access users)."
- Changed
delete_note2 fields changed- changed
Input schema / properties / issue_id / descriptionPrevious value: -"Numeric issue ID that owns the note"New value: +"Numeric issue ID that owns the note — use get_issue or list_notes to identify this value" - changed
Input schema / properties / note_id / descriptionPrevious value: -"Numeric note ID to delete"New value: +"Numeric note ID to delete — obtain from get_issue (notes[].id) or list_notes"
- Changed
get_project_users2 fields changed- changed
Input schema / properties / access_level / descriptionPrevious value: -"Minimum access level filter (e.g. 55 = developer, 90 = manager)"New value: +"Return only users at or above this access level. Common values: 10=viewer, 25=reporter, 40=updater, 55=developer, 70=manager, 90=administrator. Omit to return all users." - changed
Input schema / properties / project_id / descriptionPrevious value: -"Numeric project ID"New value: +"Numeric project ID — use list_projects to discover project IDs"
- Changed
get_project_versions3 fields changed- changed
Input schema / properties / inherit / descriptionPrevious value: -"Include versions inherited from parent projects (default: false)"New value: +"Include versions inherited from parent projects. Default: false. Set to true for sub-projects that share versions with a parent project." - changed
Input schema / properties / obsolete / descriptionPrevious value: -"Include obsolete (deprecated) versions (default: false)"New value: +"Include obsolete (deprecated) versions in the response. Default: false. Set to true to see all versions including those no longer actively used." - changed
Input schema / properties / project_id / descriptionPrevious value: -"Numeric project ID"New value: +"Numeric project ID — use list_projects to discover project IDs"
1 tool update
v1.8.1- Changed
upload_file9 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / contentAdded value: +{ + "description": "Base64-encoded file content (mutually exclusive with file_path)", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / content_typeAdded value: +{ + "description": "MIME type of the file, e.g. \"image/png\" (default: \"application/octet-stream\")", + "type": "string" +} - added
Input schema / properties / descriptionAdded value: +{ + "description": "Optional description for the attachment", + "type": "string" +} - added
Input schema / properties / file_pathAdded value: +{ + "description": "Absolute path to the local file to upload (mutually exclusive with content)", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / filenameAdded value: +{ + "description": "File name for the attachment (required when using content; overrides the derived name when using file_path)", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / issue_idAdded value: +{ + "description": "Numeric issue ID", + "exclusiveMinimum": 0, + "type": "integer" +} - added
Input schema / requiredAdded value: +[ + "issue_id" +]
6 tool updates
v1.5.15- Changed
create_issue3 fields changed- changed
Input schema / properties / priority / descriptionPrevious value: -"Priority name — must be a canonical English name: none, low, normal, high, urgent, immediate. Default: \"normal\". Call get_issue_enums to see localized labels."New value: +"Priority: canonical English name (none, low, normal, high, urgent, immediate) or localized label. Default: \"normal\". Use get_issue_enums to see all available values." - changed
Input schema / properties / reproducibility / descriptionPrevious value: -"Reproducibility — must be a canonical English name: always, sometimes, random, have not tried, unable to reproduce, N/A. Call get_issue_enums to see localized labels."New value: +"Reproducibility: canonical English name or localized label (always, sometimes, random, have not tried, unable to reproduce, N/A). Use get_issue_enums to see all available values." - changed
Input schema / properties / severity / descriptionPrevious value: -"Severity name — must be a canonical English name: feature, trivial, text, tweak, minor, major, crash, block. Default: \"minor\". Call get_issue_enums to see localized labels."New value: +"Severity: canonical English name (feature, trivial, text, tweak, minor, major, crash, block) or localized label. Default: \"minor\". Use get_issue_enums to see all available values."
- Added
find_project_member - Added
get_issues - Added
get_metadata_full - Changed
list_issues4 fields changed- added
Input schema / properties / created_afterAdded value: +{ + "description": "ISO-8601 timestamp — only return issues created after this date (exclusive). Example: \"2026-03-01T00:00:00Z\"", + "type": "string" +} - added
Input schema / properties / created_beforeAdded value: +{ + "description": "ISO-8601 timestamp — only return issues created before this date (exclusive). Example: \"2026-03-15T00:00:00Z\"", + "type": "string" +} - added
Input schema / properties / updated_afterAdded value: +{ + "description": "ISO-8601 timestamp — only return issues updated after this date (exclusive). Example: \"2026-03-25T00:00:00Z\"", + "type": "string" +} - added
Input schema / properties / updated_beforeAdded value: +{ + "description": "ISO-8601 timestamp — only return issues updated before this date (exclusive). Example: \"2026-03-28T00:00:00Z\"", + "type": "string" +}
- Changed
update_issue1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "If true, return the patch payload that would be sent without actually updating the issue. Useful for previewing changes before committing them.", + "type": "boolean" +}
1 tool update
v1.5.14- Changed
create_issue7 fields changed- added
Input schema / properties / additional_informationAdded value: +{ + "description": "Additional information about the issue. Plain text or Markdown.", + "type": "string" +} - added
Input schema / properties / fixed_in_versionAdded value: +{ + "description": "Version name in which the issue was fixed (use get_project_versions to list available versions)", + "type": "string" +} - added
Input schema / properties / reproducibilityAdded value: +{ + "description": "Reproducibility — must be a canonical English name: always, sometimes, random, have not tried, unable to reproduce, N/A. Call get_issue_enums to see localized labels.", + "type": "string" +} - added
Input schema / properties / steps_to_reproduceAdded value: +{ + "description": "Steps to reproduce the issue. Plain text or Markdown.", + "type": "string" +} - added
Input schema / properties / target_versionAdded value: +{ + "description": "Target version name — version in which the issue is planned to be fixed (use get_project_versions to list available versions)", + "type": "string" +} - added
Input schema / properties / versionAdded value: +{ + "description": "Affected product version name (use get_project_versions to list available versions)", + "type": "string" +} - added
Input schema / properties / view_stateAdded value: +{ + "description": "Visibility of the issue: \"public\" (default) or \"private\"", + "enum": [ + "public", + "private" + ], + "type": "string" +}
1 tool update
v1.5.13- Changed
create_issue6 fields changed- removed
Input schema / properties / description / defaultRemoved value: -"" - changed
Input schema / properties / description / descriptionPrevious value: -"Detailed issue description"New value: +"Detailed issue description. Required — do not create issues without a description. Plain text or Markdown." - added
Input schema / properties / description / minLengthAdded value: +1 - added
Input schema / properties / priority / defaultAdded value: +"normal" - changed
Input schema / properties / priority / descriptionPrevious value: -"Priority name — must be a canonical English name: none, low, normal, high, urgent, immediate. Call get_issue_enums to see localized labels."New value: +"Priority name — must be a canonical English name: none, low, normal, high, urgent, immediate. Default: \"normal\". Call get_issue_enums to see localized labels." - changed
Input schema / requiredPrevious value: -[ - "summary", - "project_id", - "category" -]New value: +[ + "summary", + "description", + "project_id", + "category" +]
TDQS
Scored across 38 tools
Most tools target a distinct resource+action pair (issues, notes, files, relationships, monitors, versions, tags), and descriptions explicitly clarify boundaries like get_issue vs get_issues vs list_issues, or list_notes vs the notes embedded in get_issue. The only real overlap is among the metadata tools (sync_metadata, get_metadata, get_metadata_full) and get_mcp_version vs get_mantis_version, but these are still reasonably separable.
The set overwhelmingly follows a predictable verb_noun snake_case pattern (get_issue, create_issue, delete_version, add_monitor, remove_relationship, list_projects). Minor deviations exist such as find_project_member (find vs get), release_version, and the singular/plural mismatch between attach_tags and detach_tag, but these do not impede reading.
At 38 tools this is well above the 25-tool threshold where a surface starts to feel heavy for the apparent scope. While MantisBT is a broad domain, several tools are near-duplicates (get_metadata, get_metadata_full, sync_metadata; get_mcp_version vs get_mantis_version) and could be consolidated, so the count is over-scoped.
Coverage is strong: full CRUD for issues, notes, versions, relationships, and monitors, plus files, tags, config, enums, users, and a metadata cache. A few management operations are missing (no create/list-update for projects or categories, no single note fetch/update), but core agent workflows are fully served.
Maintenance
Related MCP Connectors
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
Private persistent memory for Claude, ChatGPT & Gemini via MCP - semantic search, zero-code setup.
- mcpOAuthai.butlerbrain
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol (MCP) service that enables integration with Mantis Bug Tracker, allowing users to query and analyze bug tracking data through natural language commands.826 npm12MIT
- FlicenseNot gradedqualityDmaintenanceEnables interaction with MantisBT bug tracking systems through the REST API. Supports issue management, project access, user information, and note creation with type-safe operations.1-
- AlicenseAqualityDmaintenanceConnect Claude to your Redmine instance to search, browse, create and update issues, manage time entries, and upload/download attachments.51Mozilla Public 2.0
- FlicenseNot gradedqualityDmaintenanceEnables query and management of Zentao bugs, tasks, projects, and iterations directly from MCP-compatible IDEs like Cursor or Claude Desktop.-